これで分かった!Google CloudのIAMの仕組みやAWSとの違い

記事タイトルとURLをコピーする

G-genの杉村です。Google Cloud (旧称 GCP) の Identity and Access Management(略称 IAM)は、きちんと使いこなすことで強力なセキュリティ統制を効かせることができます。本投稿では、その内部構造まで解き明かしていきます。

Cloud IAM とは

Google Cloud における Identity and Access Management (略称 IAM もしくは Cloud IAM) とは Google Cloud リソースに対するアクセス制御を司る仕組みです。

IAM は誰が、どのリソースに対して、どういう条件で、何をできるか という「認可」を管理します。

「リソース」とは、例えば Compute Engine の VM や BigQuery のテーブルなど、Google Cloud に存在するオブジェクトの一つ一つを指しています。これらに対する操作権限を定義する仕組みが IAM です。

ID (アカウント)

Google Cloud におけるアカウント管理

IAM を理解するには Google Cloud における ID 管理(アカウント管理)を理解する必要があります。

Google Cloud の管理コンソールにログインしたり CLI ツールを実行するためのユーザーアカウントは、Google Cloud では Google アカウント と呼ばれます。

アカウントとしては、無償の Gmail アカウントを使うことも、Google Workspace(旧 GSuite)や Cloud Identity といった仕組みで集中管理することもできます。

AWS の IAM User との違い

より正確な理解のため、Google でのアカウント管理と、Amazon Web Services(以下、AWS)の IAM User との違いを比較します。AWS における ID は IAM User と呼ばれ、 AWS アカウント(テナント)の中で管理されています。つまり AWS では IAM User 自体もクラウドリソースです。一方の Google Cloud では、アカウントはクラウドリソースではなく Google Cloud から分離して管理されます。

ですから、既に Google Workspace をお使いであればそのままアカウントを Google Cloud の管理用アカウントとして活用できます。

Google Workspace をお使いでない場合は、Cloud Identity という仕組み(50 アカウントまで無償版で利用可能)で 組織 を作り、ID を管理することができます。

ID 管理の違い

Google アカウントとグループ

Google アカウントは 1個人に対して1個 発行されることが想定されています。共用アカウントの作成は「パスワードの漏洩」「有事の際に監査ログから実行者が追えない」「それによる内部犯に対する抑止力低下」などのリスクがあります。

Google Workspace でも Cloud Identity でも、アカウント名は john@example.com のようにメールアドレス形式です。

なお個人の Google アカウント(Gmail アカウント)も Google Cloud 用アカウントとして権限を持たせることが可能です。

また admin-grp@example.com のように グループ を作成して、アカウントをグループに所属させることができます。グループは、Google Workspace(Cloud Identity)の管理コンソールで作成するのが原則です。なおグループは Google Workspace においてはメーリングリストとして利用されます。

ただし企業で Google Cloud を利用する場合は個人アカウントではなく Google Workspace か Cloud Identity の利用が強く推奨 されます。個人向け Google アカウントだと、グループでの権限管理や、組織のポリシーなどの強力な管理機能が利用できないためです。

サービスアカウント

Google Cloud にはサービスアカウントという概念があります。

サービスアカウントは、Google アカウントとは異なり人間ではなくプログラムが利用するアカウントです。プログラムから Google Cloud の各種サービスを操作する際は、サービスアカウントに権限を持たせて、サービスアカウントの認証情報で認証・認可させます。

また、サービスアカウントはGoogle アカウントとは異なり一つのクラウドリソースです。そのためサービスアカウントはいずれかの Google Cloud プロジェクト内に作成されます。

サービスアカウントの詳細については後述します。

解説記事

Google アカウントについては以下の記事で詳細に説明されていますので、ご参照ください。

blog.g-gen.co.jp

IAM の仕組み

IAM とリソースの関係

Google Cloud の IAM で最も重要なのは IAM 権限はアカウント (主体) とリソースの間に紐づくものであるという点です。

リソースとIAMの関係

Google Cloud では、「誰が (Googleアカウント/グループ等。総称してメンバーと呼ばれる) 」「何を (IAM ロール) 」できるかという権限設定情報を、個々のリソースが持ちます

なお、リソースとは Compute Engine VM や、BigQuery データセットなどを指します。Google Cloud プロジェクト自体もリソースですし、組織もリソースである点に注意が必要です。

後に詳しく記述しますが、AWS では、個々の主体が、「何に対して」「何をできるか」という権限設定情報を持ちます。ここが Google Cloud と AWS の大きな相違点です。

継承

上位のリソースに権限を紐づけると、下位のリソースに 継承 されます。

