目次
今年4月に入社した新井です。
Cloud IAMについて調べてみました。
IAMの役割
IAMは「誰が」「どのような操作を」「何に対して」行えるのかを設定して、他のリソースへのアクセスを防ぐ役割があります。IAMを使用することで最小権限のセキュリティ原則を導入することもできます。
IAMの構成
IAMは大きく3つの要素で構成されています。
1. IAMポリシー
どのプリンシパルにどのロールが付与されているかを定義し適応するものです。IAMポリシーは「バインディング」「監査構成」「メタデータ」で構成されています。
- バインディング
バインディングとは、1つ以上のプリンシパル(メンバー)を1つ以上のロールに関連付けたものです。
- 監査構成
監査構成を指定すると、ログに記載する内容も制御することができます。
- メタデータ
ポリシーに記述するスキーマのバージョンなど、システム上の管理情報が含まれます。
2. プリンシパル(メンバー)
プリンシパルはIAMの「誰に」という権限を付与する対象をことです。下記はプリンシパルとして設定できるものになります。
- Googleアカウント
1つのGoogleアカウントは、Google Cloud (GCP)を利用するディベロッパー、管理者、または他のユーザを表します。
- サービスアカウント
サービスアカウントは、ここのエンドユーザではなく、アプリケーションまたはコンピューディングワークロードのアカウントです。
- Googleグループ
Googleグループは、Googleアカウントとサービスアカウントの名前付きコレクションです。Googleグループを使用することで、ユーザーの集合に対してアクセス制御を簡単に行なえます。
- Google Workspaceアカウント
Google Workspaceアカウントは、そこに含まれるすべてのGoogleアカウントの仮想グループを表します。
- Cloud Identityドメイン
Cloud Identity ドメインは、1 つの組織内のすべての Google アカウントの仮想グループを表すため、Google Workspace アカウントに似ています。
ただし、Cloud Identity ドメイン ユーザーは、Google Workspace のアプリケーションと機能にアクセスできません。
- 認証済みのすべてのユーザー
allAuthenticatedUsers
は、すべてのサービス アカウント、および Google アカウントで認証されたユーザー全員を表す特殊な識別子です。このIDには個人用Gmailアカウントや、Google WorkspaceアカウントまたはCloud Identidyのドメインに接続していないアカウントも含まれます。
認証されていないユーザ(匿名の訪問者など)は含まれません。
- すべてのユーザー
allUsers
は、認証されたユーザーと認証されていないユーザーの両方を含めて、インターネット上のユーザーを表す特殊な識別子です。
3. ロール
ロールはリソースに各種アクションを行う際の権限をまとめたものです。このロールをプリンシパルとバインドすることでIAMポリシーが作成されます。またロール単位でまとめることで権限を扱いやすくしています。
- 基本ロール
IAMの導入前に存在していたロールでオーナー、編集者、閲覧者の3種類があります。オーナーロールには編集ロールが、編集ロールには閲覧者ロールの権限が含まれており、入れ子構造になっています。
基本ロールの種類
名前 | タイトル | 権限 |
---|---|---|
roles/viewer | 閲覧者 | 既存のリソースやデータの表示(ただし変更は不可能)など、状態に影響しない読み取り専用アクションに必要な権限。 |
roles/editor | 編集者 | すべての閲覧者権限に加えて状態を変更するアクション(既存のリソースの変更など)に必要な権限。 |
roles/owner | オーナー | すべての編集者権限と、以下のアクションを実行するために必要な権限: ・プロジェクトおよびプロジェクト内のすべてのリソースの権限とロールを管理する。 ・プロジェクトの課金情報を設定する。 |
- 事前定義ロール
リソースごとにさまざまな権限が用意されていますが、それを使いやすくまとめたのが事前定義ロールです。多くのリソースで「管理者」「編集者」「読み取り」という役割ごとに、ロールが用意されています。
事前定義ロールの例
ロール | 役割 | 説明 |
---|---|---|
roles/storage.admin | ストレージ管理者 | オブジェクトとバケットのすべてを管理する権限。 |
roles/storage.objectAdmin | ストレージオブジェクト管理者 | オブジェクトの一覧表示、作成、表示、削除など、オブジェクトのすべてを管理できる権限を付与。 |
roles/storage.objectCreator | ストレージオブジェクト作成者 | オブジェクトの作成を許可。オブジェクトを削除または上書きする権限は付与されない。 |
roles/storage.objectViewer | ストレージオブジェクト閲覧者 | オブジェクトとそのメタデータ(ACLを除く)を閲覧するためのアクセス権を付与。バケット内のオブジェクトを一覧表示可能。 |
- カスタムロール
カスタムロールは、ユーザ側で権限を自由にまとめられるものです。カスタムロールには1つ以上の権限を設定する必要があります。
また、事前定義ロールはGoogleが管理しているため、リソースに新しい権限が追加された場合、自動的に事前定義ロールにも権限が追加されます。一方、カスタムロールの場合は、そのようなアップデートに自分で対応しなければいけません。
ポリシーとリソース階層
許可ポリシーは、リソース階層の任意のレベル(組織レベル、フォルダレベル、プロジェクトレベル、リソースレベル)で設定できます。
リソース階層とは?
リソースの階層構造のことです。Google Cloud (GCP)のリソースは階層的に作成されます。
gcloudコマンドによるロール操作
ロール表示
gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT
- RESOURCE_TYPE: アクセス権を表示するリソースタイプ。
下記のいずれかの値を使用します。
・project
・resource-manager
・folders
・organizations
- RESOURCE_ID: Google Cloud (GCP)プロジェクト、フォルダ、または組織ID。プロベクトIDは英数字です。
例: my-project
- FORMAT: ポリシーの形式。
・json
・yaml
# 例
gcloud projects get-iam-policy my-project --format=json
ロール付与
gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID \
--member=PRINCIPAL --role=ROLE_ID \
--condition=CONDITION
- RESOURCE_TYPE: アクセスを管理するリソースタイプ。
下記のいずれかの値を使用します。
・project
・resource-manager
・folders
・organizations
- RESOURCE_ID: Google Cloud (GCP)プロジェクト、フォルダ、または組織ID。プロベクトIDは英数字です。
例: my-project
- PRINCIPAL: プリンシパルまたはメンバーの識別子。PRINCIPAL_TYPE: IDの形式で指定します。
例: user:my-user@example.com
なお、プリンシパルタイプがuserの場合、識別子に含まれるドメイン名はGoogle WorkspaceドメインまたはCloud Identityドメインである必要があります。
- ROLE_ID: 付与するロールの名前。
例: roles/resourcemanager.projectCreator
- CONDITION: 省略可能。ロールバインディングに追加する条件。
# 例
gcloud projects add-iam-policy-binding my-project \
--member=user:my-user@example.com --role=roles/resourcemanager.projectCreator
ロール削除
gcloud RESOURCE_TYPE remove-iam-policy-binding RESOURCE_ID \
--member=PRINCIPAL --role=ROLE_ID
- RESOURCE_TYPE: アクセスを管理するリソースタイプ。
下記のいずれかの値を使用します。
・project
・resource-manager
・folders
・organizations
- RESOURCE_ID: Google Cloud (GCP)プロジェクト、フォルダ、または組織ID。プロベクトIDは英数字です。
例: my-project
- PRINCIPAL: プリンシパルまたはメンバーの識別子。PRINCIPAL_TYPE: IDの形式で指定します。
例: user:my-user@example.com
なお、プリンシパルタイプがuserの場合、識別子に含まれるドメイン名はGoogle WorkspaceドメインまたはCloud Identityドメインである必要があります。
- ROLE_ID: 取り消すロールの名前。
例: roles/resourcemanager.projectCreator
# 例
gcloud projects remove-iam-policy-binding my-project \
--member=user:my-user@example.com --role=roles/resourcemanager.projectCreator
おわり
今回はCloud IAMの基礎的な部分をまとめてみました。
他にもIAM監査ロギングやIAM Conditionsを使用して一時的なリソースへのアクセス制御を行えたり、拒否ポリシーを利用して特定の権限を使用できないように制限するなど機能がまだまだあります。
時間があるときに調べきれなかった機能についてもまとめてみようと思います。