GCPでサービスアカウントの権限を用いてgcloudコマンドやgsutilコマンドをローカルマシン等から実行する際、どうやっていますか?
よくあるサービスアカウントの使い方
サービスアカウントキーを用いて認証するという方法がよく用いられています。
手順1.作成済みサービスアカウントのキーを作成しダウンロード
gcloud iam service-accounts keys create key.json --iam-account=sa-hoge@PROJECT_ID.iam.gserviceaccount.com
手順2.ローカルの実行環境でGOOGLE_APPLICATION_CREDENTIALS環境変数の設定(ダウンロードしたキーのパス指定)
# Linux
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/key.json"
# Windows
set GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/key.json"
手順3.コマンドの実行
gcloud hogehoge
サービスアカウントキー取扱注意
一見簡単な方法ではありますが、サービスアカウントキーをダウンロードするというのはリスクを伴います。
ローカル端末にキーをダウンロードしますので、その管理が個人に依存することになります。
誤ってgitリポジトリにキーファイルを上げてしまったりなどすると、それを取得した第三者からリソースにアクセスされてしまうという事故が起こりえます。
公式ドキュメントでも、サービスアカウントに与える権限を最小限にすることや、gitへのコミットが行われないように設定するなどといった対応が言及されていますが、キーの流出を根本的に解消するものではありません。
サービスアカウントの借用
借用とは、一時的に特定のサービスアカウントに成りすましてコマンドを実行することです。この方法を使うことで、上記の手順のようにGOOGLE_APPLICATION_CREDENTIALSを指定する必要がなく、そもそもサービスアカウントキーを作成すること自体が不要になります。
手順1.ロールの設定
サービス エージェントにサービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator
)を付与します。
以下のコマンドで、gcloudコマンドを実行するユーザー( my-email@email.com
)が、サービスアカウント(sa-hoge@PROJECT_ID.iam.gserviceaccount.com
)のトークンを作成できるようになります。
gcloud iam service-accounts add-iam-policy-binding \
sa-hoge@PROJECT_ID.iam.gserviceaccount.com \
--member='user:my-email@email.com' \
--role=roles/iam.serviceAccountTokenCreator
手順2.コマンドの実行
コマンドに --impersonate-service-account
を付けるだけでOKです。
gcloud hogehoge --impersonate-service-account=sa-hoge@PROJECT_ID.iam.gserviceaccount.com
まとめ
鍵などの機密情報がうっかり漏れてしまった、というのはGCPに限らず耳にする話かと思います。
そういったことが起きないように検討する様々な方法も、「そもそも鍵を作らない」に勝ることはないでしょう。
「うっかり」や「万が一」を起こさないためにも、使ってみることをお勧めします。
参考
クラウドサービスとして認証する | Cloud IAM のドキュメント | Google Cloud
サービス アカウントの権限借用の管理 | Cloud IAM のドキュメント | Google Cloud