このドキュメントでは、外部ワークロードのための ID 連携の概要について説明します。ID 連携を使用することで、サービス アカウント キーを使用せずに、Google Cloud リソースへのアクセス権を、オンプレミスまたはマルチクラウドのワークロードに付与できます。
ID 連携は、アマゾン ウェブ サービス(AWS)や、OpenID Connect(OIDC)をサポートする Microsoft Azure などの任意の ID プロバイダ(IdP)、SAML 2.0 で使用できます。
ID 連携が必要な理由
Google Cloud の外部で実行されているアプリケーションは、サービス アカウント キーを使用して Google Cloud リソースにアクセスできます。ただし、サービス アカウント キーは強力な認証情報であり、正しく管理しなければセキュリティ上のリスクとなります。
ID 連携を使用すると、Identity and Access Management(IAM)を使用し、外部 ID に対して、サービス アカウントになりすます機能を含む IAM ロールを付与できます。これにより、サービス アカウント キーに関連するメンテナンスとセキュリティの負担がなくなります。
Workload Identity プール
Workload Identity プールは、外部 ID を管理できるエンティティです。
一般に、開発環境、ステージング環境、本番環境など、Google Cloud リソースにアクセスする必要がある Google Cloud 以外の環境ごとに、新しいプールを作成することをおすすめします。
Workload Identity プールのプロバイダ
Workload Identity プールのプロバイダは、Google Cloud と IdP の間の関係を記述するエンティティです。これには次のものが含まれます。
- AWS
- Azure Active Directory
- オンプレミスの Active Directory フェデレーション サービス(AD FS)
- Okta
- Kubernetes クラスタ
Workload Identity 連携は、OAuth 2.0 トークン交換の仕様に従います。IdP からセキュリティ トークン サービスに認証情報を指定します。これにより、認証情報の ID が確認されると、引き換えに連携トークンが返されます。
OIDC プロバイダの JWK
Workload Identity プールのプロバイダは、/.well-known/openid-configuration
ドキュメントの jwks_uri
フィールドで IdP から提供された JSON ウェブキー(JWK)にアクセスできます。OIDC プロバイダからこの情報が提供されていない場合は、プロバイダの作成時に JWK を手動でアップロードできます。
属性のマッピング
外部 ID プロバイダによって発行されたトークンには 1 つ以上の属性が含まれています。一部の ID プロバイダでは、これらの属性をクレームと呼んでいます。
また、Google STS トークンには次の表に示す 1 つ以上の属性が含まれます。
属性 | 説明 |
---|---|
google.subject |
必須。ユーザーの一意の識別子。この属性は、IAM principal:// ロール バインディングで使用され、Cloud Logging のログに表示されます。127 文字以内の一意の値にする必要があります。 |
google.groups |
省略可。ID が属するグループのセット。この属性は、IAM の principalSet:// ロール バインディングでグループのすべてのメンバーにアクセス権を付与する場合に使用されます。 |
attribute.NAME |
省略可。最大で 50 個までのカスタム属性を定義できます。これらの属性を IAM principalSet:// ロール バインディングで使用して、特定の属性を持つすべての ID にアクセス権を付与できます。 |
属性マッピングでは、外部トークンから Google STS トークン属性の値を派生させる方法を定義します。Google STS トークン属性ごとに、次の形式で属性マッピングを定義できます。
TARGET_ATTRIBUTE=SOURCE_EXPRESSION
次のように置き換えます。
TARGET_ATTRIBUTE
は Google STS トークンの属性です。SOURCE_EXPRESSION
は、外部 ID プロバイダによって発行されたトークンから 1 つ以上の属性を変換する Common Expression Language(CEL)の式です。
次のリストは、属性マッピングの例を示しています。
アサーション属性
sub
をgoogle.subject
に割り当てます。google.subject=assertion.sub
複数のアサーション属性を連結します。
google.subject="myprovider::" + assertion.aud + "::" + assertion.sub
GUID 値のアサーション属性
workload_id
を名前にマッピングし、結果をattribute.my_display_name
という名前のカスタム属性に割り当てます。attribute.my_display_name={ "8bb39bdb-1cc5-4447-b7db-a19e920eb111": "Workload1", "55d36609-9bcf-48e0-a366-a3cf19027d2a": "Workload2" }[assertion.workload_id]
CEL の論理演算子と関数を使用して、ID の Amazon リソース名(ARN)に応じて、
attribute.environment
という名前のカスタム属性をprod
またはtest
に設定します。attribute.environment=assertion.arn.contains(":instance-profile/Production") ? "prod" : "test"
extract
関数を使用して、想定されたロールの名前カスタム属性aws_role
に設定します。想定されたロールがない場合は、ID の ARN が設定されます。attribute.aws_role=assertion.arn.contains('assumed-role') ? assertion.arn.extract('{account_arn}assumed-role/') + 'assumed-role/' + assertion.arn.extract('assumed-role/{role_name}/') : assertion.arn
split
関数は、指定された区切り文字値で文字列を分割します。たとえば、メールアドレス属性から値を@
で分割し、最初の文字列を使用してusername
属性を抽出するには、次の属性マッピングを使用します。attribute.username=assertion.email.split("@")[0]
join
関数は、指定された区切り文字の値で文字列のリストを結合します。たとえば、文字列のリストと区切りとして.
を連結してカスタム属性department
に入力するには、次の属性マッピングを使用します。attribute.department=assertion.department.join(".")
AWS の場合は、Google はデフォルトのマッピングを指定します。このマッピングは、最も一般的なシナリオに対応しています。カスタム マッピングを指定することもできます。
OIDC プロバイダの場合は、カスタム マッピングを指定します。マッピングを作成するには、認証情報の属性のリストに関するプロバイダのドキュメントを確認してください。
詳細については、API ドキュメントで attributeMapping
フィールドの説明をご覧ください。
属性条件
属性条件は、アサーション属性とターゲット属性をチェックする CEL 式です。特定の認証情報の属性条件が true
と評価されると、認証情報が受け入れられます。それ以外の場合、認証情報は拒否されます。
属性条件により、Workload Identity プールを使用して認証できる ID を制限できます。
属性条件は、次のようなシナリオで役立ちます。
ワークロードが一般に公開されていて利用可能な ID プロバイダを使用している場合は、選択した ID のみが Workload Identity プールにアクセスできるようアクセスを制限できます。
複数のクラウド プラットフォームで ID プロバイダを使用する場合、別のプラットフォームで使用する予定の認証情報が Google Cloud で使用されないようにできます(逆も同様)。これにより、混乱した使節の問題を回避できます。
Workload Identity プール プロバイダの条件では、assertion
キーワードを使用できます。これは、ID プロバイダによって発行された認証情報を表すマップを参照します。マップの値には、ドット表記を使用してアクセスできます。たとえば、AWS 認証情報には arn
値が含まれ、assertion.arn
としてアクセスできます。さらに、属性条件にはプロバイダの属性マッピングで定義されている任意の属性を使用できます。
次の例では、特定の AWS ロールを持つ ID からのリクエストのみを許可しています。
attribute.aws_role == "ROLE_MAPPING"
詳細については、API ドキュメントで attributeCondition
フィールドの説明をご覧ください。
サービス アカウントの権限借用
トークン交換フローは連携アクセス トークンを返します。このトークンを使用すると、サービス アカウントの権限を借用し、有効期間の短い OAuth 2.0 アクセス トークンを取得できます。有効期間の短いアクセス トークンを使用すると、サービス アカウントがアクセスできる Google Cloud APIs を呼び出すことができます。
サービス アカウントの権限を借用するには、ワークロードに必要なロールを使用して、サービス アカウントの Workload Identity ユーザーロール(roles/iam.workloadIdentityUser
)を外部 ID に付与します。Workload Identity プール内のすべての ID にロールを付与することや、属性に基づいて特定の外部 ID にロールを付与することが可能です。
次の表は、ロール付与の一般的なシナリオを表したものです。
ID | ID の形式 |
---|---|
単一の ID |
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/
|
グループ内のすべての ID |
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/
|
特定の属性値を持つすべての ID |
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/
|
プール内のすべての ID |
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/
|
次のステップ
ID 連携を使用して、AWS からリソースにアクセスするか、Microsoft Azure からリソースにアクセスするか、OIDC プロバイダからリソースにアクセスするか、SAML 2.0 プロバイダからリソースにアクセスする。
Google Cloud CLI または REST API を使用して Workload Identity プールを管理する方法を確認する。