🔑

[備忘録] Google Cloudサービスアカウントの種類と見分け方

2021/09/16に公開

Google Cloudの利用に際してほぼ必須となる、サービスアカウントについての初心者向けの記事です。
(2021年9月現在の記事です)

はじめに

Google Cloudのサービスアカウントとは、アプリケーションからGoogle Cloudにアクセスする際に用いられるアカウントで、その認証情報(メール[1]と鍵)を利用して各種Google CloudサービスのAPIが実行されます。
具体的には、VM上やCloud Functionsから、そしてGitHub ActionsなどCI/CDを利用する際にも必要となります。
ユーザーアカウントと同様に、Google Cloudコンソール上ではIAMと管理の項目からサービスアカウントを選択し、一覧表示できます。
また、サービスアカウントを一意に特定するために「メール」と呼ばれるアットマークを含んだ文字列が使われています。このメールの命名規則はやや複雑なのですが、ポイントを押さえるとある程度は「どの種類のサービスアカウントか」という推測が可能ではないかと思われます。
ここでは各種サービスアカウントとそのメールについて、自分の理解を整理するために簡単にまとめました。

ユーザー管理のサービスアカウント

  • ユーザー自身の責任で管理するアカウントです。
  • コンソールやgcloudコマンド(CLI)を利用して、最大100個まで作成できます。

▼ (e.g.) Cloud FunctionsのHelloWorld関数で使用する想定のサービスアカウント

hello-world@{project-id}.iam.gserviceaccount.com

デフォルトサービスアカウント

  • GCE/GAE、またはそれらを利用するサービスを有効化する際に自動作成されるユーザーアカウントです。
  • 自動で作成されますが、管理はユーザー自身になります。
  • デフォルトサービスアカウントには、プロジェクトに対して編集者権限が付与されており、セキュリティの観点からエンタープライズでは推奨されないようです。
    • これを防ぐために、組織ポリシーで サービスアカウントの使用制限を設定することで、デフォルトのサービスアカウントへの自動的な編集者ロール[2]の付与を無効にできます。

▼ (e.g.) GAEデフォルトサービスアカウント

{project-id}@appspot.gserviceaccount.com

▼ (e.g.) GCEデフォルトサービスアカウント

{project-number}-compute@developer.gserviceaccount.com

サービスエージェント

  • 旧 Google管理サービスアカウント
  • Google Cloudのサービス間で用いられるアカウントです。次のように、さらにいくつか種類があります。

Google APIサービスエージェント

  • Google内部の関連プロセスを実行します。
  • プロジェクトに対する編集者ロール(roles/editor)が自動的に付与されています。
  • こちらは編集権限を削除しないよう、取り扱いに注意が必要です。
{project-number}@cloudservices.gserviceaccount.com

サービスエージェントのロールマネージャー

  • 他のサービスエージェントのロールを管理するものです。
  • 例えば、新しいAPIを利用した際にGoogle APIサービスエージェントにロールを付与するために用いられます。
service-agent-manager@system.gserviceaccount.com

その他のサービスエージェント

  • 個々のサービスの代理として機能します。
  • これらのサービスエージェントのロールも削除しないよう注意する必要があります。
  • こちらのページにサービスエージェントのリストがあります。
hoge@gcp-sa-{service_name}.iam.gserviceaccount.com

Google 管理のサービスアカウント

  • 多くのGoogle Cloudサービスで使う、ユーザーに代わって処理をするときのロールです。
  • IAMのページでは「ロール」のカラムに「Cloud Build サービス アカウント」のように記載されておりわかりやすいです。

▼ (e.g.) Cloud Buildサービスアカウント

{project-number}@cloudbuild.gserviceaccount.com

まとめ

独断的な主観ですが、それぞれのメールに注目してみると次のような順序で識別できそうです。

1. 象徴的な文字列がある(判断しやすい)サービスアカウント

{project-num}-compute@developer.gserviceaccount.com → GCEデフォルトサービスアカウント
service-agent-manager@system.gserviceaccount.com → ロールマネージャー

2. メールの"サブドメイン"で識別すべきサービスアカウント

{project-id}@appspot.gserviceaccount.com → GAEデフォルトサービスアカウント
hoge@{project-id}.iam.gserviceaccount.com → ユーザー管理のサービスアカウント
hoge@gcp-sa-{service-name}.iam.gserviceaccount.com → その他のサービスエージェント
{project-num}@cloudservices.gserviceaccount.com → Google APIサービスエージェント

3. 上記以外の(判断する難易度が高い)サービスアカウント

{project-num}@{service-name}.gserviceaccount.com → Google管理のサービスアカウント

おわりに

一般的には、最小権限の原則に基づきユーザー管理のサービスアカウントを使用する場面が多いと思いますが、IAMの棚卸しやログの分析時などに知っておくと役立つかもしれません。

もし何か認識違い等あれば、また最新の仕様と異なる点があればご指摘下さい。🙇‍♂
最後まで読んでいただき、ありがとうございました。

参考文献

https://cloud.google.com/iam/docs/service-accounts?hl=ja
https://medium.com/google-cloud-jp/google-cloud-access-management-40963bea0dfc

脚注
  1. Google Cloudを触り始めた頃はこの表現に非常に違和感がありましたが、Google Cloudコンソール上では一貫して「メール」と表記されており、本記事内でもメールと呼びたいと思います。なお、IAMの権限一覧ページだとカラム名は「プリンシパル」と表現されています。 ↩︎

  2. Google CloudにおけるロールはAWSとは異なり、権限の集合体という意味となります。 ↩︎

Discussion