이번 페이지에서는 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
로 평가됩니다. - 논리 연산자: 조건은 기본 표현식 문에서 복잡한 논리 표현식을 빌드하는 데 사용할 수 있는 논리 연산자 3개(
&&
,||
,!
)를 지원합니다. 이러한 논리 연산자를 사용하면 조건 표현식에서 여러 입력 변수를 사용할 수 있습니다. 예를 들어request.time.getFullYear() < 2020 && resource.service == 'compute.googleapis.com'
은 기본 문 2개를 조인하며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')
다음 단계
- 액세스를 관리하는 데 사용할 수 있는 조건 속성에 대한 세부정보 가져오기
- 허용 정책 자세히 알아보기
- 조건부 역할 바인딩을 허용하는 리소스 유형 찾기