カスタム オーディエンス(サービス)

このページでは、認証にカスタム オーディエンスを使用する方法について説明します。

Identity and Access Management で保護された Cloud Run サービスを呼び出すクライアントは、受信側のサービスの *.run.app URL に一致するオーディエンス クレームを含む有効な ID トークンを指定する必要があります。この URL を認識していないクライアントの場合は、カスタム オーディエンス値を使用できます。

カスタム オーディエンスについて

Cloud Run には、IAM によるアクセス制御をサポートするための起動元(roles/run.invoker)ロールが用意されています。IAM アクセス制御では、JSON Web Token(JWT)としてパッケージ化された Google 署名付き ID トークンを使用します。これらのトークンの内容は OIDC 標準に準拠しています。

オーディエンス フィールドはトークン内でエンコードされ、トークンを使用できる目的のターゲットを指定します。これにより、あるサービスで使用されるトークンをインターセプトして別のサービスにリプレイするリプレイ攻撃のリスクが軽減されます。

通常、オーディエンスは対象サービスの完全な URL です。Cloud Run のデフォルトでは、run.app で終わるサービスに対して Google が生成した URL です。

ただし、次のようなシナリオでは、Cloud Run サービスがデフォルト生成 URL 以外の URL の背後に存在する場合があります。

  • Google が生成した URL をクライアントが認識しておらず、カスタム ドメインを使用してサービスにアクセスする場合。
  • ロードバランサの背後に複数のサービスをデプロイし、クライアントはリクエストがどのリージョン サービスに到達するか予測できない場合。サービス名が同じでも、Google が生成するサービスの URL はリージョン固有です。

このようなシナリオでは、クライアントによって認識されている追加のターゲットを許可するカスタム オーディエンス値を受け入れるように、サービスを構成する必要があります。Google が生成するデフォルトの URL は、常に許容されるオーディエンス値になります。

カスタム オーディエンスの設定と更新

Cloud Run のカスタム オーディエンスの設定はサービスレベルで行われ、IAM 認可メンバーシップと同様にすべてのサービス リビジョンに適用されます。

文字列リストとしてのオーディエンスの JSON エンコードが 32,768 文字を超えない限り、複数のカスタム オーディエンスを設定できます。

構成を変更すると、新しいリビジョンが作成されます。明示的に更新しない限り、以降のリビジョンでも、この構成が自動的に設定されます。

コマンドライン

サービスにカスタム オーディエンスを設定するには、次のコマンドを使用します。

gcloud run services update SERVICE --add-custom-audiences=AUDIENCE

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

  • SERVICE は、Cloud Run サービスの名前に置き換えます。
  • AUDIENCE は、サポートするカスタム オーディエンスの文字列に置き換えます。例: myservice または https://myservice.example.com

サービスからカスタム オーディエンスをすべて削除するには、次のコマンドを使用します。

gcloud run services update SERVICE --clear-custom-audiences

YAML

既存のサービス構成をダウンロードして表示するには、gcloud run services describe --format export コマンドを使用します。読みやすく整えられた結果が YAML 形式で出力されます。次に、下記の手順でフィールドを変更し、gcloud run services replace コマンドを使用して変更後の YAML ファイルをアップロードします。必ず説明されているとおりにフィールドを変更してください。

  1. 次のコマンドで、構成を表示してダウンロードします。

    gcloud run services describe SERVICE --format export > service.yaml
  2. Service メタデータ(template メタデータではない)に run.googleapis.com/custom-audiences アノテーションを設定します。googledata/devsite/site-cloud/en/run/docs/authenticating/service-to-service.md

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      annotations:
        run.googleapis.com/custom-audiences: '["AUDIENCE"]'
    spec:
      template:
        ...

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

    • SERVICE は、Cloud Run サービスの名前に置き換えます。
    • AUDIENCE は、サポートするカスタム オーディエンスの文字列に置き換えます。例: myservice または https://myservice.example.com

    属性の値は、引用符で囲まれた文字列の JSON 配列です。二重引用符と一重引用符の両方を使用する必要があります。

  3. 次のコマンドを使用して、サービスを新しい構成に置き換えます。

    gcloud run services replace service.yaml

カスタム オーディエンスの確認

  1. サービスを呼び出すための IAM 権限を持つサービス アカウントの ID トークンを取得します。カスタム オーディエンス AUDIENCE を使用している点に注意してください。

    export TOKEN=$(gcloud auth print-identity-token --impersonate-service-account SERVICE_ACCOUNT_EMAIL --audiences='AUDIENCE')

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

    • SERVICE_ACCOUNT_EMAIL は、サービス アカウントのメールアドレスに置き換えます。このメールアドレスの末尾は .iam.gserviceaccount.com です。
    • AUDIENCE は、サービスで設定したカスタム オーディエンス値に置き換えます。
  2. この ID トークンを使用して、サービスのエンドポイントを呼び出します。

    curl -H "Authorization: Bearer ${TOKEN}" ENDPOINT

    ENDPOINT は、サービスに到達するためのエンドポイント(カスタム ドメインや .run.app URL など)に置き換えます。

  3. リクエストが承認され、サービスからのレスポンスが想定どおりであることを確認します。