公開アクセスを制御する

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

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

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

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

始める前に

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

  1. リソースへのバインディング アクセス ポリシーを無効にするconstraints/iam.managed.disableAccessPolicyBindings)マネージド制約の適用をオフにする必要があります。デフォルトでは、このブール値の制約は新しい組織で有効になっており、IAM v3 API アクセス ポリシーをリソースにバインドできません。詳細については、 ブール値ルールでポリシーを更新するをご覧ください。

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

    • アクセス ポリシーは、 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
  3. まだ有効にしていない場合は、Eventarc API と IAM API を有効にします。

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

    gcloud

    コンソール Google Cloud で Cloud Shell をアクティブにします。

    Cloud Shell をアクティブにする

    コンソールの下部にある Google Cloud Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です 。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています 。セッションが初期化されるまで数秒かかることがあります。

    REST API

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

      Google Cloud CLI をインストールします。

      外部 ID プロバイダ(IdP)を使用している場合は、まず フェデレーション ID を使用して gcloud CLI にログインする必要があります

    詳細については、 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], \
    operation={permissions=[eventarc.googleapis.com/messageBuses.publish]}, \
    conditions={eventarc.googleapis.com={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"
            ],
            "operation": {
              "permissions": ["eventarc.googleapis.com/messageBuses.publish"]
            },
            "conditions": {
              "eventarc.googleapis.com": {
                  "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],operation={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],operation={permissions=[eventarc.googleapis.com/messageBuses.publish]},conditions={eventarc.googleapis.com={expression="message.datacontenttype=='application/json'"}}

REST API

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

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

  • POLICY_DISPLAY_NAME: 省略可。 人が読める形式のアクセス ポリシー名(例: 「Example policy」)。表示名は 最大 63 文字です。
  • POLICY_DESCRIPTION: 省略可。 人が読める形式のアクセス ポリシーの説明(例: 「Example 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"
        ],
        "operation": {
          "permissions": [
            "eventarc.googleapis.com/messageBuses.publish"
          ]
        },
        "conditions": {
          "eventarc.googleapis.com": {
            "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"
    ],
    "operation": {
      "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"
      ],
      "operation": {
        "permissions": [
          "eventarc.googleapis.com/messageBuses.publish"
        ]
      },
      "conditions": {
        "eventarc.googleapis.com": {
          "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 に設定されると、オペレーションは完了し、オペレーションの取得を停止できます。

次のステップ