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の仕組み¶
▼ アーキテクチャ¶
- GoogleCloud以外で認証を実行する。
- 認証が成功する。
- 認証情報をGoogleCloud STSに送信する。
- Workload Identityプールにて、認証情報を検証する。
- 検証が成功し、一時的なトークンを発行する。
- GoogleCloud以外リソースにトークンを送信する。
- GoogleCloud以外リソースは、トークンを使用してGoogleCloudリソースのサービスアカウントに紐づく。
- GoogleCloudリソースのAPIにリクエストを送信できるようになる。
▼ 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ロールを経由して、サービスアカウントを使用できるようになる。
- https://gmor-sys.com/2022/12/09/linking-aws-role-and-gcp-accounts/#outline__2
- https://zenn.dev/ohsawa0515/articles/gcp-workload-identity-federation#amazon-eks%E3%81%8B%E3%82%89%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88
- https://www.softbank.jp/biz/blog/cloud-technology/articles/202206/eks-to-gcp/