スコープ付き認証情報を使用してエージェントの権限を制限する

オーケストレーター エージェントがリモートの Agent2Agent(A2A)エージェントを呼び出すときに、認証情報のスコープを設定すると、リモート エージェントがそのリクエストに必要な権限のみを受け取るようにできます。Agent Registry でエージェントを検出したら、ユーザーの認証情報を含めるか、Agent Identity Auth Manager を使用して、制限付き OAuth スコープまたは Cloud Storage の認証情報アクセス境界を使用して、スコープ付きトークンを生成できます。

始める前に

A2A 呼び出しのスコープ付き認証情報を使用してエージェントの権限を制限する前に、次の手順を完了します。

  1. Agent Registry を設定する。
  2. 単一プロジェクトの設定の場合は、Agent Registry が有効になっているガバナンス プロジェクトのプロジェクト ID を取得します。複数のプロジェクトに管理境界を構成した場合は、境界全体の検出と登録に管理プロジェクトの ID を使用するか、単一プロジェクトのオペレーションにメンバー プロジェクト ID を指定します。

  3. Cloud Storage トークンを制限する場合は、プロジェクトで Security Token Service API(sts.googleapis.com)を有効にします。

  4. google-auth と requests の Python ライブラリをインストールします。

    pip install --upgrade google-auth requests
    
  5. ローカル開発用にアプリケーションのデフォルト認証情報(ADC)を構成します。それ以外の場合は、サービス アカウントまたは Workload Identity 連携の認証情報構成を接続します。

    gcloud auth application-default login
    

必要なロール

ローカル開発にユーザー アカウントを使用することも、オーケストレーター エージェントにサービス アカウントまたはエージェント プリンシパルを使用して、登録済みエージェントを検出し、ターゲット A2A エージェントを呼び出すこともできます。ユーザー アカウント、サービス アカウント、またはエージェント プリンシパルには、これらのタスクを完了するための適切なロールが必要です。

ユーザー アカウント、サービス アカウント、またはエージェント プリンシパルに、Agent Registry で A2A エージェントを検出し、ターゲット A2A エージェントを呼び出すために必要な権限があることを確認するには、ユーザー アカウント、サービス アカウント、またはエージェント プリンシパルに次の IAM ロールを付与するよう管理者に依頼してください。

  • Agent Registry でエージェントを検出する: Agent Registry が有効になっているガバナンス プロジェクトに対する Agent Registry API 閲覧者(roles/agentregistry.viewer)
  • 実行時にターゲット A2A エージェントを呼び出すには、ターゲット エージェントをホストするサービスのランタイム ロールまたはゲートウェイ ロールが必要です。たとえば、ターゲット エージェントが Cloud Run で実行されている場合、アカウントまたはプリンシパルには Cloud Run 起動元ロール(roles/run.invoker)が必要です。

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

管理者は、カスタムロールや他の事前定義ロールを使用して、必要な権限をユーザー アカウント、サービス アカウント、またはエージェント プリンシパルに付与することもできます。

エージェント間で認証情報が渡される仕組み

