Workload Identity 連携

このドキュメントでは、外部ワークロードのための ID 連携の概要について説明します。ID 連携を使用することで、サービス アカウント キーを使用せずに、Google Cloud リソースへのアクセス権を、オンプレミスまたはマルチクラウドのワークロードに付与できます。

ID 連携は、Amazon Web Services(AWS)や、OpenID Connect(OIDC)をサポートする任意のクラウド プロバイダ(Microsoft Azure など)で使用できます。

ID 連携が必要な理由

従来、Google Cloud の外部で実行されているアプリケーションは、サービス アカウント キーを使用して Google Cloud リソースにアクセスしていました。ただし、サービス アカウント キーにはいくつかの制限事項があります。

  • セキュリティ: サービス アカウント キーには有効期限はありません。攻撃者にキーを盗まれると、キーを削除するまで、攻撃者はそのキーを使用してリソースへアクセスできます。

  • メンテナンス: キーが盗まれるリスクを軽減するため、サービス アカウント キーを定期的にローテーションすることをおすすめしています。これが、メンテナンスの負担となっています。

ID 連携を使用すると、Identity and Access Management(IAM)を使用し、外部 ID に対して、サービス アカウントになりすます機能を含む IAM ロールを付与できます。これにより、サービス アカウント キーを使用する代わりに、有効期間が短いアクセス トークンを使用してリソースに直接アクセスできます。

Workload Identity プール

Workload Identity プールは、外部 ID のコレクション用のコンテナです。

1 つのプロジェクトに複数の Workload Identity プールを含めることができ、各プールは異なるリソースにアクセスできます。これにより、同じプール内で関連する ID をグループ化して、リソースに対するきめ細かいアクセス権をその ID に付与することで、最小権限の原則に従うことができます。

一般に、開発環境、ステージング環境、本番環境など、Google Cloud リソースにアクセスする必要がある Google Cloud 以外の環境ごとに、新しいプールを作成することをおすすめします。

Workload Identity プロバイダ

Workload Identity プロバイダは、Google Cloud と外部 ID プロバイダとの関係を表すエンティティです。プロバイダの例は以下のとおりです。

  • AWS
  • Azure Active Directory
  • オンプレミスの Active Directory
  • Okta
  • Kubernetes クラスタ

Workload Identity 連携は、OAuth 2.0 トークン交換の仕様に従います。外部 ID プロバイダの認証情報をセキュア トークン サービスに提供します。セキュア トークン サービスにより認証情報の ID が確認されると、引き換えに連携トークンが返されます。

属性のマッピング

認証情報には通常、その認証情報によって識別される ID に関する情報(名前、メールアドレス、ユーザー ID など)を提供する属性が含まれます。属性のマッピングでは、外部トークンの属性を Google トークンに適用します。これにより、IAM によって外部プロバイダのトークンが使用され、Google Cloud リソースへのアクセスが承認されます。

AWS の場合は、Google はデフォルトのマッピングを指定します。このマッピングは、最も一般的なシナリオに対応しています。カスタム マッピングを指定することもできます。

OIDC プロバイダの場合は、カスタム マッピングを指定します。マッピングを作成するには、認証情報の属性のリストに関するプロバイダのドキュメントを確認してください。

属性のマッピングでは、Common Expression Language がサポートされているため、外部認証情報に基づいて新しいカスタム属性を作成する、または既存の属性を読みやすくできます。たとえば、次のマッピングでは、Amazon リソース名(ARN)に :instance-profile/Production が含まれているかどうかに基づいて、environment 属性を定義しています。

attribute.environment=assertion.arn.contains(":instance-profile/Production") ? "prod" : "test"

属性条件

属性条件を使用すると、Workload Identity プールを使用して認証できる ID を制限できます。CEL 式を使用すると、リクエストの認証情報の属性を調べて、アクセスを許可するかどうかを判断できます。

属性条件は次のような場合に役立ちます。

  • ワークロードが一般に公開されていて利用可能な ID プロバイダを使用している場合は、選択した ID のみが Workload Identity プールにアクセスできるようアクセスを制限できます。

  • 複数のクラウド プラットフォームで ID プロバイダを使用する場合、別のプラットフォームで使用する予定の認証情報が Google Cloud で使用されないようにできます(逆も同様)。これにより、混乱した使節の問題を回避できます。

次の例では、特定の AWS ロールを持つ ID からのリクエストのみを許可しています。

attribute.aws_role == "role-mapping"

サービス アカウントのなりかわり

トークン交換フローは、限られた数の Google Cloud APIs を呼び出すことができる連携アクセス トークンを返します。Google Cloud APIs にアクセスするには、ワークロードに必要なロールを使用して、サービス アカウントの Workload Identity ユーザーロール(roles/iam.workloadIdentityUser)を外部 ID に付与します。

このロールを使用すると、有効期間が短い OAuth 2.0 アクセス トークンのための連携トークンを交換して、サービス アカウントになりかわり、サービス アカウントがアクセス権を持つすべてのリソースにアクセスできます。

Workload Identity プール内のすべての ID にロールを付与することや、属性に基づいて特定の連携 ID にロールを付与することが可能です。ロールを付与するには、完全修飾リソース名を使用します。

次の表は、ロール付与の一般的なシナリオを表したものです。

シナリオ 形式
単一の ID principal://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/subject/subject-name
グループ内のすべての ID principalSet://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/group/group-name
属性のマッピングを使用して定義された属性を持つすべての ID principalSet://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/attribute.attribute-name/attribute-value
プール内のすべての ID principalSet://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/*

次のステップ