Compute Engine リソース用の Cloud IAM ポリシーを使用すると、VM インスタンス、ディスク、イメージなどの特定のリソースに対する Cloud IAM の役割を管理して、それらのリソースへのアクセスを許可できます。これにより、最小権限の原則を柔軟に適用できます。たとえば、作業の実施に必要な特定のリソースのみに共同編集者権限を付与できます。
リソースは親リソースのポリシーも継承します。特定のリソースに対して有効なポリシーは、そのリソースに設定されたポリシーとリソース階層の上位から継承されるポリシーの和です。
リソースにメンバーをバインディングする際や、リソースに対するポリシーを設定する際に、メンバーは招待メールを受け取りません。各メンバーのアクセス権は直接更新されます。
Cloud IAM ポリシーに含めることができるメンバーの種類(ユーザーやグループなど)の詳細については、Cloud IAM ドキュメントをご覧ください。
始める前に
- このガイドのコマンドラインの例を使用する場合、以下を行います。
- gcloud コマンドライン ツールの最新バージョンをインストールするか、最新バージョンに更新します。
- デフォルトのリージョンとゾーンを設定します。
- このガイドの API の例を使用する場合、API アクセスを設定します。
- アクセス制御の概要をご覧ください。
- Compute Engine の Cloud IAM の役割を十分に理解します。
サポートされているリソース
現時点では、以下の Compute Engine リソースへのアクセス権を付与できます。
以下のリソースにもアクセス権を付与できますが、このリソースへのアクセス権の付与は現在ベータ版であるため、関連する gcloud beta
または Beta API コマンドを使用する必要があります。
subnetworks
(ベータ版)
リソースのメンバー バインディングの追加と削除
リソースに対する Cloud IAM バインディングにより、そのリソースに対する特定の役割がメンバーに付与されます。インスタンス、ディスク、イメージ、スナップショットの Cloud IAM バインディングは、Google Cloud Platform Console および gcloud
コマンドライン ツールを使用して追加および削除できます。
特定リソースについてすべてのメンバーの Cloud IAM ポリシーを更新するには、リソースのポリシーの取得と設定をご覧ください。
Console
- 権限を追加するリソースのページに移動します。
- インスタンスの場合は、[VM インスタンス] ページに移動します。
- ディスクの場合は、[ディスク] ページに移動します。
- スナップショットの場合は、[スナップショット] ページに移動します。
- イメージの場合は、[イメージ] ページに移動します。
- 更新するリソースの横にあるチェックボックスをオンにします。
- [情報パネルを表示] をクリックして、権限の列を展開します。
- メンバーを追加するには:
- [メンバーを追加] フィールドに 1 人以上のメンバーを追加します。
- [役割を選択] プルダウン メニューで、役割を 1 つ以上選択します。
- [追加] をクリックして変更内容を保存します。
- メンバーを削除するには:
- リソースに 1 つ以上の役割に対するポリシー バインディングが存在する場合は、それらの役割が拡張可能なカードとして表示されます。削除する 1 人または複数のメンバーに対応する役割のカードをクリックします。
- 削除アイコン(
)をクリックして、各役割を削除します。
gcloud
リソースに対する役割をメンバーに付与するには、--member
フラグと --role
フラグを指定して、リソースの add-iam-policy-binding
サブコマンドを実行します。
gcloud compute [RESOURCE_TYPE] add-iam-policy-binding [RESOURCE_NAME] \
--member='[MEMBER]' \
--role='[ROLE]'
また、ポリシー バインディングを削除するには、--member
フラグと --role
フラグを指定して、リソースの remove-iam-policy-binding
サブコマンドを実行します。
gcloud compute [RESOURCE_TYPE] remove-iam-policy-binding [RESOURCE_NAME] \
--member='[MEMBER]' \
--role='[ROLE]'
ここで:
[RESOURCE_TYPE]
はリソースのタイプ(disks
、images
、instances
、instance-templates
、sole-tenancy node-groups
、sole-tenancy node-templates
、snapshots
のいずれか)です。[RESOURCE_NAME]
はリソースの名前です。たとえばmy_instance
などです。[MEMBER]
は、バインディングを追加するメンバーです。- 形式は
user|group|serviceAccount:email
またはdomain:domain
にする必要があります。たとえば、user:test-user@gmail.com
、group:admins@example.com
、serviceAccount:test123@example.domain.com
、domain:example.domain.com
などです。 - 次の特別な値のいずれかを使用することもできます。
allUsers
: インターネット上のすべてのユーザー。Google アカウントの有無は関係ありません。allAuthenticatedUsers
: Google アカウントまたはサービス アカウントで認証されるすべてのユーザー。
- 形式は
[ROLE]
は、当該メンバーに割り当てる役割です。
現在ベータ版のリソースへのアクセス権を付与するには、代わりに gcloud beta compute
コマンドを使用します。
リソースのポリシーの取得と設定
リソースの Cloud IAM ポリシーは、そのリソースに対するアクセスが誰に付与されているかを定義するステートメントの集合です。
読み取り - 変更 - 書き込みパターンを使用して、リソースのポリシーを更新できます。この場合、まずリソースの現在の Cloud IAM ポリシーを取得し、更新して、最後に設定します。このパターンの詳細については、Cloud IAM のドキュメントをご覧ください。
gcloud
gcloud
コマンドを実行してリソースのポリシーを取得または設定するときは、JSON または YAML ファイルを使用できます。このセクションの例では、JSON を使用します。
リソースの
get-iam-policy
サブコマンドを実行して、変更するポリシーを取得します。gcloud compute [RESOURCE_TYPE] get-iam-policy [RESOURCE_NAME] --format json > policy.json
ここで:
[RESOURCE_TYPE]
は、リソースのタイプ(disks
、images
、instances
、instance-templates
、snapshots
のいずれか)です。[RESOURCE_NAME]
はリソースの名前です。
たとえば、
example-disk
という名前のディスクの Cloud IAM ポリシーを取得するには、次のコマンドを実行します。gcloud compute disks get-iam-policy example-disk --format json > policy.json
空の JSON ポリシー ファイルは、次のようになります。
etag
プロパティは、前回のリクエスト以降にポリシーが変更されたかどうかを確認するために使用されます。{ "etag": "ACAB" }
テキスト エディタを使用して、JSON ファイルを更新します。配列を含む
bindings
オブジェクトを構築します。配列内の各オブジェクトは、members
の配列とそれらのメンバーに関連付けられた役割です。たとえば、all-devs@example.com
とsome-devs@other-place.com
のグループにroles/compute.imageUser
の役割を付与し、bob@example.com
にroles/compute.storageAdmin
の役割を付与するには、次のようにします。{ "bindings": [ { "members": [ "group:all-devs@example.com", "group:other-devs@other-place.com" ], "role": "roles/compute.imageUser" }, { "members": [ "user:bob@example.com" ], "role": "roles/compute.storageAdmin" } ], "etag": "ACAB" }
リソースの
set-iam-policy
サブコマンドを実行し、新しいポリシーが記述された JSON ファイルへのパスを指定して、ポリシーを更新します。このコマンドは、JSON ファイルのetag
値がリソースの現在のetag
値と一致する場合にのみ成功します。gcloud compute [RESOURCE_TYPE] set-iam-policy [RESOURCE_NAME] policy.json
たとえば、
example-disk
という名前のディスクに Cloud IAM ポリシーを設定するには、次のコマンドを実行します。gcloud compute disks set-iam-policy example-disk policy.json
このコマンドを実行すると更新されたポリシーが出力されます。出力には更新された
etag
値が含まれます。bindings: - members: - user:bob@example.com role: roles/compute.storageAdmin - members: - group:all-devs@example.com - group:other-devs@other-place.com role: roles/compute.imageUser etag: BwUjMhXbSPU=
API
既存のポリシーを変更するには:
リソースの
getIamPolicy()
メソッドを呼び出して、既存のポリシーを取得します。たとえば、ディスクの場合は次のようになります。
GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/disks/[DISK_NAME]/getIamPolicy
リクエストにより、
bindings
の配列(バインディングが存在する場合)とetag
値を含むポリシーが返されます。etag
プロパティは、前回のリクエスト以降にポリシーが変更されたかどうかを確認するために使用されます。{ "etag": "BwVvzaUs8EY=", "bindings":[ { "role":"roles/compute.storageAdmin", "members":[ "user:bob@example.com", "serviceAccount:service-account@my-project.iam.gserviceaccount.com" ] }, { "role":"roles/compute.imageUser", "members":[ "user:email1@gmail.com", "user:email2@gmail.com", "user:email3@gmail.com" ] } ] }
必要に応じてポリシーを変更した後、
setIamPolicy()
を呼び出して、更新したポリシーを設定します。たとえば、
email2@gmail.com
のcompute.imageUser
の役割を取り消す場合、リクエストは次のようになります。POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/disks/[DISK_NAME]/setIamPolicy
{ "etag": "BwVvzaUs8EY=", "bindings":[ { "role":"roles/compute.storageAdmin", "members":[ "user:bob@example.com", "serviceAccount:service-account@my-project.iam.gserviceaccount.com" ] }, { "role":"roles/compute.imageUser", "members":[ "user:email1@gmail.com", "user:email3@gmail.com" ] } ] }
レスポンスには更新されたポリシーが示され、更新された
etag
値が含まれます。{ "etag": "BwVwGgz7Arg=", "bindings":[ { "role":"roles/compute.storageAdmin", "members":[ "user:bob@example.com", "serviceAccount:service-account@my-project.iam.gserviceaccount.com" ] }, { "role":"roles/compute.imageUser", "members":[ "user:email1@gmail.com", "user:email3@gmail.com" ] } ] }
呼び出し元の権限の有無のテスト
testIamPermissions
API メソッドは、入力パラメータとしてリソースの URL と権限のセットを使用し、呼び出し元に許可されている権限のセットを返します。この方法は、サポートされているリソースのすべてで使用できます。
一般的に、GCP を直接使用して権限を管理している場合、testIamPermission
は呼び出しません。testIamPermissions
は、カスタマイズされたグラフィカル ユーザー インターフェースなど、お客様独自のソフトウェアとの統合を目的としています。たとえば、Compute Engine API を基盤とする GUI を構築し、その GUI にインスタンスを起動する「スタート」ボタンを配置する場合などに、compute.instances.testIamPermissions()
を呼び出して、ボタンを有効にするか、無効にするかを決定できます。
呼び出し元がリソースに対する特定の権限を持っているかどうかをテストするには:
リクエスト本文にチェック対象の権限のリストを含めたリクエストをリソースに送信します。
たとえば、あるインスタンスの
compute.instances.start
、compute.instances.stop
、compute.instances.delete
をチェックする場合は、次のようにします。POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]/setIamPolicy
{ "permissions": [ "compute.instances.start", "compute.instances.stop", "compute.instances.delete" ] }
リクエストにより、呼び出し元で有効になっている権限が返されます。
{ "permissions": [ "compute.instances.start", "compute.instances.stop" ] }
シナリオ
組織内での特定イメージの共有
IT 部門認定のマシンイメージのセットがあり、特定のチームに特定のイメージへのアクセスを付与したいと考えている企業があるとします。Compute Engine リソースに対する Cloud IAM ポリシーがない場合、この企業はすべてのイメージへのアクセスを全員に付与するか、イメージを複数のプロジェクトに保存しなければならなくなります。Compute Engine リソースに対する Cloud IAM ポリシーを使用することで、すべてのイメージを単一プロジェクトに保管して、管理を容易にし、特定のチームに作業上必要なイメージのサブセットのみへのアクセスを付与できます。
下の例では、images-project
に複数のイメージがあります。all-devs@example.com
グループには ubuntu-base-v1-0
イメージを使用するためのアクセス権がありますが、ubuntu-v1-1-test
イメージや mysql-v1
イメージを使用するアクセス権はありません。また、db-admins@example.com
グループには mysql-v1
イメージを使用するためのアクセス権のみがあります。この設定を構成するには、ubuntu-base-v1-0
イメージに Cloud IAM ポリシーを設定して all-devs@example.com
にイメージ ユーザーの役割を付与し、mysql-v1
に Cloud IAM ポリシーを設定して db-admin@example.com
にイメージ ユーザーの役割を付与します。
gcloud
コマンドライン ツールで、shared-image
イメージを使用する権限を all-devs@example.com
に付与するには:
Cloud IAM ポリシーを取得します。
gcloud compute images get-iam-policy shared-image --format json > policy.json
テキスト エディタで
policy.json
を変更し、all-devs@example.com
にroles/compute.imageUser
の役割を付与します。{ "bindings": [ { "members": [ "group:all-devs@example.com" ], "role": "roles/compute.imageUser" } ], "etag": "ACAB" }
変更された
policy.json
をイメージに適用します。gcloud compute images set-iam-policy shared-image policy.json
特定のイメージの公開共有
Compute Engine ユーザー向けのイメージを公開する Google のパートナーであるとします。イメージの Cloud IAM ポリシーを設定することで、Compute Engine 上で認証済みのすべてのユーザーとイメージを共有できます。
Compute Engine API を使用してすべての Compute Engine ユーザーが shared-image
を利用できるようにするには:
Cloud IAM ポリシーを取得します。
GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/images/shared-image/getIamPolicy
リクエストからポリシーが返されます。
{ "etag": "ACAB" }
変更後のポリシーを適用します。
POST https://www.googleapis.com/compute/alpha/projects/[PROJECT_ID]/zones/[ZONE]/images/shared-image/setIamPolicy { "bindings": [ { "members": [ "allAuthenticatedUsers" ], "role": "roles/compute.imageUser" } ], "etag": "ACAB" }
リクエストから更新後のポリシーが返されます。
{ "etag": "BwVa45js9SQ=", "bindings": [ { "role": "roles/compute.imageUser", "members": [ "allAuthenticatedUsers" ] } ] }
問題をデバッグするためにインスタンスへのアクセスをチームメートに付与する
作成したインスタンスで発生している問題のデバッグを、alice@example.com
に依頼するとします。インスタンスの Cloud IAM ポリシーを変更して、インスタンスに対する Compute インスタンス管理者(v1)の役割を alice@example.com
に付与します。
インスタンスがサービス アカウントとして実行するよう構成されている場合、SSH による接続、メタデータの設定、ディスクの接続を Alice に許可するには、インスタンスのサービス アカウントに対するサービス アカウント ユーザーの役割を alice@example.com
に付与します。これら 3 つの操作では、Alice はサービス アカウントの代理としてコマンドを実行できるため、サービス アカウントのこの役割を付与することが必要です。サービス アカウントをリソースとして扱う方法の詳細については、サービス アカウント権限をご覧ください。
Alice が GCP Console を通じてインスタンスを管理できるようにするには、彼女に compute.projects.get
権限を持つ役割を付与します。たとえば、この権限が含まれる Compute 閲覧者の役割を Alice に付与できます。この役割は、プロジェクト内のすべての Compute Engine リソースも表示できますが、ディスク、イメージ、スナップショットからデータを読み取ることはできません。また、必要な権限が含まれるカスタムの役割を作成することもできます。
これを gcloud で行う方法は次のとおりです。
インスタンスの Cloud IAM ポリシーを取得します。
gcloud compute instances get-iam-policy example-instance --format json > policy.json
テキスト エディタで
policy.json
を変更します。{ "bindings": [ { "members": [ "user:alice@example.com" ], "role": "roles/compute.instanceAdmin.v1" } ], "etag": "ACAB" }
変更後の
policy.json
をインスタンスに適用します。gcloud compute instances set-iam-policy example-instance policy.json
インスタンスのサービス アカウントに対するサービス アカウント ユーザーの役割を
alice@example.com
に付与します。ここでは、インスタンスのサービス アカウントはdata-reader-service-account@[PROJECT_ID].iam.gserviceaccount.com
であるとします。gcloud iam service-accounts add-iam-policy-binding \ data-reader-service-account@[PROJECT_ID].iam.gserviceaccount.com \ --member="user:alice@example.com" \ --role="roles/iam.serviceAccountUser"
gcloud
は次の値を返します。bindings: - members: - user:alice@example.com role: roles/iam.serviceAccountUser etag: BwVa42MC-aY=
プロジェクトに対する Compute 閲覧者の役割を
alice@example.com
に付与します。gcloud projects add-iam-policy-binding [PROJECT_ID] \ --member=user:alice@example.com \ --role=roles/compute.viewer
gcloud
は次の値を返します。bindings: - members: - user:alice@example.com role: roles/iam.serviceAccountUser [...] etag: BwVa42MC-aY=
これで Alice は GCP Console でインスタンスを表示でき、インスタンスのすべてのメソッドを呼び出す権限を持てるようになりました。Alice に追加リソース(サブネットワーク、ファイアウォールなど)の権限も必要な場合は、事前定義された適切な役割(ネットワーク ユーザーなど)を付与する必要があります。
次のステップ
- サービス アカウントの詳細を確認する。
- Compute Engine IAM の役割の詳細を確認する。
- Compute Engine の事前定義済みの役割に含まれる権限の詳細を確認する。
- カスタムロールを作成する方法を学ぶ。