IAM 조건의 개요

이번 페이지에서는 Identity and Access Management(IAM)의 조건 기능에 대해서 설명합니다. IAM 조건을 사용하면 Google Cloud 리소스에 조건부 속성 기반 액세스 제어를 정의하고 적용할 수 있습니다.

IAM 조건을 사용하면 지정된 조건이 충족되는 경우에만 주 구성원에 액세스를 부여하도록 선택할 수 있습니다. 예를 들어 프로덕션 문제를 해결하기 위해 사용자에게 임시 액세스를 부여하거나, 회사 사무소에서 요청을 수행하는 직원에게만 액세스를 부여할 수 있습니다.

조건은 리소스의 허용 정책 중 역할 바인딩에서 지정됩니다. 조건이 있으면 조건 표현식이 true로 평가되어야만 액세스 요청이 승인됩니다. 각 조건 표현식은 한 개 이상의 확인할 속성을 지정하는 논리문 집합입니다.

조건이 있는 허용 정책

허용 정책은 다음 구조를 갖는 하나 이상의 역할 바인딩이 포함되어 있습니다.

"bindings": [
  {
    "role": ...,
    "members": ...,
    "condition": ...
  },
  ...
]

condition 객체는 선택사항이며 각 역할 바인딩은 0개 또는 1개의 조건을 포함할 수 있습니다. 역할 바인딩에 condition 객체가 없는 경우 해당 역할 바인딩의 주 구성원은 항상 리소스에 지정된 역할을 갖습니다.

일부 리소스 유형만 역할 바인딩의 조건을 수락합니다. 하지만 조직 또는 프로젝트 수준에서 역할을 부여하여 다른 리소스 유형에 대한 조건부 액세스 권한을 부여할 수 있습니다.

condition 객체의 구조는 다음과 같습니다.

"condition": {
    "title": ...,
    "description": ...,
    "expression": ...
}

조건에서 title은 필수이지만 description은 선택사항입니다. title과 description은 순전히 조건을 찾아 설명할 때 유용한 필드입니다.

expression 필드는 필수 입력란입니다. Common Expression Language(CEL)의 하위 집합을 사용해 속성 기반 논리 표현식을 정의합니다. 조건 표현식에는 여러 문이 포함될 수 있으며, 각 문은 하나의 속성을 평가합니다. 문은 CEL 언어 사양에 따라 논리 연산자를 사용하여 결합됩니다.

조건부 역할 바인딩을 추가, 수정, 삭제하는 방법은 조건부 역할 바인딩 관리를 참조하세요.

조건을 위한 CEL

Common Expression Language(CEL)는 IAM 조건에서 표현식을 지정하는 데 사용되는 표현식 언어입니다. 속성 기반 논리 표현식을 표현하도록 맞춤설정되었습니다. 자세한 내용은 CEL 사양언어 정의를 참조하세요.

IAM 조건에서 속성 데이터에 따라 부울 승인 결정을 내리기 위해 CEL 하위 집합이 사용됩니다. 일반적으로 조건 표현식은 최대 12개의 논리 연산자(&&, ||, !)로 결합된 하나 이상의 문으로 구성됩니다. 각 문은 역할 바인딩에 적용되는 속성 기반 제어 규칙을 나타내며 최종적으로 액세스가 허용되는지 여부를 결정합니다.

IAM 조건에는 다음 CEL 기능이 사용됩니다.

  • 변수: 조건은 request.time(Timestamp 유형) 또는 resource.name(String 유형)과 같이 변수를 사용하여 주어진 속성을 표현합니다. 이러한 변수는 런타임 시 컨텍스트에 따른 값으로 채워집니다.
  • 연산자: Timestamp나 String과 같은 모든 데이터 유형은 논리 표현식을 만드는 데 사용할 수 있는 연산자 집합을 지원합니다. 일반적으로 연산자는 변수에 포함된 값을 resource.service == "compute.googleapis.com"과 같은 리터럴 값과 비교하는 데 사용됩니다. 이 예시에서 resource.service 입력 값이 compute.googleapis.com이면 표현식은 true로 평가됩니다.
  • 함수: 함수는 더 복잡한 작업을 지원하는 데이터 유형의 '복합' 연산자입니다. 조건 표현식에는 지정된 데이터 유형에 사용할 수 있는 사전 정의된 함수가 있습니다. 예를 들어 request.path.startsWith("/finance")는 문자열 프리픽스 일치 함수를 사용하고 request.path 값이 '/finance'와 같이 일치하는 프리픽스를 포함하면 true로 평가됩니다.
  • 논리 연산자: 조건은 간단한 표현식 문에서 복잡한 논리 표현식을 작성하는 데 사용할 수 있는 세 개의 논리 연산자 &&, ||, !를 지원합니다. 이러한 논리 연산자를 사용하면 조건 표현식에서 여러 입력 변수를 사용할 수 있습니다. 예를 들어 request.time.getFullYear() < 2020 && resource.service == "compute.googleapis.com"은 두 개의 간단한 문을 결합하며, true 전체 평가 결과를 도출하려면 두 문이 모두 조건을 충족해야 합니다.

지원되는 변수, 연산자, 함수에 대한 자세한 내용은 속성 참조를 참조하세요.

조건 속성

조건 속성은 해당 유형 또는 이름과 같은 요청된 리소스 또는 타임스탬프, 대상 IP 주소와 같은 요청 세부정보를 기반으로 합니다.

리소스 속성

리소스 속성을 사용하여 액세스 요청에서 리소스를 평가하는 조건을 작성할 수 있습니다. 평가 가능한 속성에는 다음이 포함됩니다.

  • 리소스 유형
  • 리소스 이름
  • 사용 중인 Google Cloud 서비스
  • 리소스에 연결된 태그

