Cloud IAM 조건의 개요

소개

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

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

조건은 리소스의 Cloud IAM 정책 중 역할 바인딩에서 지정됩니다. 조건이 존재할 때는 조건 표현식이 true로 평가되어야만 역할이 부여됩니다. 각 조건 표현식은 논리문의 집합으로 정의되므로 확인할 속성을 1개 이상 지정할 수 있습니다.

비공개 베타 가입

현재 Cloud IAM 조건을 사용하려면 먼저 비공개 베타 버전에 가입해야 합니다. 가입하려면 이 양식을 작성하세요.

조건이 포함된 Cloud IAM 정책

Cloud IAM 정책은 다음과 같은 구조의 역할 바인딩 1개 이상으로 구성됩니다.

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

condition 객체는 선택 사항이며, 각 역할 바인딩마다 1개까지만 포함됩니다. 하지만 조건 표현식에는 여러 가지 다양한 속성을 평가하는 문이 다수 포함될 수 있습니다. condition 객체가 없는 역할 바인딩은 조건 검사가 불필요하기 때문에 항상 지정된 구성원에게 부여됩니다. condition 객체의 구조는 다음과 같습니다.

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

조건에서 title은 필수이지만 description은 선택 사항입니다. title과 description은 순전히 조건을 찾아 설명할 때 유용한 필드입니다. expression 필드는 Common Expression Language(CEL)의 하위 집합을 사용해 속성 기반 논리 표현식을 정의합니다. 자세한 내용은 CEL 사양언어 정의를 참조하세요.

일반적으로 조건 표현식은 논리 연산자(&&, || 또는 !)를 사용해 조인되는 절 1개 이상으로 구성됩니다. 각 절은 바인딩에 적용되는 속성 기반 제어 규칙을 표현합니다.

조건 속성

이 비공개 베타 출시 버전의 경우 지원되는 조건 속성은 요청된 리소스(예: 유형이나 이름) 또는 요청에 관한 세부정보(예: 타임스탬프, 발신 IP 주소 또는 대상 컴퓨팅 인스턴스의 대상 IP 주소)에 따라 달라집니다. 각 속성 유형에 대한 예시와 설명은 아래에 나와 있습니다.

리소스 속성

리소스 유형, 리소스 이름, 사용되는 GCP 서비스 같은 리소스 속성은 액세스 요청에서 리소스를 기준으로 제한 사항을 제공합니다.

표현식 예제:

아래 예제는 컴퓨팅 인스턴스에 대한 액세스만 허용하고 다른 유형의 리소스에 대한 액세스는 허용하지 않습니다.

resource.type == “google.cloud.compute.Instance”

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

resource.service == “google.cloud.storage”

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

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

요청 속성

요청 속성은 날짜/시간, 예상 URL 호스트/경로(Cloud IAP일 때), 대상 IP 주소 및 포트(Cloud IAP TCP 터널링일 때), 액세스 수준 등 액세스 요청에 대한 세부정보를 기준으로 제한 사항을 제공합니다. 액세스 수준은 조직의 구성에서 파생되며, 현재는 허용되는 출발지 IP 주소에 대한 제한 사항을 감안합니다. 자세한 내용은 Access Context Manager 문서를 참조하세요.

날짜/시간 표현식 예시

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

request.time < timestamp("2019-01-01T07:00:00Z")

아래 예제는 지정된 근무 시간에만 액세스를 허용합니다.

request.time.getHours("Europe/Berlin") >= 9 &&
request.time.getHours("Europe/Berlin") <= 17 &&
request.time.getDayOfWeek("Europe/Berlin") >= 1 &&
request.time.getDayOfWeek("Europe/Berlin") <= 5

아래 예시에서는 지정된 월과 연도일 때만 액세스를 허용합니다.

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

올바른 형식은 다음과 같습니다.

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

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

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

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

아래 예시에서는 요청에서 특정 대상 IP 또는 포트에 한해 액세스를 허용합니다.

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

액세스 수준 표현식 예시

아래 예제는 요청에서 고객이 정의하는 액세스 수준을 충족하는 경우에 한해 액세스를 허용합니다. 이때 기업 네트워크의 IP 범위는 'TrustedCorpNet' 액세스 수준에서 지정합니다.

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

여러 속성이 포함된 표현식 예제

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

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/CorpNetwork2" in request.auth.access_levels)) ||
 resource.type != "google.cloud.compute.Instance")

조건 설정 방법

조건부 역할 바인딩은 다른 역할 바인딩을 구성할 때 사용하는 것과 동일한 setIamPolicy 메소드를 사용해 설정합니다. 예를 들어 프로젝트에 대한 조건부 역할 바인딩을 설정하려면 REST API, gcloud 명령줄 도구 또는 Cloud Console의 IAM 페이지를 사용하면 됩니다.

다음 JSON 예시는 완전한 Cloud IAM 정책의 컨텍스트에서 조건을 나타낸 것입니다.

{
  "bindings": [
    {
      "role": "roles/storage.objectViewer",
      "members": "user:jane@example.com",
      "condition": {
          "title": "expires_end_of_2018",
          "description": "Expires at midnight on 2018-12-31",
          "expression": "request.time < timestamp(\"2019-01-01T00:00:00Z\")"
      }
    }
  ]
}