A2A クライアントまたはオーケストレーター エージェントがリモート エージェントにメッセージを送信すると、ダウンストリーム サービスはリクエストの認証方法に基づいて権限を確認します。

  • ユーザーに代わって: ユーザーがオーケストレーター エージェントにログインすると、オーケストレーター エージェントは、ユーザーが承認した OAuth 2.0 トークンまたは 認証マネージャーによって管理されているトークンをリモート A2A エージェントに渡します。 Google Cloud API はトークンを検証し、ユーザーの Identity and Access Management(IAM)権限を確認します。これにより、リモート エージェントは、ユーザーがアクセスを許可されていないリソースにアクセスできなくなります。
  • エージェント独自の ID を使用する: オーケストレーター エージェントがログイン ユーザーなしで実行される場合、独自のエージェント ID またはサービス アカウントを使用して認証します。ダウンストリーム サービスは、そのエージェントのプリンシパル(principal://)、一致するプリンシパル セット(principalSet://)、またはそのサービス アカウントに付与されているロールを確認します。
  • 外部またはクロスクラウド ワークロードから:Google Cloud の外部で実行されているエージェントは、Workload Identity 連携を介して外部 ID プロバイダからトークンを交換し、ターゲット A2A エージェント エンドポイントを呼び出す前に連携 Google Cloud アクセス トークンを取得します。

トークンがリモート エージェントに付与する権限を制限するには、サードパーティまたは SaaS A2A エージェントのバインディングを使用して OAuth トークンのスコープを制限します。

認証情報アクセス境界を使用して Cloud Storage トークンを制限し、 Google Cloud アクセス トークンを特定の Cloud Storage バケットまたはオブジェクトに制限することもできます。認証情報アクセス境界は、Cloud Storage(storage.googleapis.com)権限のみをサポートしています。他の Google Cloud API と A2A エージェント呼び出しの場合は、認証マネージャー バインディング、IAM 許可ポリシーと拒否ポリシーを使用した最小権限のエージェント ID、または Agent Gateway を使用してアクセスをスコープします。

これらのオプションがユースケースに適合せず、オーケストレーター エージェントがサービス アカウントで認証する場合は、サービス アカウントの権限借用を使用して、特定のタスクに必要なロールのみを持つ専用のサービス アカウントの有効期間の短いトークンをリクエストすることもできます。

バインディングを使用して OAuth トークンのスコープを設定する

2-legged または 3-legged OAuth 2.0 を使用するサードパーティまたは SaaS A2A エージェントを呼び出す場合は、認証マネージャーで認証プロバイダを作成し、リモート エージェントが必要とする OAuth scopes のみを一覧表示する Binding リソースを Agent Registry にアタッチします。Agent Development Kit(ADK)が get_remote_a2a_agent() を使用してリモート エージェントを取得すると、そのバインディングのスコープに制限されたトークンをリクエストします。設定手順については、ツールとリソースを認証するとバインディングを管理するをご覧ください。

Cloud Storage トークンを制限する

オーケストレーター エージェントが、Cloud Storage データの読み取りまたは書き込みを行うエージェントまたはツールに OAuth 2.0 アクセス トークンを渡す場合は、トークンの権限を減らして、特定のバケットまたはオブジェクト接頭辞へのアクセスのみを許可できます。Security Token Service を使用して、リクエストを送信する前に認証情報アクセス境界を適用します。

import google.auth
from google.auth import downscoped
from google.auth.transport.requests import Request

source_creds, _ = google.auth.default(
    scopes=["https://www.googleapis.com/auth/cloud-platform"]
)

access_boundary_rule = downscoped.AccessBoundaryRule(
    available_resource=(
        "//storage.googleapis.com/projects/_/buckets/BUCKET_NAME"
    ),
    available_permissions=["inRole:roles/storage.objectViewer"],
)
cab = downscoped.CredentialAccessBoundary(rules=[access_boundary_rule])

downscoped_creds = downscoped.Credentials(
    source_credentials=source_creds,
    credential_access_boundary=cab,
)
downscoped_creds.refresh(Request())

BUCKET_NAME は、リモート エージェントが読み取り可能な Cloud Storage バケット名に置き換えます。

追加のセキュリティ管理

認証情報のスコープ設定をネットワーク ポリシーとプロンプト検査と組み合わせることができます。

  • ネットワーク アクセス ポリシー: A2A 呼び出しを Agent Gateway 経由でルーティングし、登録済みの Agent リソースに Identity-Aware Proxy(IAP)統合アクセス ポリシー(UAP)を適用します。
  • プロンプトとレスポンスの検査: Agent Gateway と Model Armor の統合とサービス拡張機能バインディングを構成して、サポートされている A2A プロンプトとレスポンスを検査し、プロンプト インジェクションと機密データの漏洩を検出します。

次のステップ