サービスアカウントのなりすまし
Impersonate Service Account
なりすます側が
roles/iam.serviceAccountUser を持つ
ユーザにこの権限を付けるとプロジェクの全てのサービスアカウントになりすませるので強い
→ actAs が付いているけど iam.serviceAccounts.{getAccessToken,getOpenIdToken} は無いので 外部(クライアントなど)でなりすますことはできない?
サービスアカウント ページの権限タブから個別にアクセスを許可するのが良い
何でもかんでも roles/owner なら細かく制御する意味は薄い
Cloud Build からデプロイする時など、Cloud Build サービスアカウント(サービスエージェント)に Cloud Run や GAE の権限を限定的にあげるとか
roles/iam.serviceAccountTokenCreator
トークンを作れる(iam.serviceAccountUser は作れない)
CLOUDSDK_AUTH_IMPERSONATE_SERVICE_ACCOUNT 環境変数
--impersonate-service-account= オプション
有効期限が短い認証情報を作る
roles/iam.serviceAccountTokenCreator を持っていたらできる
roles/owner にトークン作成者は入ってない?
なりすましチェーン
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"
gcloud でできない?
iam.serviceAccountTokenCreator もっていたら impersonate すればできる
roles/iam.serviceAccountTokenCreator を持っていたら --impersonate-service-account を使って
$ gcloud auth print-access-token --impersonate-service-account={service account email} でなりすました上で自己のトークンを取得できる