IAM 조건의 개요

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

조건 및 정책 유형

다음 위치에서 조건을 사용할 수 있습니다.

  • 허용 정책
  • 거부 정책
  • 주 구성원 액세스 경계 정책의 정책 바인딩

다음 섹션에서는 이러한 각 위치에서 조건을 사용하여 속성 기반 액세스 제어를 적용하는 방법을 설명합니다.

허용 정책의 조건

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

조건은 리소스의 허용 정책 중 역할 바인딩에서 지정됩니다. 역할 바인딩에 조건이 있는 경우 조건 표현식 평가 결과가 true인 경우에만 역할의 주 구성원에게 역할이 부여됩니다.

역할 바인딩에 조건을 추가하려면 condition 필드를 정의합니다.

"bindings": [
  {
    "role": "ROLE",
    "members": [
      "MEMBER_1",
      "MEMBER_2"
    ],
    "condition": {
      "title": "TITLE",
      "description": "DESCRIPTION",
      "expression": "EXPRESSION"
    }
  }
]

조건의 필드에 대한 자세한 내용은 이 페이지의 조건 구조를 참고하세요.

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

단일 허용 정책에는 조건부 역할 바인딩을 100개 이상 추가하지 않는 것이 좋습니다. 많은 수의 조건부 역할 바인딩을 사용하는 경우 허용 정책의 전체 크기 한도를 초과할 수 있습니다.

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

거부 정책의 조건

거부 정책의 조건을 사용하여 특정 조건이 충족되는 경우에만 거부 규칙을 적용할 수 있습니다. 예를 들어 주 구성원이 액세스하려는 리소스가 prod 환경의 일부로 태그가 지정된 경우에만 권한을 거부할 수 있습니다.

조건은 리소스의 거부 정책에 있는 거부 규칙에 지정됩니다. 조건이 true로 평가되거나 평가될 수 없으면 거부 규칙이 적용되고 주 구성원은 지정된 권한을 사용할 수 없습니다. 조건이 false로 평가되면 거부 규칙이 적용되지 않으며 주 구성원은 지정된 권한이 있으면 지정된 권한을 사용할 수 있습니다.

거부 규칙에 조건을 추가하려면 denialCondition 필드를 정의합니다.

"rules": [
  {
    "denyRule": {
      "deniedPrincipals": [
        "PRINCIPAL_1",
        "PRINCIPAL_2"
      ],
      "exceptionPrincipals": [
        "EXCEPTION_PRINCIPAL_1",
        "EXCEPTION_PRINCIPAL_2"
      ],
      "deniedPermissions": [
        "DENIED_PERMISSION_1",
        "DENIED_PERMISSION_2"
      ],
      "denialCondition": {
        "title": "TITLE",
        "description": "DESCRIPTION",
        "expression": "EXPRESSION"
      }
    }
  }
]

조건의 필드에 대한 자세한 내용은 이 페이지의 조건 구조를 참고하세요.

거부 정책을 만들고 관리하는 방법은 액세스 거부를 참고하세요.

주 구성원 액세스 경계 정책 바인딩의 조건

주 구성원 액세스 경계 정책의 정책 바인딩에서 조건을 사용하여 주 구성원 액세스 경계 정책이 적용되는 주 구성원 집합을 미세 조정할 수 있습니다. 예를 들어 서비스 계정에 대해서만 정책을 시행하거나 super-admin@example.com을 정책에서 제외할 수 있습니다.

조건은 각 정책 바인딩에 지정됩니다. 정책 바인딩에 조건이 있는 경우 조건 평가 결과가 true인 경우에만 정책 바인딩의 정책이 시행됩니다.

정책 바인딩에 조건을 추가하려면 정책 바인딩에 condition 필드를 정의합니다.

{
  "displayName": "DISPLAY_NAME",
  "target": {
    "principalSet": "PRINCIPAL_SET"
  },
  "policyKind": "PRINCIPAL_ACCESS_BOUNDARY",
  "policy": "PAB_POLICY",
  "condition": {
    "title": "TITLE",
    "description": "DESCRIPTION",
    "expression": "EXPRESSION"
  }
}

조건의 필드에 대한 자세한 내용은 이 페이지의 조건 구조를 참고하세요.

주 구성원 액세스 경계 정책의 정책 바인딩을 만드는 방법을 알아보려면 주 구성원 집합에 주 구성원 액세스 경계 정책 적용을 참고하세요.

조건 구조

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

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

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

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

조건을 위한 CEL

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

IAM 조건에서 속성 데이터에 따라 부울 승인 결정을 내리기 위해 CEL 하위 집합이 사용됩니다. 일반적으로 조건 표현식은 논리 연산자(&&, ||, !)로 결합된 하나 이상의 문으로 구성됩니다.

각 문은 속성 기반 제어 규칙을 나타내며 최종적으로 역할 바인딩, 거부 규칙 또는 정책 바인딩이 적용되는지 여부를 결정합니다.

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')

주 구성원 속성

주 구성원 속성을 사용하면 요청을 실행한 주 구성원을 기반으로 조건을 작성할 수 있습니다. 평가 가능한 속성에는 다음이 포함됩니다.

  • 요청의 주 구성원 유형
  • 요청의 주 구성원 ID

자세한 내용은 조건 속성 참조를 참고하세요.

표현식 예시

주 구성원 액세스 경계 정책 바인딩에서 다음 조건 표현식을 사용하면 바인딩의 정책이 서비스 계정에 대해서만 시행되도록 할 수 있습니다.

principal.type == 'iam.googleapis.com/ServiceAccount'

주 구성원 액세스 경계 정책 바인딩에서 다음 조건 표현식은 바인딩의 정책이 super-admin@example.com에 시행되지 않도록 합니다.

principal.subject != 'super-admin@example.com'

요청 속성

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

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

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

다음 예시에서 조직은 CorpNet 액세스 수준을 정의합니다. 이 액세스 수준은 회사 네트워크에서 트래픽이 들어오고 나가는 IP 주소 범위로 액세스를 제한합니다. 그런 다음 요청이 CorpNet 액세스 수준을 충족하는 경우에만 액세스를 허용하도록 다음 조건 표현식을 역할 바인딩에 추가합니다.

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

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

API 속성 표현식 예시

iam.projects.setIamPolicy 권한이 있는 역할의 역할 바인딩에서 다음 조건 표현식은 사용자가 프로젝트의 결제 계정 관리자(roles/billing.admin) 역할만 부여 및 취소하도록 허용합니다.

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

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

날짜/시간 표현식 예시

역할 바인딩에서 다음 조건 표현식은 2021년 1월 1일 자정까지 액세스를 허용합니다.

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') <= '

역할 바인딩에서 다음 조건 표현식은 독일 베를린의 시간대를 기준으로 2020년 6월에만 액세스를 허용합니다.

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'
  ])
)

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

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

역할 바인딩에서 다음 조건 표현식은 요청의 특정 하위 도메인 또는 URL 경로에 대해서만 액세스를 허용합니다.

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

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

역할 바인딩에서 다음 조건 표현식은 특정 시간에, 리소스 이름 접두사를 매칭하여, 선택한 액세스 수준으로, 특정 리소스 유형에 대해 요청이 이루어질 때 액세스를 허용합니다.

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')

다음 단계