Open7

GCP IAM

Kazuki MatsudaKazuki Matsuda

アクセス管理モデルは、次の 3 つの主要な部分から構成されています。

プリンシパル。プリンシパルは、リソースへのアクセスが許可されている Google アカウント(エンドユーザー)、サービス アカウント(アプリケーションまたはコンピューティング ワークロード)、Google グループ、Google Workspace アカウントまたは Cloud Identity ドメインです。各プリンシパルには、一意の識別子(通常はメールアドレス)があります。

ロール。ロールは権限のコレクションです。権限によって、リソースに対して許可されているオペレーションが決まります。プリンシパルにロールを付与すると、そのロールに含まれるすべての権限が付与されます。

ポリシー。許可ポリシーは、1 つ以上のプリンシパルを個々のロールにバインドするロール バインディングの集合です。リソースに対してどのようなアクセス権(ロール)を誰(プリンシパル)に許可するのかを定義する場合、許可ポリシーを作成して、そのポリシーをリソースに接続します。

Kazuki MatsudaKazuki Matsuda

プリンシパルのタイプ

  • Google アカウント
  • サービスアカウント
    • 個々のエンドユーザーではなく、アプリケーションまたはコンピューティング ワークロードのアカウント
  • Google グループ
    • Google アカウントとサービス アカウントの名前付きコレクション
  • Google Workspace アカウント
    • Google Workspace アカウントは、example.com などの組織のインターネット ドメイン名に関連付けられている
  • Cloud Identity ドメイン
    • Cloud Identity ドメインは、1 つの組織内のすべての Google アカウントの仮想グループを表すため、Google Workspace アカウントに似ています。ただし、Cloud Identity ドメイン ユーザーは、Google Workspace のアプリケーションと機能にアクセスできません。
  • 認証済みのすべてのユーザー
    • allAuthenticatedUsers は、すべてのサービス アカウント、および Google アカウントで認証されたユーザー全員を表す特殊な識別子
  • すべてのユーザー
    • allUsers は、認証されたユーザーと認証されていないユーザーの両方を含めて、インターネット上のユーザーを表す特殊な識別子
Kazuki MatsudaKazuki Matsuda

権限

権限によって、リソースに対して許可されているオペレーションが決まります。IAM では、権限を service.resource.verb の形式で表します(例: pubsub.subscriptions.consume)。

多くの場合、権限は REST API メソッドと 1 対 1 で対応しています。つまり、Google Cloud の各サービスには、各 REST API メソッドに対して関連付けられている権限のセットがあります。そのメソッドの呼び出し元は、そのメソッドを呼び出すための権限を持っている必要があります。たとえば、Pub/Sub を使用し、topics.publish() メソッドを呼び出す必要がある場合は、そのトピックに対して pubsub.topics.publish 権限が必要になります。

ユーザーに直接権限を付与することはできません。代わりに、必要な権限を含むロールを指定し、そのロールをユーザーに付与します。

Kazuki MatsudaKazuki Matsuda

ロール

ロールは権限のコレクションです。ユーザーに直接権限を付与することはできません。代わりに、ロールを付与します。ユーザーにロールを付与する際には、そのロールに含まれているすべての権限がユーザーに付与されます。

ロールの種類

  • 基本ロール
    • Google Cloud Console で従来から使用されているロール。オーナー、編集者、閲覧者のロールがある。
  • 事前定義ロール
    • 基本ロールよりも詳細なアクセス制御が可能なロール。たとえば、Pub/Sub パブリッシャー(roles/pubsub.publisher)は事前定義ロール。
  • カスタムロール
    • 事前定義ロールがニーズを満たしていない場合に、組織のニーズに応じて権限を調整するために作成するロール。
Kazuki MatsudaKazuki Matsuda

許可ポリシー

許可ポリシーは、誰がどの種類のアクセス権を持つかを定義するステートメントの集合です。これを作成することによって、ユーザーにロールを付与できます。許可ポリシーはリソースに関連付けられ、そのリソースがアクセスされると常にアクセス制御が適用されます。

許可ポリシーは、ロール バインディング リストで構成されています。ロール バインディングはプリンシパルのリストをロールにバインドします。

{
  "bindings": [
    {
      "role": "roles/storage.objectAdmin",
      "members": [
        "user:ali@example.com",
        "serviceAccount:my-other-app@appspot.gserviceaccount.com",
        "group:admins@example.com",
        "domain:google.com"
      ]
    },
    {
      "role": "roles/storage.objectViewer",
      "members": [
        "user:maria@example.com"
      ]
    }
  ]
}
  • role
    • プリンシパルに付与するロール。role は、roles/service.roleName の形式で指定
  • members
    • ロールを付与するプリンシパルのリスト
    • 各プリンシパル タイプは接頭辞で識別さる
    • Google アカウントには user:、サービス アカウントには serviceAccount:、Google グループには group:、Google Workspace アカウントまたは Cloud Identity ドメインには domain: が付く
Kazuki MatsudaKazuki Matsuda

リソース階層

許可ポリシーは、リソース階層の任意のレベル(組織レベル、フォルダレベル、プロジェクト レベル、リソースレベル)で設定できます。リソースは親リソースの許可ポリシーをすべて継承します。リソースで有効な許可ポリシーは、そのリソースに設定された許可ポリシーと、上位階層から継承された許可ポリシーを組み合わせたものです。