gcloud コマンドをサービスアカウント権限で実行する

gcloud コマンドは通常 Google アカウントで認証を行うため、その Google アカウントに権限が付与されたリソースは全て操作できてしまいます。
そのため、Google アカウントに多数のプロジェクトに対して権限が付与されている場合、意図しないリソースに対して操作を行ってしまう可能性があります。

この記事では、gcloud コマンドをサービスアカウントで認証を行うことで、サービスアカウントに付与されたリソースのみを操作できるようにする方法についてまとめます。

概要

この記事の目標は以下構成のように、全プロジェクトにアクセスできるユーザーアカウントと、dev プロジェクトにのみアクセスできるサービスアカウントを使い分けられるようにすることです。
(動作の検証は Cloud Storage の操作可否で行います)

構成図

CLI 構成の管理

gcloud コマンドでリソースへの操作を行う都度、アカウントの指定を行うのは面倒です。
ですが、gcloud コマンドには用途別等で CLI の構成 (設定) を作成・管理する機能があります。この機能を利用して、必要に応じて構成を切り替えられるようにします。

以下のコマンドで、名称が [構成名] の CLI 構成が作成されます。

CLI 構成の切り替えは、以下のようなコマンドで行います。

CLI 構成別に異なるアカウントで認証を通せば、最低限のリソースにしかアクセスできないようにする、といったことが実現できます。

補足:ターミナルに構成名を表示する

有効化されている構成名を表示するコマンドもありますが操作ミスを防ぐため、ターミナルに常に有効化されている構成が表示しておくと少し幸せになれるかもしれません。

Bash Shell 等ではシェル変数 PS1 を設定するとプロンプトに表示する文字列を制御できます。
以下のコマンドで、現在有効な構成名がプロンプトに表示されます。

実行後のプロンプトは以下のような形になります。

設定後のプロンプト

サービスアカウント権限の利用方法

gcloud コマンドをサービスアカウントの権限で実行するには、サービスアカウントの権限でリソースを操作できる権限設定が必要になります。
この実現にあたり、本記事では以下 2 つの手順を紹介します。

  1. サービスアカウントの借用権限を利用する方法
  2. サービスアカウントキーを利用する方法

前者は、ユーザーアカウントに対して、サービスアカウントの権限を借りられる権限を付与して、サービスアカウントに成りすまして gcloud コマンドを実行する方法です。
ユーザーアカウントの権限 ≠ サービスアカウントの権限であるので、サービスアカウントに付与する権限は注意が必要になるかもしれません。

後者は、サービスをサービスの認証情報を含むキーファイルを払い出して、gcloud コマンドに認証を通す方法になります。
キーファイルがあればサービスアカウントに付与された権限でリソースを操作できてしまうため、キーのローテーションなど、流出への対処が必要となると思います。

検証環境の準備

検証に必要となる、Google Cloud プロジェクトの設定をしておきます。

1. ユーザーアカウントの権限設定

ユーザーアカウントについて、各プロジェクトで以下の IAM ロールの付与が必要になります。

対象プロジェクトIAM ロール
dev プロジェクトストレージ管理者
セキュリティ管理者
prd プロジェクトストレージ管理者
補足:セキュリティ管理者の権限について

先の構成を実現するには、dev プロジェクトのセキュリティ管理者は不要です。
ですが、後の手順でサービスアカウントの権限でリソースを操作できるようにする、セキュリティ周りの設定を行う際に、セキュリティ管理者のロールに含まれる権限が必要になります。

2. サービスアカウントの設定

dev プロジェクトで、gcloud コマンド用のサービスアカウントを作成し、ストレージ管理者のロールを付与します。
手順は Google Cloud のドキュメントを参照してください。

IAM ページで、以下のようにストレージ管理者が付与されていれば問題ありません。

dev プロジェクトの IAM ページ

3. Cloud Storage バケットの作成

検証用にバケットを 2 つ作成します。

パラメータ ${...} には以下の値を入れてください。

  • dev_project_id:dev プロジェクトの ID
  • prd_project_id:prd プロジェクトの ID
  • buekct_name:Cloud Storage バケット名1

手順詳細と検証

先の説明の通り、gcloud コマンドをサービスアカウントの権限で実行する方法は 2 つあります。
ここでは両方法で、gcloud コマンドの設定手順と検証を行います。

事前準備として、ユーザアカウント用に構成を作成し、認証を通しておきます。

方法1:サービスアカウントの借用権限を利用する

設定手順は以下の通りです。

設定手順1:ユーザーアカウントにサービスアカウントの借用権限を付与する

ユーザーアカウントに対して、dev プロジェクトのサービスアカウントの借用権限を付与します。

  1. IAM と管理からサービスアカウントのメニューを開き、当該のサービスアカウントをクリック
    • 手順1
  2. 権限タブを開き、アクセスを許可をクリック
    • 手順2
  3. 表示されるサイドメニューで以下を入力して保存
    • 新しいプリンシパル:ユーザーアカウントのメールアドレス
    • ロール      :サービス アカウント トークン作成者

設定手順2:gcloud コマンドにサービスアカウントへの成りすまし設定をする

以下コマンドで方法 1 用に構成を作成し、サービスアカウントへの成りすまし設定を行います。

補足:ユーザーアカウントの認証について

この方法では、ユーザーアカウントからサービスアカウントへの成りすましを行った後、サービスアカウントの権限でコマンドを実行します。
そのため、ユーザーアカウントの認証を通しておく必要があります。

検証:アクセス権の確認

作成した構成 sa-user-1では dev プロジェクトへのアクセスはでき、prd プロジェクトへのアクセスができません。

一方、構成 user-account に切り替えると、prd プロジェクトへのアクセスができます。

方法2:サービスアカウントのキーファイルを利用する

設定手順は以下の通りです。

設定手順1:サービスアカウントのキーファイルをダウンロードする

  1. IAM と管理からサービスアカウントのメニューを開き、当該のサービスアカウントをクリック
    • 手順1
  2. 鍵タブを開き、キーを追加をクリック
    • 手順2
  3. キーのタイプに JSON を選択して作成をクリックし、キーファイルをダウンロード

設定手順2:gcloud コマンドにキーファイルを使って認証をさせる

以下コマンドで方法 2 用に構成を作成し、キーファイルで認証を行うように設定します。

検証は方法1と全く同じとなるため、省略します。

まとめ

この記事では、gcloud コマンドをサービスアカウント権限で実行することで、意図しないリソースを操作できないようにする設定方法について説明しました。
サービスアカウント権限で実行するには以下 2 つの方法があり、それぞれ良し悪しがあると思いますので、ユースケースに応じて利用してもらえればと思います。

  1. サービスアカウントの借用権限を利用する方法
  2. サービスアカウントキーを利用する方法

また、コマンド実行の都度、サービスアカウントの指定を行うの面倒であるため、gcloud コマンドの構成 (設定) を保存 & 切り替える方法についても説明しました。

より安全に gcloud コマンドを使う助けにしてもらえたら幸いです。


  1. 本記事の手順ではバケット名は gcloud-sa-auth としています。 ↩︎

コメント

タイトルとURLをコピーしました