전달 규칙의 IAM 조건

Identity and Access Management(IAM) 조건을 사용하면 조건부 권한 부여로 IAM 정책을 정의할 수 있습니다. 리소스의 IAM 정책 역할 결합에서 조건을 지정합니다. 조건이 있는 경우 조건 표현식이 true로 평가되어야만 역할이 부여됩니다. 각 조건 표현식은 논리문의 집합이므로 속성을 한 개 이상 지정할 수 있습니다. 자세한 내용은 IAM 조건의 속성 참조를 참조하세요.

IAM 조건을 Cloud Load Balancing과 함께 사용하면 부하 분산기 관리자 또는 네트워크 관리자와 같은 사전 정의된 역할이나 커스텀 역할을 조건부로 부여할 수 있습니다.

IAM 조건은 조건 표현식을 지원하여 전달 규칙의 부하 분산 스키마를 확인합니다. 예를 들어 IAM 주 구성원에게 외부 부하 분산기가 아닌 내부 부하 분산기를 만드는 기능을 조건부로 부여할 수 있습니다. IAM 주 구성원이 외부 부하 분산기에 대한 전달 규칙을 만들려고 하면 Google Cloud에서 작업을 거부하고 다음과 같은 오류를 반환합니다.

ERROR: (gcloud.compute.forwarding-rules.create) Could not fetch resource:

 - Required 'compute.forwardingRules.create' permission for
 'projects/PROJECT_ID/regions/REGION/forwardingRules/FORWARDING_RULE_NAME'

Google Cloud 부하 분산기에서 IAM 조건 사용

전달 규칙의 부하 분산 스키마는 전달 규칙을 사용할 수 있는 부하 분산기의 유형을 결정합니다. 즉, 다음 표와 같이 부하 분산 스키마는 부하 분산기 유형에 해당합니다.

부하 분산 스키마 설명
EXTERNAL 기본 애플리케이션 부하 분산기
외부 프록시 네트워크 부하 분산기
외부 패스 스루 네트워크 부하 분산기
EXTERNAL_MANAGED 전역 외부 애플리케이션 부하 분산기
리전별 외부 애플리케이션 부하 분산기
INTERNAL 내부 패스 스루 네트워크 부하 분산기
INTERNAL_MANAGED 리전 내부 애플리케이션 부하 분산기
리전 간 내부 애플리케이션 부하 분산기
리전 내부 프록시 네트워크 부하 분산기
INTERNAL_SELF_MANAGED Traffic Director

부하 분산기를 만들 때 loadBalancingScheme 필드를 지정합니다. IAM 조건에서 loadBalancingScheme 필드를 선택하면 주 구성원에게 특정 유형의 부하 분산기를 만드는 기능을 부여할 수 있습니다.

IAM 조건 지정

다른 역할 결합을 구성하는 데 사용한 것과 동일한 setIamPolicy 메서드를 사용하여 조건부 역할 결합을 설정할 수 있습니다. 프로젝트에서 조건부로 역할 결합을 설정하려면 REST API, gcloud 명령줄 도구 또는 Google Cloud 콘솔에서 IAM 페이지를 사용하면 됩니다.

자세한 내용은 조건부 정책 관리를 참조하세요.

부하 분산을 위한 조건 표현식 예시

IAM 정책에서 사용할 수 있는 다음 조건식은 다음 중 하나가 참인 경우에만 API 요청을 허용합니다.

  • 요청에 전달 규칙 생성이 포함되어 있지 않습니다.
  • 요청은 내부 스키마 중 하나를 가진 전달 규칙을 생성합니다.
!compute.isForwardingRuleCreationOperation() || (
  compute.isForwardingRuleCreationOperation() &&
  compute.matchLoadBalancingSchemes(['INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'])
)

부하 분산 스키마 EXTERNAL은 생략됩니다. 주 구성원이 EXTERNAL 부하 분산 스키마를 사용하여 전달 규칙을 만드는 경우 권한 오류 메시지가 표시됩니다.

정책 예시

이 예시에서는 프로젝트의 IAM 정책에서 IAM 주 구성원 jane@example.com에게 외부 부하 분산기를 만들 수 있는 기능을 제외하고 사전 정의된 부하 분산기 관리자 역할을 부여합니다(EXTERNAL 부하 분산 스키마는 생략되기 때문). jane@example.com에서 내부 부하 분산기를 만들고 부하 분산기를 관리, 수정, 삭제할 수 있습니다.

{
  "bindings": [
    {
      "role": "roles/compute.loadBalancerAdmin",
      "members": ["user:jane@example.com"],
      "condition": {
          "title": "only_internal_lb_schemes",
          "description": "Internal LB creation only permitted",
          "expression": "
             !compute.isForwardingRuleCreationOperation() || (
                compute.isForwardingRuleCreationOperation() &&
                compute.matchLoadBalancingSchemes(['INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'])
             )
          "
      }
    }
  ]
}

특정 유형의 전달 규칙에 GKE 서비스 계정 권한 부여

또한 IAM 조건을 사용하여 GKE 서비스 계정에 대한 액세스를 제한하여 특정 유형의 전달 규칙만 만들 수도 있습니다.

이 JSON 예시에서는 GKE 서비스 계정(service-PROJECT_ID@container-engine-robot.iam.gserviceaccount.com)에 Kubernetes Engine 서비스 에이전트 역할을 부여하는 전체 IAM 정책을 보여줍니다. 이 역할을 통해 서비스 계정은 외부 전달 규칙을 제외하고 부하 분산기 구성요소를 생성, 수정, 삭제할 수 있습니다.

이 조건부 권한 부여를 사용하여 GKE 서비스 계정은 새로운 내부 전달 규칙만 만들 수 있지만 모든 기존 전달 규칙도 관리할 수 있습니다.

{
  "bindings": [
    {
      "role": "roles/container.serviceAgent",
      "members": ["serviceAccount:service-PROJECT_ID@container-engine-robot.iam.gserviceaccount.com"],
      "condition": {
          "title": "only_internal_lb_schemes",
          "description": "Internal LB Creation Only Permitted",
          "expression": "(
                 compute.isForwardingRuleCreationOperation()
                      &&
                  compute.matchLoadBalancingSchemes(['INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'])
              )
                  ||
              !compute.isForwardingRuleCreationOperation()
          "
      }
    }
  ]
}

다른 권한 부여 없이 내부 패스 스루 네트워크 부하 분산기에 대한 주석이 없는 LoadBalancer 유형의 새 GKE 서비스를 만들려고 시도하면 다음과 같은 오류 메시지가 표시됩니다.

Error creating load balancer (will retry): failed to ensure load balancer for
service default/SERVICE-NAME: failed to create forwarding rule for load balancer
(a01d427111c7011ea96e142010a80006(default/SERVICE-NAME)): googleapi: Error 403:
Required 'compute.forwardingRules.create' permission for
'projects/PROJECT_ID/regions/[region]/forwardingRules/FORWARDING_RULE_NAME',
forbidden

또한 다른 권한 부여 없이 새 인그레스 객체를 만들려고 시도하면 Cloud Load Balancing 인그레스 컨트롤러가 외부 애플리케이션 부하 분산기를 만들어야 하기 때문에 유사한 오류 메시지가 표시됩니다.

GKE 오류 메시지는 kubectl describekubectl get events -w 명령어를 사용하여 확인할 수 있습니다.

다음 단계