コンテンツにスキップ

IAM@Google Cloudリソース

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. プリンシパル

プリンシパルとは

ロールの紐付け対象のこと。


プリンシパルの種類

  • ユーザー
  • サービスアカウント
  • グループ
  • ドメイン
  • KubernetesのServiceAccount


01-02. ユーザー

ユーザーとは

記入中...


認証

▼ 認証情報

記入中...

▼ 手動認証

$ gcloud auth login


01-03. サービスアカウント

サービスアカウントとは

GoogleCloudリソース自体のアカウントである。

サービスアカウントを実際のGoogle Cloudリソースや外部リソース (例:AWSリソース、ログ収集ツールなど) に紐づけるためには、サービスアカウントの認証情報ファイルをこれに持たせる必要がある。


サービスアカウントキー

サービスアカウントの認証情報である。

{
  "type": "service_account",
  "project_id": "<プロジェクトID>",
  "private_key_id": "<プライベート鍵ID>",
  "private_key": "-----BEGIN PRIVATE KEY-----*****-----END PRIVATE KEY-----",
  "client_email": "example@gmail.com",
  "client_id": "<クライアントID>",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/<鍵名>%<プロジェクトID>.iam.gserviceaccount.com",
}


開発者が使用する場合

認証情報ファイルのパスを設定する。

$ gcloud auth login --cred-file="<認証情報ファイルのパス>"

認証情報ファイルの現在のパスは、gcloud infoコマンドで確認する。

$ gcloud info


アプリケーションが使用する場合

▼ ファイルパスを指定しない場合

ファイルパスを指定しない場合、$HOME/.config/gcloud/application_default_credentials.jsonファイルを読み込む。

▼ ファイルパスの指定する場合

認証情報ファイルのパスをGOOGLE_APPLICATION_CREDENTIALS変数に設定する。

サービスアカウントとしてのリソースは、これを自動的に読み込み、サービスアカウントに紐づく。


02. パーミッション (権限)

パーミッションとは

認可スコープのこと。

<サービス>.<Google Cloudリソース>.<動作> (例:compute.instances.create) で表記する。


種類

  • 基本ロール
  • 事前定義ロール
  • カスタムロース


03. ロール

ロールとは

パーミッションのセットのこと。

プリンシパルに紐づける。

ビルトインロール roles/<GoogleCloudリソース名>.<識別名>
プロジェクトレベルのカスタムロース projects/<プロジェクトID>/roles/<識別名>
組織レベルのカスタムロール organizations/<組織ID>/roles/<識別名>


04. ポリシー


05. Workload Identity

Workload Identityとは

GoogleCloud外リソース (例:AWS、Azure、Kubernetesなど) からGoogleCloudリソースのAPIにリクエストを送信する場合に、外部リソースをサービスアカウントに紐づけて、APIにリクエストを送信できるようにする仕組みのこと。

従来は、サービスアカウントのサービスアカウントキーをGoogleCloud外リソースを持たせる仕組みであった。

一方で、Workload Identityではサービスアカウントキーの代わりにトークンを使用する。


Workload Identityの仕組み

▼ アーキテクチャ

  1. GoogleCloud以外で認証を実行する。
  2. 認証が成功する。
  3. 認証情報をGoogleCloud STSに送信する。
  4. Workload Identityプールにて、認証情報を検証する。
  5. 検証が成功し、一時的なトークンを発行する。
  6. GoogleCloud以外リソースにトークンを送信する。
  7. GoogleCloud以外リソースは、トークンを使用してGoogleCloudリソースのサービスアカウントに紐づく。
  8. GoogleCloudリソースのAPIにリクエストを送信できるようになる。

google-cloud_workload-identity

▼ Workload Identityプール

GoogleCloud外リソースのグループを設定する。

例えば、AWS側でOpenTelemetry Collectorを使用する場合、Workload Identityプールはopentelemetry-collectorとする。

▼ プロバイダー

個別のGoogleCloud外リソースを設定する。

外部リソースの種類ごとに単位 (例:AWSであればAWSアカウントごと) が異なる。

例えば、AWS側の本番環境でOpenTelemetry Collectorを使用する場合、Workload Identityプールはprd-opentelemetry-collectorとする。

▼ アクセス許可

プロバイダーに応じた権限を設定する。

例えば、プロバイダーがAWSであればaws_roleでIAMロールの委譲用のARN (arn:aws:sts:<新しいアカウントID>:assumed-role/<IAMロール名>) を設定し、IAMロールにサービスアカウントを紐づけられる。


Google CloudとAWSの連携の場合

AWS IAMロール名とこれに紐づけるサービスアカウント名をWorkload Identityに設定する。

このIAMロールは、通常のIAMロールだけでなく、IRSA用IAMロールでもよい (設定は複雑になるが) 。

AWS IAMロールを経由して、サービスアカウントを使用できるようになる。