Cloud IAM 조건의 개요

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

Cloud IAM 조건에서는 구성된 조건을 충족하는 경우에 한해 리소스 액세스를 ID(구성원)에게 부여하도록 선택할 수 있습니다. 예를 들어 프로덕션 문제가 발생하여 사용자에게 임시 액세스를 구성해야 하는 경우, 혹은 회사 사무실에서 요청하는 직원으로만 리소스 액세스를 제한해야 하는 경우에 이러한 선택이 가능합니다.

조건은 리소스의 Cloud IAM 정책 중 역할 binding에서 지정됩니다. 조건이 있는 경우 조건 표현식이 true로 평가되어야만 액세스 요청이 승인됩니다. 각 조건 표현식은 논리문의 집합으로 정의되므로 검사할 1개 이상의 속성을 지정할 수 있습니다.

조건이 포함된 Cloud IAM 정책

Cloud IAM 정책은 다음 구조를 갖는 하나 이상의 역할 binding으로 구성되어 있습니다.

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

condition 객체는 선택사항이며 각 역할 binding은 0개 또는 1개의 조건을 포함할 수 있습니다. condition 객체가 없는 역할 binding은 조건 검사가 불필요하기 때문에 무조건 부여되는 것으로 간주됩니다. condition 객체의 구조는 다음과 같습니다.

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

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

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

조건을 위한 CEL

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

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

조건과 관련하여 가장 중요한 CEL 기능은 다음과 같습니다.

  • 변수: 조건은 request.time(Timestamp 유형) 또는 resource.name(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 주소 또는 대상 Compute Engine 가상 머신(VM) 인스턴스의 대상 IP 주소)를 기반으로 합니다. 이러한 속성을 사용하는 표현식 예시는 아래에 나와 있습니다.

리소스 속성

리소스 속성을 사용하면 리소스 유형, 리소스 이름, 사용중인 Google Cloud 서비스를 포함하여 액세스 요청의 리소스를 평가하는 조건을 만들 수 있습니다.

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

표현식 예시:

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

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

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

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

이름이 지정된 프리픽스 문자열로 시작하는 리소스에 대해서만 액세스를 허용합니다.

resource.name.startsWith("projects/_/buckets/exampleco-site-assets-")
    

요청 속성

요청 속성을 사용하면 날짜/시간, 예상 URL 호스트/경로(IAP), 대상 IP 주소 및 포트(IAP TCP 터널링) 또는 액세스 수준과 같은 요청에 대한 세부정보를 평가하는 조건을 만들 수 있습니다.

날짜/시간 표현식 예시

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

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 사양을 참조하세요.

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

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

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

대상 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
    

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

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

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

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

전달 규칙 표현식 예시

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

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

부하 분산 스키마에 대한 자세한 내용은 Google Cloud 부하 분산기에서 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")
    

조건부 역할 binding을 허용하는 리소스

다음 유형의 Google Cloud 리소스의 경우 Cloud IAM 정책에 조건을 추가할 수 있습니다.

Google Cloud 서비스 리소스 유형
Cloud Storage Buckets1
Compute Engine
  • 전역 백엔드 서비스
  • 리전 백엔드 서비스
  • 방화벽
  • 이미지
  • 인스턴스 템플릿
  • 인스턴스
  • 리전 영구 디스크
  • 영역 영구 디스크
  • 스냅샷
IAP(Identity-Aware Proxy)
  • 터널
  • 터널 인스턴스
  • 터널 영역
  • 모든 웹 서비스
  • 개별 웹 서비스
  • 웹 서비스 유형
  • 웹 서비스 버전
Cloud Key Management Service(Cloud KMS)
  • Crypto 키
  • Crypto 키 버전
  • 키링
Resource Manager
  • 조직
  • 폴더
  • 프로젝트
1. 조건에서 resource.name속성을 사용하여 Cloud Storage 버킷의 객체를 참조할 수 있습니다. 그러나 버킷 또는 프로젝트와 같은 상위 수준 리소스의 Cloud IAM 정책에 조건을 추가해야 합니다.

다른 유형의 리소스는 Cloud IAM 정책에서 조건을 허용하지 않습니다. 그러나 조직, 폴더, 프로젝트 수준에서 조건부 역할 binding을 추가할 수 있으며 다른 리소스는 리소스 계층 구조를 통해 이러한 역할 binding을 상속합니다.

리소스 유형에 영향을 주는 속성에 대한 자세한 내용은 속성 참조를 참조하세요.

제한 사항

Cloud IAM 조건에는 다음 제한 사항이 적용됩니다.

  • 이 페이지의 지원 서비스 세부정보에 설명된 대로 선택한 Google Cloud 서비스의 역할 binding에만 조건을 추가할 수 있습니다. 또한 대부분의 조건 속성은 제한된 수의 서비스와 호환됩니다.
  • 기본 역할(roles/owner, roles/editor, roles/viewer)은 지원되지 않습니다. 기본 역할을 사용하는 역할 binding에 조건을 설정하려고 시도하면 setIamPolicy 작업이 실패합니다.
  • allUsersallAuthenticatedUsers 값은 조건부 역할 binding에서 지원되지 않는 구성원 유형입니다. 이러한 구성원 유형 중 하나를 지정하면 setIamPolicy 작업이 실패합니다.
  • 각 정책에는 100개 이하의 조건부 역할 binding만 포함하는 것이 좋습니다. 하나의 정책에는 기본적인 스토리지 크기 제한이 있습니다. 여러 조건부 역할 binding을 포함하는 정책은 크기 제한을 초과할 수 있으며 거부될 수 있습니다.
  • 같은 역할의 동일한 구성원(여러 조건)에는 서로 다른 조건부 역할 binding을 조금만 설정하는 것이 좋습니다. 그러나 동일한 역할과 동일한 구성원에는 최대 20개의 역할 binding을 포함할 수 있습니다. 이 수를 초과하면 setIamPolicy 작업이 실패합니다.
  • 하나의 조건 표현식에 최대 12개의 논리 연산자를 사용할 수 있습니다. 이 수를 초과하면 setIamPolicy 작업이 실패합니다.

다음 단계