コンテンツにスキップ

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 ロールを経由して、サービスアカウントを使用できるようになる。