gcloud コマンドは通常 Google アカウントで認証を行うため、その Google アカウントに権限が付与されたリソースは全て操作できてしまいます。
そのため、Google アカウントに多数のプロジェクトに対して権限が付与されている場合、意図しないリソースに対して操作を行ってしまう可能性があります。
この記事では、gcloud コマンドをサービスアカウントで認証を行うことで、サービスアカウントに付与されたリソースのみを操作できるようにする方法についてまとめます。
概要
この記事の目標は以下構成のように、全プロジェクトにアクセスできるユーザーアカウントと、dev プロジェクトにのみアクセスできるサービスアカウントを使い分けられるようにすることです。
(動作の検証は Cloud Storage の操作可否で行います)

CLI 構成の管理
gcloud コマンドでリソースへの操作を行う都度、アカウントの指定を行うのは面倒です。
ですが、gcloud コマンドには用途別等で CLI の構成 (設定) を作成・管理する機能があります。この機能を利用して、必要に応じて構成を切り替えられるようにします。
以下のコマンドで、名称が [構成名]
の CLI 構成が作成されます。
1 | gcloud config configurations create [構成名] |
CLI 構成の切り替えは、以下のようなコマンドで行います。
1 | gcloud config configurations activate [構成名] |
CLI 構成別に異なるアカウントで認証を通せば、最低限のリソースにしかアクセスできないようにする、といったことが実現できます。
補足:ターミナルに構成名を表示する
有効化されている構成名を表示するコマンドもありますが操作ミスを防ぐため、ターミナルに常に有効化されている構成が表示しておくと少し幸せになれるかもしれません。
Bash Shell 等ではシェル変数 PS1
を設定するとプロンプトに表示する文字列を制御できます。
以下のコマンドで、現在有効な構成名がプロンプトに表示されます。
1 | PS1="("$(gcloud config configurations list --filter is_active=True --format 'value(name)')") ${PS1}" |
実行後のプロンプトは以下のような形になります。

サービスアカウント権限の利用方法
gcloud コマンドをサービスアカウントの権限で実行するには、サービスアカウントの権限でリソースを操作できる権限設定が必要になります。
この実現にあたり、本記事では以下 2 つの手順を紹介します。
- サービスアカウントの借用権限を利用する方法
- サービスアカウントキーを利用する方法
前者は、ユーザーアカウントに対して、サービスアカウントの権限を借りられる権限を付与して、サービスアカウントに成りすまして gcloud コマンドを実行する方法です。
ユーザーアカウントの権限 ≠ サービスアカウントの権限であるので、サービスアカウントに付与する権限は注意が必要になるかもしれません。
後者は、サービスをサービスの認証情報を含むキーファイルを払い出して、gcloud コマンドに認証を通す方法になります。
キーファイルがあればサービスアカウントに付与された権限でリソースを操作できてしまうため、キーのローテーションなど、流出への対処が必要となると思います。
検証環境の準備
検証に必要となる、Google Cloud プロジェクトの設定をしておきます。
1. ユーザーアカウントの権限設定
ユーザーアカウントについて、各プロジェクトで以下の IAM ロールの付与が必要になります。
対象プロジェクト | IAM ロール |
---|---|
dev プロジェクト | ストレージ管理者 セキュリティ管理者 |
prd プロジェクト | ストレージ管理者 |
補足:セキュリティ管理者の権限について
先の構成を実現するには、dev プロジェクトのセキュリティ管理者は不要です。
ですが、後の手順でサービスアカウントの権限でリソースを操作できるようにする、セキュリティ周りの設定を行う際に、セキュリティ管理者のロールに含まれる権限が必要になります。
2. サービスアカウントの設定
dev プロジェクトで、gcloud コマンド用のサービスアカウントを作成し、ストレージ管理者のロールを付与します。
手順は Google Cloud のドキュメントを参照してください。
IAM ページで、以下のようにストレージ管理者が付与されていれば問題ありません。

