転送ルールの IAM Conditions

Identity and Access Management(IAM)Conditions を使用すると、IAM ポリシーを条件付きで定義できます。条件は、リソースの IAM ポリシーのロール バインディングで指定します。条件が存在する場合、条件式が true と評価されたときのみロールが付与されます。各条件式は一連の論理ステートメントであり、1 つまたは複数の属性を指定できます。詳細については、IAM Conditions の属性のリファレンスをご覧ください。

Cloud Load Balancing と併用することで、IAM Conditions によってロードバランサ管理者やネットワーク管理者などの事前定義ロール、またはカスタムロールを条件付きで付与しできます。

IAM Conditions では、転送ルールの負荷分散スキームを確認する条件式がサポートされています。たとえば、内部ロードバランサは作成できても外部ロードバランサは作成できないという権限を 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 Conditions の使用

転送ルールの負荷分散スキームにより、転送ルールを使用できるロードバランサの種類が決定します。言い換えれば、負荷分散スキームは、次の表に示すようにロードバランサの種類に対応します。

負荷分散スキーム 説明
EXTERNAL 従来のアプリケーション ロードバランサ
従来のプロキシ ネットワーク ロードバランサ
外部パススルー ネットワーク ロードバランサ
EXTERNAL_MANAGED グローバル外部アプリケーション ロードバランサ
グローバル外部プロキシ ネットワーク ロードバランサ
リージョン外部アプリケーション ロードバランサ
リージョン外部プロキシ ネットワーク ロードバランサ
INTERNAL 内部パススルー ネットワーク ロードバランサ
INTERNAL_MANAGED リージョン内部アプリケーション ロードバランサ
リージョン内部プロキシ ネットワーク ロードバランサ
クロスリージョン内部アプリケーション ロードバランサ
クロスリージョン内部プロキシ ネットワーク ロードバランサ
INTERNAL_SELF_MANAGED Cloud Service Mesh

ロードバランサを作成するときに、loadBalancingScheme フィールドを指定します。IAM 条件の loadBalancingScheme フィールドにチェックを入れることで、特定の種類のロードバランサを作成する権限をプリンシパルに付与できます。

IAM Conditions の指定

他のロール バインディングの構成で使用したものと同じ setIamPolicy メソッドを使用して、条件付きロール バインディングを設定できます。プロジェクトの条件を使用してロール バインディングを設定するには、REST API、gcloud コマンドライン ツール、または Google Cloud コンソールの IAM ページを使用します。

詳細については、条件付きポリシーの管理をご覧ください。

負荷分散の条件式の例

IAM ポリシーで使用できる以下の条件式は、次のいずれかに該当する場合にのみ API リクエストを許可します。

  • リクエストが転送ルールの作成に関与しない場合。
  • リクエストが、内部ロード バランシング スキームのいずれか 1 つを持つ転送ルールを作成する場合。

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

負荷分散スキーム EXTERNAL は省略されます。プリンシパルが EXTERNAL 負荷分散スキームで転送ルールを作成しようとすると、権限のエラー メッセージが表示されます。

ポリシーの例

プロジェクトの IAM ポリシーの次の例では、外部ロードバランサを作成する権限を除く(負荷分散スキーム EXTERNAL が省略されているため)、ロードバランサ管理者の事前定義ロールを IAM プリンシパル jane@example.com に付与しています。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'])
             )
          "
      }
    }
  ]
}

特定の種類の転送ルールに対する GKE サービス アカウント権限の付与

IAM Conditions を使用して GKE サービス アカウントへのアクセスを制限し、特定のタイプの転送ルールのみを作成することもできます。

次の JSON の例では、GKE サービス アカウント(service-PROJECT_ID@container-engine-robot.iam.gserviceaccount.com)に Kubernetes Engine サービス エージェントのロールを付与する完全な IAM ポリシーを示しています。このロールにより、サービス アカウントは外部転送ルール以外のロードバランサ コンポーネントを作成、変更、削除できるようになります。

この条件付き付与を使用する場合、GKE サービス アカウントが作成できるのは新しい内部転送ルールのみですが、既存のすべての転送ルールを管理できるようになります。

{
  "bindings": [
    {
      "role": "roles/container.serviceAgent",
      "members": ["serviceAccount:service-<var>PROJECT_ID</var>@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'])
              )
                  ||
              !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

また、他に付与されている権限がない場合に新しい Ingress オブジェクトを作成しようとすると、同様のエラー メッセージが表示されます。これは、Cloud Load Balancing Ingress コントローラが外部アプリケーション ロードバランサを作成する必要があるためです。

kubectl describe コマンドと kubectl get events -w コマンドを使用して GKE エラー メッセージを確認できます。

次のステップ