例えば組織のトップノード (組織ツリーの最上位) に対して、
メンバー : XXX@example.com」「IAM ロール : オーナー」という権限を紐づけたとします。このとき XXX@example.com さんはその組織の配下にある全てのリソース (フォルダ、プロジェクト、VM インスタンスや BigQuery データセット) にオーナー権限をふるうことができます。

一方であるプロジェクトに対して「メンバー : XXX@example.com」「IAM ロール : オーナー」という権限を紐づけると XXX@example.com さんはそのプロジェクト配下にある全てのリソース (VM インスタンスや BigQuery データセット) にオーナー権限を行使することができますが、他のプロジェクトに対しては権限が及びません。

継承

また、例えばある VM インスタンスにオーナー権限を付与しても、XXX@example.com さんは その VM にだけオーナー権限を行使できる のであって他のリソースに触れたり閲覧することはできません。

これを理解できれば 何にどんな権限付与すると、どこまで効果が及ぶのか を理解できるでしょう。

許可と拒否

IAM Policy に対して binding を追加することで、基本的にはメンバーに対して、アクション実行の 許可 を与えることになります。

一方で Deny ポリシー を IAM ポリシーとは別に作成することで 明示的な拒否 を指定することも可能です (Deny ポリシーは 2022/10/25 に GA されました) 。

ポリシーの評価順は 明示的な Deny > 明示的な Allow > 暗黙の Deny であり、明示的な Deny が最も強いです。

そのためポリシー設計時は 基本的には「明示的な Allow」を付与する/しないで管理することを基本 とし、どうしても強い権限で拒否したい (フタをしたい) ときだけ明示的な Deny を使う、といった手法が良いでしょう。 Deny ポリシーは強力すぎるため、安易に使うと後から修正が難しくなる場合があるためです。

Deny ポリシーの詳細については以下の記事で解説しています。

blog.g-gen.co.jp

IAM の内部構造 (IAM Policy とは)

内部構造にも少しふれておきます。

内部構造

全てのリソース (組織、フォルダ、プロジェクト、VM インスタンスや BigQuery データセット) は IAM Policy という属性を一つだけ持っています。※AWS でいう IAM Policy とは全く別物のため、注意が必要です。

IAM Policy は1つのリソースにつき、1つだけです。

IAM Policy は複数の binding を持つことができます。

binding の中には "誰が (Googleアカウント/グループ等。総称してメンバーと呼ばれる) " "何を (IAM ロール)" "どういう条件で (condition)" できるのか、という情報が入っています。

あるリソースの IAM Policy を JSON フォーマットで describe すると以下のようになります。

{
  "bindings": [
    {
      "members": [
        "user:jie@example.com"
      ],
      "role": "roles/resourcemanager.organizationAdmin"
    },
    {
      "members": [
        "user:divya@example.com",
        "user:jie@example.com"
      ],
      "role": "roles/resourcemanager.projectCreator",
      "condition": {
          "title": "Expires_July_1_2022",
          "description": "Expires on July 1, 2022",
          "expression":
            "request.time < timestamp('2022-07-01T00:00:00.000Z')"
      }
    }
  ],
  "etag": "********",
  "version": 1
}

御覧のように、一つの IAM Policy の中に配列で複数の bindings が入っており、一つの binding の中にはどういう条件 (condition) で誰が (メンバー) 何をできる (IAM ロール) のかが記述されている、ということが分かります。

gcloud コマンドによる IAM Policy 操作

ここまで分かれば、コマンドラインツール gcloud で IAM 権限を付与するときは、以下のようにする理由が分かるでしょう。

プロジェクト全体に IAM 権限を付与するとき

