サービスアカウントのなりすまし
#Cloud_IAM #GoogleCloud
Impersonate Service Account
サービス アカウントの権限借用の管理  |  Cloud IAM のドキュメント  |  Google Cloud
なりすます側が
roles/iam.serviceAccountUser を持つ
ユーザにこの権限を付けるとプロジェクの全てのサービスアカウントになりすませるので強い
→ actAs が付いているけど iam.serviceAccounts.{getAccessToken,getOpenIdToken} は無いので 外部(クライアントなど)でなりすますことはできない?
サービスアカウント ページの権限タブから個別にアクセスを許可するのが良い
メンバーに 1 つのサービス アカウントの権限の使用を許可する - サービス アカウントの権限借用の管理  |  Cloud IAM のドキュメント  |  Google Cloud
何でもかんでも roles/owner なら細かく制御する意味は薄い
Cloud Build からデプロイする時など、Cloud Build サービスアカウント(サービスエージェント)に Cloud Run や GAE の権限を限定的にあげるとか
roles/iam.serviceAccountTokenCreator
トークンを作れる(iam.serviceAccountUser は作れない)
nouhau/README.md at master · gcpug/nouhau
CLOUDSDK_AUTH_IMPERSONATE_SERVICE_ACCOUNT 環境変数
--impersonate-service-account= オプション
有効期限が短い認証情報を作る
有効期間が短いサービス アカウント認証情報の作成  |  Cloud IAM のドキュメント  |  Google Cloud
roles/iam.serviceAccountTokenCreator を持っていたらできる
roles/owner にトークン作成者は入ってない?
→ 入ってない roles/owner に roles/iam.serviceAccountTokenCreator が入っていないことを確認する
なりすましチェーン
User → SA1 → SA2 と serviceAccountTokenCreator をたどってなりすませる
google-auth-library の delegates に渡せば暗黙にチェーンしてくれる
SA1 の iam.serviceAccounts.implicitDelegation 権限を User がもっている必要
implicit なくても Impersonate を繰り返せばトークンゲットできる
チェーンしてても データアクセス監査ログ に残る
https://gyazo.com/eceb9a0543fc6288c6e5e92b412df805
ここに Google のやつが入っていることもあるなあ
principalEmail: "service-{NUMBER}@gcp-gae-service.iam.gserviceaccount.com"
Method: projects.serviceAccounts.generateAccessToken などの API Exploler からトークンゲットできる
gcloud でできない?
iam.serviceAccountTokenCreator もっていたら impersonate すればできる
gcloud auth print-access-token  |  Cloud SDK のドキュメント  |  Google Cloud
$ gcloud auth print-access-token {service account email} は一度サービスアカウントキーで gcloud auth activate-service-account していないといけないようだけど
roles/iam.serviceAccountTokenCreator を持っていたら --impersonate-service-account を使って
$ gcloud auth print-access-token --impersonate-service-account={service account email} でなりすました上で自己のトークンを取得できる