전달 규칙의 IAM 조건

ID 및 액세스 관리(IAM) 조건을 사용하면 조건부 권한 부여로 IAM 정책을 정의할 수 있습니다. 리소스의 IAM 정책 역할 결합에서 조건을 지정합니다. 조건이 있는 경우 조건 표현식이 true로 평가되어야만 역할이 부여됩니다. 각 조건 표현식은 논리문의 집합이므로 속성을 1개 이상 지정할 수 있습니다. 자세한 내용은 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 외부 HTTP(S) 부하 분산
외부 SSL 프록시 및 TCP 프록시 부하 분산
외부 TCP/UDP 네트워크 부하 분산
INTERNAL 내부 TCP/UDP 부하 분산
INTERNAL_MANAGED 내부 HTTP(S) 부하 분산
INTERNAL_SELF_MANAGED Traffic Director

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

IAM 조건 지정

다른 역할 결합을 구성하는 데 사용한 것과 동일한 setIamPolicy 메서드를 사용하여 조건부 역할 결합을 설정할 수 있습니다. 프로젝트에서 조건부로 결합을 설정하려면 REST API, gcloud 명령줄 도구 또는 Cloud Console의 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()
          "
      }
    }
  ]
}

내부 TCP/UDP 부하 분산기에 대한 주석이 없는 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 인그레스 컨트롤러를 사용하여 새 인그레스 객체를 만들려고 하면 Cloud Load Balancing 인그레스 컨트롤러가 외부 HTTP(S) 부하 분산기를 생성해야 하기 때문에 유사한 오류 메시지가 표시됩니다.

위의 예시에서 GKE 오류 메시지는 kubectl describekubectl get events -w 명령을 사용하여 확인할 수 있습니다.

다음 단계