gcloud projects add-iam-policy-binding my-project-id --member='user:test-user@gmail.com' --role=roles/resourcemanager.projectCreator `

VM インスタンスに IAM 権限を付与するとき

gcloud compute instances add-iam-policy-binding my-instance --zone=asia-northeast1-b --member='user:test-user@gmail.com' --role='roles/compute.securityAdmin'

各リソースの IAM Policy に対して "add-iam-policy-binding" をすることで、 binding を追加しているのです。

AWS IAM との比較と連携

概要

この章では、Google Cloud の IAM の仕組みをより正しく理解するため、AWS の IAM との違いに着目して解説します。また、AWS との IAM の連携方法についても紹介します。

AWS を特に利用したことがなく、これから利用する予定も無い方は読み飛ばして頂ければと思います。

ID (IAM User)

マネジメントコンソールにログインしたり、 CLI ツールを実行するための ID は、 AWS では IAM User と呼ばれ、 AWS アカウント (テナント) の中で管理されます。

Google Cloud の ID は Google Cloud とは分離され Google Workspace や Cloud Identity で管理されることとは対照的です。

概念の違い

AWS IAM では IAM Policy で権限セット (できること) を定義し、それを 権限主体 (IAM User や Group 。総称して Principal) に紐づけ ます。

別の言葉で言うと、 "どのリソースに対して" "何ができるか" という権限セットを 人に紐づける のです。

これは Google Cloud の IAM が "誰が" "何をできるか" を "リソースに紐づける" のとは考えが異なりますね。

AWS IAM と Google Cloud IAM の比較

用語の違い

IAM Policy, IAM Role といった言葉は 両クラウドで共通していますが、意味は大きく異なっています。

混同しないように気を付けましょう。

意味 AWSでの用語 Google Cloud の用語
権限セット IAM Policy IAM Role
権限を実行するIAM主体 (人間) IAM User Google アカウント
権限を実行するIAM主体 (サービス) IAM Role サービスアカウント
人のIAM主体をまとめるグループ IAM Group Google グループ
個々のリソースが持つIAM設定 (対応概念なし) IAM Policy

AWS IAM と Google Cloud IAM の連携

Google Cloud の IAM には Workload Identity という仕組みがあり、外部の ID プロバイダ (IdP) と OpenID Connect (OIDC) や SAML 2.0 を使って連携させることができます。

Google Cloud の側から AWS の IAM Role を信頼し、AWS の IAM Role に Google Cloud サービスアカウントの権限借用を許すことで、Google Cloud への API 実行を認可することができます。

詳細は以下を参照してください。

また、以下の当社記事で実際に AWS から Workload Identity によって Google Cloud へ認証・認可させた実例を紹介しています。

blog.g-gen.co.jp

blog.g-gen.co.jp

サービスアカウント

サービスアカウントとは

Google Cloud の サービスアカウント とは、人間ではなくプログラムが利用するアカウントです。プログラムから Google Cloud API を利用する際は、サービスアカウントを使って認証・認可を行います。サービスアカウントはGoogle アカウントとは異なり Google Cloud プロジェクトの中に作成するクラウドリソースです。

サービスアカウントはメールアドレスの形式の名称を持ちます。以下は、サービスアカウント名の例です。

  • my-service-account@my-project-id.iam.gserviceaccount.com

サービスアカウントの利用

プログラムから Google Cloud の各種サービスを操作する際は、以下のいずれかの方法でプログラムをサービスアカウントとして認証させます。

  1. サービスアカウントキー (JSON 形式) を読み込ませる
  2. プログラムが動作する実行環境 (VM 等) にサービスアカウントをアタッチする

前者の方法は、サービスアカウントの秘密鍵を JSON 形式でダウンロードし、実行環境に配置して、それをプログラムから読み込ませる方法です。

後者の方法は、プログラムの実行環境が Google Cloud 環境である場合にのみ使えます。Compute Engine VM や Cloud Run サービス、Cloud Functions 関数などにはサービスアカウントを アタッチする ことができます。Cloud SDK (クライアントライブラリ) や gcloud コマンドは、認証情報を明示的に指定しなければ、自動的に実行環境にアタッチされたサービスアカウントの認証情報を利用します。

サービスアカウントキーの注意点

サービスアカウントキーを利用するプログラムの実行環境が Google Cloud 環境であれば、前掲の2つの方法のうち、後者の方が強く推奨 されます。

サービスアカウントキーは JSON 形式のテキストファイルであり、漏洩の危険性があります。キーファイルが漏洩すれば、サービスアカウントが持つ権限を自由に行使して、Google Cloud 環境への侵害が可能になってしまいます。

後者のサービスアカウントをアタッチする方法であれば、キーの漏洩はありません。

また、組織のポリシー機能により、サービスアカウントキーの発行自体を禁止させることも可能です。以下の記事も参照してください。

blog.g-gen.co.jp

サービスアカウントの権限借用

サービスアカウントの応用技として 権限借用 があります。

他のプリンシパル (Google アカウントや他のサービスアカウント) からサービスアカウントの権限を借用して Google Cloud API を実行することが可能です。詳細は以下の記事も参考にしてください。

以下の記事では Terraform のセキュアな利用のためにサービスアカウントからの権限借用を活用する例を紹介しています。

blog.g-gen.co.jp

サービスエージェント

Google Cloud サービスが使う特殊なサービスアカウントとして サービスエージェント があります。

以下の記事で詳細に解説しています。

blog.g-gen.co.jp

杉村 勇馬 (記事一覧)

執行役員 CTO / クラウドソリューション部 部長

元警察官という経歴を持つ現 IT エンジニア。クラウド管理・運用やネットワークに知見。AWS 12資格、Google Cloud認定資格11資格。X (旧 Twitter) では Google Cloud や AWS のアップデート情報をつぶやいています。