3. Cloud Storage バケットの作成
検証用にバケットを 2 つ作成します。
1 2 | gcloud --project ${dev_project_id} storage buckets create gs://${buekct_name}-dev gcloud --project ${prd_project_id} storage buckets create gs://${buekct_name}-prd |
パラメータ ${...}
には以下の値を入れてください。
- dev_project_id:dev プロジェクトの ID
- prd_project_id:prd プロジェクトの ID
- buekct_name:Cloud Storage バケット名1
手順詳細と検証
先の説明の通り、gcloud コマンドをサービスアカウントの権限で実行する方法は 2 つあります。
ここでは両方法で、gcloud コマンドの設定手順と検証を行います。
事前準備として、ユーザアカウント用に構成を作成し、認証を通しておきます。
1 2 | gcloud config configurations create user-account gcloud auth login |
方法1:サービスアカウントの借用権限を利用する
設定手順は以下の通りです。
設定手順1:ユーザーアカウントにサービスアカウントの借用権限を付与する
ユーザーアカウントに対して、dev プロジェクトのサービスアカウントの借用権限を付与します。
- IAM と管理からサービスアカウントのメニューを開き、当該のサービスアカウントをクリック
- 権限タブを開き、アクセスを許可をクリック
- 表示されるサイドメニューで以下を入力して保存
- 新しいプリンシパル:ユーザーアカウントのメールアドレス
- ロール :サービス アカウント トークン作成者
設定手順2:gcloud コマンドにサービスアカウントへの成りすまし設定をする
以下コマンドで方法 1 用に構成を作成し、サービスアカウントへの成りすまし設定を行います。
1 2 3 4 5 6 7 8 | # 方法 1 用の CLI 構成の作成 gcloud config configurations create sa-user-1 # サービスアカウントの成りすまし設定 gcloud config set auth/impersonate_service_account [サービスアカウントのアドレス] # "ユーザーアカウント"の認証 gcloud auth login |
補足:ユーザーアカウントの認証について
この方法では、ユーザーアカウントからサービスアカウントへの成りすましを行った後、サービスアカウントの権限でコマンドを実行します。
そのため、ユーザーアカウントの認証を通しておく必要があります。
検証:アクセス権の確認
作成した構成 sa-user-1では dev プロジェクトへのアクセスはでき、prd プロジェクトへのアクセスができません。
1 2 3 4 5 6 | gcloud storage buckets list --project ${dev_project_id} --format 'value(name)' # 出力 # WARNING: This command is using service account impersonation. All API calls will be executed as ... # WARNING: This command is using service account impersonation. All API calls will be executed as ... # gcloud-sa-auth-dev |
1 2 3 4 5 6 | gcloud storage buckets list --project ${prd_project_id} --format 'value(name)' # 出力 # WARNING: This command is using service account impersonation. All API calls will be executed as ... # WARNING: This command is using service account impersonation. All API calls will be executed as ... # ERROR: (gcloud.storage.buckets.list) HTTPError 403: ... |
一方、構成 user-account に切り替えると、prd プロジェクトへのアクセスができます。
1 2 3 4 5 6 | gclodu config configurations activate user-account gcloud storage buckets list --project ${prd_project_id} --format 'value(name)' # 出力 # Activated [user-account]. # gcloud-sa-auth-prd |
方法2:サービスアカウントのキーファイルを利用する
設定手順は以下の通りです。
設定手順1:サービスアカウントのキーファイルをダウンロードする
- IAM と管理からサービスアカウントのメニューを開き、当該のサービスアカウントをクリック
- 鍵タブを開き、キーを追加をクリック
- キーのタイプに JSON を選択して作成をクリックし、キーファイルをダウンロード
設定手順2:gcloud コマンドにキーファイルを使って認証をさせる
以下コマンドで方法 2 用に構成を作成し、キーファイルで認証を行うように設定します。
1 2 3 4 5 | # 方法 2 用の CLI 構成の作成 gcloud config configurations create sa-user-2 # サービスアカウントの成りすまし設定 gcloud auth activate-service-account --key-file [キーファイルへのパス] |
検証は方法1と全く同じとなるため、省略します。
まとめ
この記事では、gcloud コマンドをサービスアカウント権限で実行することで、意図しないリソースを操作できないようにする設定方法について説明しました。
サービスアカウント権限で実行するには以下 2 つの方法があり、それぞれ良し悪しがあると思いますので、ユースケースに応じて利用してもらえればと思います。
- サービスアカウントの借用権限を利用する方法
- サービスアカウントキーを利用する方法
また、コマンド実行の都度、サービスアカウントの指定を行うの面倒であるため、gcloud コマンドの構成 (設定) を保存 & 切り替える方法についても説明しました。
より安全に gcloud コマンドを使う助けにしてもらえたら幸いです。
- 本記事の手順ではバケット名は gcloud-sa-auth としています。 ↩︎
コメント