公開アクセスを制御する

Identity and Access Management(IAM)には、プリンシパルがアクセスできるリソースを制御するために役立ついくつかのポリシータイプがあります。このガイドでは、アクセス ポリシーを使用して、Eventarc Advanced バスにイベント メッセージをパブリッシュする際のアクセスを制御する方法について説明します。

IAM アクセス ポリシーでは、リソースへのアクセスを許可することも拒否することもできます。ただし、IAM 許可ポリシーや IAM 拒否ポリシーとは異なり、アクセス ポリシーでは、イベント メッセージの優先度などの特定のイベント コンテキスト属性に基づいてアクセスを許可または拒否できます。

各アクセス ポリシーは、プリンシパルを識別し、ルールの適用可能性を決定する条件を定義し、きめ細かいアクセス制御を有効にする一連のルールです。たとえば、イベント コンテキスト属性に適用された Common Expression Language(CEL)式の評価に応じて、イベント メッセージのサブセットを Eventarc Advanced バスに公開する権限を許可または拒否できます。

このガイドでは、まずアクセス ポリシーを作成し、次にポリシー バインディングを作成して、そのポリシーを Google Cloud プロジェクトに接続することで、アクセス ポリシーを作成して適用する方法について説明します。

始める前に

アクセス ポリシーを作成して適用する前に、イベント メッセージをパブリッシュできる Eventarc Advanced バスを作成しておく必要があります。

  1. 次の点を考慮してください。

    • アクセス ポリシーは、 Google Cloud プロジェクトに適用またはバインドする必要があります。各アクセス ポリシーは最大 5 つのプロジェクトに適用できます。各プロジェクトには最大 5 つのアクセス ポリシーを適用できます。サポートされているリージョンごとに、Google Cloud プロジェクトごとに 1 つのバスを作成できます。プロジェクトに適用されたアクセス ポリシーは、そのプロジェクト内の Eventarc Advanced バスへのパブリッシュ アクセスを制御します。

    • アクセス ポリシーを使用して、Eventarc Advanced バスへのパブリッシュ アクセスを制御できますが、特定のバスからのメッセージのサブスクリプションへのアクセスを制御することはできません。サポートされている権限は eventarc.messageBuses.publish です。

    • アクセス制御は、イベント ペイロードの内容ではなく、イベント コンテキスト属性のみに基づいて行うことができます。

    • Google ソースから公開され、拒否されたイベント メッセージは破棄されます。プリンシパルがイベント メッセージを直接公開すると、Event published successfully ログメッセージにそのことが示されます。ただし、イベント メッセージがアクセス ポリシーの条件によって拒否された場合は、次のようなエラーが発生します。

      ERROR: (gcloud.beta.eventarc.message-buses.publish)
      PERMISSION_DENIED: Permission 'eventarc.googleapis.com/messageBuses.publish' denied on resource due to an IAM Access Policy.
      This command is authenticated as user@example.com which is the active account specified by the [core/account] property.
      '@type': type.googleapis.com/google.rpc.ErrorInfo
      domain: iam.googleapis.com
      metadata:
      permission: eventarc.googleapis.com/messageBuses.publish
      reason: IAM_PERMISSION_DENIED
  2. まだ有効にしていない場合は、Eventarc API と IAM API を有効にします。

    gcloud services enable eventarc.googleapis.com \
        eventarcpublishing.googleapis.com \
        iam.googleapis.com
  3. 認証を設定します。

    gcloud

    In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

    REST API

    このページの REST API サンプルをローカル開発環境で使用するには、gcloud CLI に指定した認証情報を使用します。

      Install the Google Cloud CLI. After installation, initialize the Google Cloud CLI by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    詳細については、 Google Cloud 認証ドキュメントの REST を使用して認証するをご覧ください。

    必要なロール

    IAM ロールには、 Google Cloud リソースに対して特定のアクションを実行できるようにする一連の権限が含まれています。

    公開アクセスを制御するために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

    ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

    これらの事前定義ロールには、公開アクセスを制御するために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

    必要な権限

    公開アクセスを制御するには、次の権限が必要です。

    • アクセス ポリシーを作成する: iam.accessPolicies.create
    • アクセス ポリシーを適用します。
      • iam.accessPolicies.bind
      • resourcemanager.projects.createPolicyBinding

    カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

    アクセス ポリシーを作成する

    プロジェクトの Eventarc Advanced バスに公開するときにアクセスを制御するアクセス ポリシーを作成します。

    アクセス ポリシーは、Google Cloud CLI を使用するか、IAM v3 API に直接リクエストして作成できます。

    gcloud

    アクセス ポリシーを作成するには、gcloud beta iam access-policies create コマンドを実行します。

    gcloud beta iam access-policies create POLICY_ID \
        --project=POLICY_PROJECT_ID \
        --location=global \
        --details-rules=description="POLICY_DESCRIPTION",effect=EFFECT, \
        principals=[PRINCIPALS],excludedPrincipals=[EXCLUDED_PRINCIPALS], \
        permissions=[eventarc.googleapis.com/messageBuses.publish], \
        activationConditions={eventarc.googleapis.com={celCondition={expression="CEL_EXPRESSION"}}}

    次のように置き換えます。

    • POLICY_ID: アクセス ポリシーの一意の名前(my-access-policy など)。
    • POLICY_PROJECT_ID: ポリシーが作成されるプロジェクトの Google Cloud プロジェクト ID。
    • POLICY_DESCRIPTION: ポリシーの説明(省略可、最大 256 文字)。
    • EFFECT: ルールの効果(ALLOW または DENY)。
    • PRINCIPALS: このルールが適用される ID。識別子の形式は、参照するプリンシパルのタイプによって異なります。詳細については、アクセス ポリシーのプリンシパル タイプをご覧ください。
    • EXCLUDED_PRINCIPALS: principals にリストされている場合でも、ルールの適用から除外される ID。たとえば、Google グループを principals に追加し、そのグループに属する特定のユーザーを除外できます。
    • CEL_EXPRESSION: ルールの適用可能性を判断するために評価される CEL 式(例: message.version != \"v1\")。詳細については、Common Expression Language を使用するをご覧ください。

    次の点にご注意ください。

    • --location フラグはアクセス ポリシーのロケーションを指定し、global にする必要があります。
    • --details-rules フラグは、JSON または YAML で記述できるアクセス ポリシー ファイルのパスを指定できます(例: --details-rules=path_to_file.json)。

      複数のルールを構成するときに、このフラグを繰り返すこともできます。各ルールは個別に評価されます。

      アクセス ポリシーの形式は次のとおりです。

      {
        "displayName": "POLICY_DISPLAY_NAME",
        "details": {
          "rules": [
            {
              "description": "POLICY_DESCRIPTION",
              "effect": "EFFECT",
              "principals": [
                "PRINCIPALS"
              ],
              "excludedPrincipals": [
              "EXCLUDED_PRINCIPALS"
              ],
              "permissions": [
                "eventarc.googleapis.com/messageBuses.publish"
              ],
              "activationConditions": {
                "eventarc.googleapis.com": {
                  "celCondition": {
                    "expression": "CEL_EXPRESSION"
                  }
                }
              }
            }
          ]
        }
      }

    レスポンスには、リクエストを表す長時間実行オペレーションが含まれます。長時間実行オペレーションのステータスを取得する方法については、このドキュメントの長時間実行オペレーションのステータスを確認するをご覧ください。

    次のコマンドは、指定されたプリンシパルがバスにイベント メッセージを公開することを許可し、データ メディアタイプが JSON の場合は公開を拒否するアクセス ポリシーを作成します。

    gcloud beta iam access-policies create my-access-policy \
        --project=my-project-id \
        --location=global \
        --details-rules=description="Allow publishing to bus",effect=ALLOW,principals=[principal://goog/subject/user@example.com],permissions=[eventarc.googleapis.com/messageBuses.publish] \
        --details-rules=description="Deny publishing to bus if media type is JSON",effect=DENY,principals=[principal://goog/subject/user@example.com],permissions=[eventarc.googleapis.com/messageBuses.publish],activationConditions={eventarc.googleapis.com={celCondition={expression="message.datacontenttype=='application/json'"}}}

    REST API

    アクセス ポリシーを作成するには、projects.locations.accessPolicies.create method を使用します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • POLICY_DISPLAY_NAME: 省略可。 人が読める形式のアクセス ポリシー名(例: 「Example policy」)。表示名は 63 文字以内にしてください。
    • POLICY_DESCRIPTION: 省略可。 人が読める形式のアクセス ポリシーの説明(例: 「説明の例」)。説明は 256 文字以内で指定できます。
    • EFFECT: ルールの効果(ALLOW または DENY)。
    • PRINCIPALS: このルールが適用される ID。識別子の形式は、参照するプリンシパルのタイプによって異なります。詳細については、アクセス ポリシーのプリンシパル タイプをご覧ください。
    • EXCLUDED_PRINCIPALS: principals にリストされている場合でも、ルール適用から除外される ID。たとえば、Google グループを principals に追加し、そのグループに属する特定のユーザーを除外できます。
    • CEL_EXPRESSION: ルールの適用範囲を判断するために評価される CEL 式。詳細については、Common Expression Language を使用するをご覧ください。
    • POLICY_PROJECT_ID: ポリシーが作成されるプロジェクトの Google Cloud プロジェクト ID。
    • POLICY_ID: アクセス ポリシーの一意の名前(例: my-access-policy)。

    複数のルールを一覧表示できます。各ルールは個別に評価されます。あるルールが適用されない場合でも、他のルールが適用されることがあります。

    リクエストの本文(JSON):

    {
      "displayName": "POLICY_DISPLAY_NAME",
      "details": {
        "rules": [
          {
            "description": "POLICY_DESCRIPTION",
            "effect": "EFFECT",
            "principals": [
              "PRINCIPALS"
            ],
            "excludedPrincipals": [
            "EXCLUDED_PRINCIPALS"
            ],
            "permissions": [
              "eventarc.googleapis.com/messageBuses.publish"
            ],
            "activationConditions": {
              "eventarc.googleapis.com": {
                "celCondition": {
                  "expression": "CEL_EXPRESSION"
                }
              }
            }
          }
        ]
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを展開します。

    レスポンスには、リクエストを表す長時間実行オペレーションが含まれます。長時間実行オペレーションのステータスを取得する方法については、このドキュメントのこのページの長時間実行オペレーションのステータスを確認するをご覧ください。

    {
      "name": "projects/POLICY_PROJECT_ID/locations/global/operations/OPERATION_ID",
      "metadata": {
        "@type": "type.googleapis.com/google.iam.v3.OperationMetadata",
        "createTime": "2025-01-25T17:17:45.782370139Z",
        "target": "projects/POLICY_PROJECT_ID/locations/global/accessPolicies/POLICY_ID",
        "verb": "create",
        "requestedCancellation": false,
        "apiVersion": "v3"
      },
      "done": false
    }
    

    次のアクセス ポリシーでは、指定されたプリンシパルがバスにイベント メッセージをパブリッシュすることを許可しますが、メッセージの優先度が HIGH の場合はパブリッシュを拒否します。

    cat > request.json << 'EOF'
    {
    "displayName": "Eventarc Advanced access policy",
    "details": {
      "rules": [
      {
        "description": "Allow publishing to bus",
        "effect": "ALLOW",
        "principals": [
          "principal://goog/subject/user@example.com"
        ],
        "permissions": [
          "eventarc.googleapis.com/messageBuses.publish"
        ]
      },
        {
          "description": "Deny publishing to bus if message priority is HIGH",
          "effect": "DENY",
          "principals": [
            "principal://goog/subject/user@example.com"
          ],
          "permissions": [
            "eventarc.googleapis.com/messageBuses.publish"
          ],
          "activationConditions": {
            "eventarc.googleapis.com": {
              "celCondition": {
                "expression": "message.priority == \"HIGH\""
              }
            }
          }
        }
      ]
    }
    }
    EOF
    
    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://iam.googleapis.com/v3/projects/POLICY_PROJECT_ID/locations/global/accessPolicies?access_policy_id=POLICY_ID"

    アクセス ポリシーを適用する

    ポリシー バインディングを作成して、アクセス ポリシーを Google Cloud プロジェクトに適用します。各ポリシー バインディングは、1 つのアクセス ポリシーを 1 つのリソースにバインドします。

    アクセス ポリシーを適用するには、Google Cloud CLI を使用するか、IAM v3 API に直接リクエストします。

    gcloud

    ポリシー バインディングを作成してアクセス ポリシーを適用するには、gcloud beta iam policy-bindings create コマンドを実行します。

    gcloud beta iam policy-bindings create BINDING_ID \
        --project=BINDING_PROJECT_ID \
        --location=global \
        --policy=projects/POLICY_PROJECT_ID/locations/global/accessPolicies/POLICY_ID \
        --target-resource=//cloudresourcemanager.googleapis.com/projects/BINDING_PROJECT_ID

    次のように置き換えます。

    • BINDING_ID: ポリシー バインディングの一意の名前(例: my-access-policy-binding)。
    • BINDING_PROJECT_ID: バインディングが作成されるプロジェクトの Google Cloud プロジェクト ID。これは、Eventarc Advanced バスが作成されるプロジェクトの ID と同じにする必要があります。また、バインディングのターゲットを示します。

    --location フラグは、ポリシー バインディングのロケーションを指定します。これは global である必要があります。

    レスポンスには、リクエストを表す長時間実行オペレーションが含まれます。長時間実行オペレーションのステータスを取得する方法については、このドキュメントの長時間実行オペレーションのステータスを確認するをご覧ください。

    次のコマンドは、指定されたアクセス ポリシーを Google Cloud プロジェクトに適用するポリシー バインディングを作成します。

    gcloud beta iam policy-bindings create my-access-policy-binding \
        --project=my-project-id \
        --location=global \
        --policy=projects/my-project-id/locations/global/accessPolicies/my-access-policy \
        --target-resource=//cloudresourcemanager.googleapis.com/projects/my-project-id

    REST API

    projects.locations.policyBindings.create method を使用して、ポリシー バインディングを作成し、アクセス ポリシーを適用できます。

    リクエストのデータを使用する前に、次のように置き換えます。

    • BINDING_DISPLAY_NAME: 省略可。人が読める形式のポリシー バインディングの名前(例: 「Example binding」)。表示名は 63 文字以内にしてください。
    • BINDING_PROJECT_ID: バインディングが作成されるプロジェクトの Google Cloud プロジェクト ID。これは、Eventarc Advanced バスが作成されるプロジェクトの ID と同じである必要があります。また、バインディングのターゲットを示します。
    • POLICY_PROJECT_ID: ポリシーが作成されるプロジェクトの Google Cloud プロジェクト ID。
    • POLICY_ID: バインドするアクセス ポリシーの名前(例: my-access-policy)。

    リクエストの本文(JSON):

    {
      "display_name": "BINDING_DISPLAY_NAME",
      "target": {"resource": "//cloudresourcemanager.googleapis.com/projects/BINDING_PROJECT_ID"},
      "policy_kind": "ACCESS",
      "policy": "projects/POLICY_PROJECT_ID/locations/global/accessPolicies/POLICY_ID"
    }
    

    リクエストを送信するには、次のいずれかのオプションを展開します。

    レスポンスには、リクエストを表す長時間実行オペレーションが含まれます。長時間実行オペレーションのステータスを取得する方法については、このドキュメントのこのページの長時間実行オペレーションのステータスを確認するをご覧ください。

    {
      "name": "projects/BINDING_PROJECT_ID/locations/global/operations/OPERATION_ID",
      "metadata": {
        "@type": "type.googleapis.com/google.iam.v3.OperationMetadata",
        "createTime": "2025-01-25T17:17:45.782370139Z",
        "target": "projects/BINDING_PROJECT_ID/locations/global/policyBindings/POLICY_ID-binding",
        "verb": "create",
        "requestedCancellation": false,
        "apiVersion": "v3"
      },
      "done": false
    }
    

    長時間実行オペレーションのステータスを確認する

    IAM REST API を使用する場合、アクセス ポリシーまたはバインディングを変更するメソッドで長時間実行オペレーション(LRO)が返されます。長時間実行オペレーションは、リクエストのステータスを追跡し、ポリシーまたはバインディングの変更が完了したかどうかを示します。

    operations.get メソッドは、長時間実行オペレーションのステータスを返します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • OPERATION_NAME: オペレーションの完全な名前。この名前は、元のリクエストに対するレスポンスで受け取ります。

      オペレーション名の形式は次のとおりです。

      projects/PROJECT_ID/locations/global/operations/OPERATION_ID
    • PROJECT_ID: オペレーションが返されるプロジェクトの Google Cloud プロジェクト ID。

    リクエストを送信するには、次のいずれかのオプションを展開します。

    次のような JSON レスポンスが返されます。

    {
      "name": "projects/PROJECT_ID/locations/global/operations/OPERATION_ID",
      "metadata": {
        "@type": "type.googleapis.com/google.iam.v3.OperationMetadata",
        "createTime": "2025-01-28T00:05:12.006289686Z",
        "endTime": "2025-01-28T00:05:12.192141801Z",
        "target": "projects/PROJECT_ID/locations/global/accessPolicies/POLICY_ID",
        "verb": "create",
        "requestedCancellation": false,
        "apiVersion": "v3"
      },
      "done": true,
      "response": {
        ACCESS_POLICY
      }
    }
    

    オペレーションの done フィールドが存在しない場合は、オペレーションを繰り返し取得して、ステータスのモニタリングを続行します。各リクエストの間には、切り捨て型指数バックオフを使用して遅延時間を設けてください。done フィールドが true に設定されている場合、オペレーションは完了しており、オペレーションの取得を停止できます。

    次のステップ