전체 리소스 속성 목록은 리소스 속성 참조를 참조하세요.

리소스 속성을 사용하여 리소스 기반 액세스를 구성하는 방법은 리소스 기반 액세스 구성을 참조하세요.

표현식 예시

Compute Engine VM 인스턴스에만 액세스를 허용하고 다른 리소스 유형은 허용하지 않습니다.

resource.type == "compute.googleapis.com/Instance"

아래 예시는 Cloud Storage 리소스에 대한 액세스만 허용하고 다른 서비스의 리소스에 대한 액세스는 허용하지 않습니다.

resource.service == "storage.googleapis.com"

특정 버킷 내의 Cloud Storage 객체에만 액세스를 허용합니다.

resource.type == "storage.googleapis.com/Object" &&
resource.name.startsWith("projects/_/buckets/exampleco-site-assets/")

env: prod 태그가 있는 Google Cloud 리소스에 대한 액세스를 허용합니다.

resource.matchTag('123456789012/env', 'prod')

요청 속성

다음과 같이 요청 속성을 사용하여 요청에 대한 세부정보를 평가하는 조건을 작성할 수 있습니다.

  • 액세스 수준
  • 날짜 및 시간
  • 대상 IP 주소 및 포트(IAP TCP 터널링)
  • 예상 URL 호스트/경로(IAP)

액세스 수준 표현식 예시(IAP만 해당)

다음 예시에서 조직은 CorpNet 액세스 수준을 정의합니다. 이 액세스 수준은 회사 네트워크에서 트래픽이 들어오고 나가는 IP 주소 범위로 액세스를 제한합니다. 요청이 CorpNet 액세스 수준을 충족하는 경우에만 액세스가 허용됩니다.

"accessPolicies/199923665455/accessLevels/CorpNet" in
request.auth.access_levels

조직은 원본 IP 주소, 기기 속성, 시간 등 요청의 속성을 기반으로 액세스 수준을 정의합니다. 자세한 내용은 Access Context Manager 문서를 참조하세요.

API 속성 표현식 예시

사용자가 결제 계정 관리자(roles/billing.admin) 역할만 부여 및 취소하도록 허용합니다.

api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', [])
                 .hasOnly(['roles/billing.admin'])

API 속성을 사용하여 역할 부여를 제한하는 방법에 대한 자세한 내용은 역할 부여 제한 설정을 참조하세요.

날짜/시간 표현식 예시

아래 예시는 지정된 만료 날짜/시간까지 일시적으로 액세스를 허용합니다.

request.time < timestamp("2021-01-01T00:00:00Z")

독일 베를린의 시간대를 기준으로 특정 근무 시간 동안에만 액세스를 허용합니다.

request.time.getHours("Europe/Berlin") >= 9 &&
request.time.getHours("Europe/Berlin") <= 17 &&
// Days of the week range from 0 to 6, where 0 == Sunday and 6 == Saturday.
request.time.getDayOfWeek("Europe/Berlin") >= 1 &&
request.time.getDayOfWeek("Europe/Berlin") <= 5

독일 베를린의 시간대를 기준으로 특정 월과 연도에만 액세스를 허용합니다.

request.time.getFullYear("Europe/Berlin") == 2020
request.time.getMonth("Europe/Berlin") < 6

타임스탬프를 지정하려면 RFC 3339 형식을 사용합니다. 시간대를 지정하려면 IANA 시간대 데이터베이스의 식별자를 사용합니다.

날짜/시간 표현식에 대한 자세한 내용은 CEL 사양을 참조하세요.

날짜/시간 표현식을 사용하여 임시 액세스를 구성하는 방법을 알아보려면 임시 액세스 구성을 참조하세요.

대상 IP/포트 표현식 예시(IAP TCP 터널링)

내부 대상 IP 주소 또는 포트 번호에 대한 액세스를 허용합니다.

destination.ip == "14.0.0.1"
destination.ip != "127.0.0.1"
destination.port == 22
destination.port > 21 && destination.port <= 23

전달 규칙 표현식 예시

요청이 전달 규칙을 만들지 않거나 요청이 내부 Google Cloud 부하 분산기에 대한 전달 규칙을 만드는 경우 주 구성원의 액세스를 허용합니다.

!compute.isForwardingRuleCreationOperation() || (
  compute.isForwardingRuleCreationOperation() &&
  compute.matchLoadBalancingSchemes([
    'INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'
  ])
)

URL 호스트/경로 표현식 예시(IAP)

아래 예시는 요청에서 특정 하위 도메인 또는 URL 경로에 한해서 액세스를 허용합니다.

request.host == "hr.example.com"
request.host.endsWith(".example.com")
request.path == "/admin/payroll.js"
request.path.startsWith("/admin")

부하 분산 스키마에 대한 자세한 내용은 Google Cloud 부하 분산기에서 IAM 조건 사용을 참조하세요.

다양한 유형의 속성이 있는 표현식 예시

아래 예제는 특정 시간에, 일치하는 리소스 이름 프리픽스를 사용해, 원하는 액세스 수준으로, 특정 리소스 유형에 대해 요청이 이루어질 때 액세스를 허용합니다.

request.time > timestamp("2018-08-03T16:00:00-07:00") &&
request.time < timestamp("2018-08-03T16:05:00-07:00") &&
((resource.name.startsWith("projects/project-123/zones/us-east1-b/instances/dev") ||
 (resource.name.startsWith("projects/project-123/zones/us-east1-b/instances/prod") &&
  "accessPolicies/34569256/accessLevels/CorpNet" in request.auth.access_levels)) ||
 resource.type != "compute.googleapis.com/Instance")

다음 단계