このページでは、認証にカスタム オーディエンスを使用する方法について説明します。
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
サービスにカスタム オーディエンスを設定するには、次のコマンドを使用します。
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
新しいサービスを作成する場合は、この手順をスキップします。既存のサービスを更新する場合は、その YAML 構成をダウンロードします。
gcloud run services describe SERVICE --format export > service.yaml
template
メタデータではなく Service メタデータにrun.googleapis.com/custom-audiences
アノテーションを設定します。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 配列です。二重引用符と一重引用符の両方を使用する必要があります。
次のコマンドを使用して、サービスを新しい構成に置き換えます。
gcloud run services replace service.yaml
カスタム オーディエンスの確認
サービスを呼び出すための 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 は、サービスで設定したカスタム オーディエンス値に置き換えます。
- SERVICE_ACCOUNT_EMAIL は、サービス アカウントのメールアドレスに置き換えます。このメールアドレスの末尾は
この ID トークンを使用して、サービスのエンドポイントを呼び出します。
curl -H "Authorization: Bearer ${TOKEN}" ENDPOINT
ENDPOINT は、サービスに到達するためのエンドポイント(カスタム ドメインや
.run.app
URL など)に置き換えます。リクエストが承認され、サービスからのレスポンスが想定どおりであることを確認します。