このガイドでは、親リソース(プロジェクト、フォルダ、組織など)ではなく、特定の Compute Engine リソースへのアクセスを許可することで、最小権限の原則を実行する方法を説明します。
リソースへのアクセスを許可するには、リソースに Identity and Access Management(IAM)ポリシーを設定します。このポリシーでは、ユーザーやサービス アカウントなどの 1 つ以上のメンバーを 1 つ以上のロールにバインドします。各ロールには、メンバーがリソースを操作できる権限のリストが含まれています。
親リソース(プロジェクトなど)にアクセス権を付与すると、そのすべての子リソース(そのプロジェクト内のすべての VM など)にもアクセス権が付与されることになります。リソースへのアクセスを制限するには、可能であれば、プロジェクト レベル以上のリソースではなく、下位レベルのリソースで IAM ポリシーを設定します。
Compute Engine と関係のないリソースへのアクセス権(たとえば、Google Cloud プロジェクトへのアクセス権)を付与、変更、取り消す方法については、IAM ドキュメントでリソースへのアクセス権の付与、変更、取り消しをご覧ください。
始める前に
- このガイドのコマンドラインの例を使用する場合は、次の操作を行います。
- Google Cloud CLI の最新バージョンをインストールするか、最新バージョンに更新します。
- デフォルトのリージョンとゾーンを設定します。
- このガイドの API の例を使用する場合、API アクセスを設定します。
- IAM の概要を確認します。
- Compute Engine のアクセス制御の概要を読みます。
- Compute Engine の IAM ロールをよく理解します。
サポートされているリソース
リソースレベルのアクセス制御をサポートする Compute Engine リソースは次のとおりです。
disks
firewalls
futureReservations
images
instances
instanceTemplates
licenses
machineImages
nodeGroups
nodeTemplates
regionDisks
reservations
serviceAttachments
snapshots
subnetworks
Google Cloud でサポートされているリソースの一覧については、IAM ポリシーを受け入れるリソースタイプをご覧ください。
リソースレベルのアクセス制御をサポートしていない Compute Engine リソースの場合は、これらのリソースへのアクセスをプロジェクト フォルダ レベル、または組織レベルで管理する必要があります。組織、フォルダ、プロジェクトについては、リソース階層をご覧ください。
Compute Engine リソースへのアクセスの許可
リソースに対する IAM のロールをユーザーに付与する前に、特定のリソースに関して付与できるロールの種類を確認してください。詳細については、リソースに対して付与可能なロールの表示をご覧ください。
特定の Compute Engine リソースへのアクセス権をユーザーに付与するには、そのリソースで IAM ポリシーを設定します。
コンソール
- Google Cloud Console で、権限を追加するそれぞれのリソースページに移動します。
- インスタンスの場合は、[VM インスタンス] ページに移動します。
- ゾーンディスクとリージョン ディスクの場合は、[ディスク] ページに移動します。
- スナップショットの場合は、[スナップショット] ページに移動します。
- イメージの場合は、[イメージ] ページに移動します。
- インスタンス グループの場合は、[インスタンス グループ] ページに移動します。
- インスタンス テンプレートの場合は、[インスタンス テンプレート] ページに移動します。
- 単一テナントノードの場合は、[単一テナントノード] ページに移動します。
- 更新するリソースの横にあるチェックボックスをオンにします。
- [情報パネルを表示] をクリックして、権限の列を展開します。
- [メンバーを追加] フィールドに 1 人以上のメンバーを追加します。
- [役割を選択] リストで 1 つ以上の役割を選択します。
- [追加] をクリックして変更内容を保存します。
gcloud
リソースに対するロールをメンバーに付与するには、--member
フラグと --role
フラグを指定して、リソースの add-iam-policy-binding
サブコマンドを使用します。
gcloud compute resource-type add-iam-policy-binding resource-name \
--member='member' \
--role='role'
以下を置き換えます。
resource-type
: リソースのタイプ。有効な値は次のとおりです。disks
images
instances
instance-templates
regionDisks
sole-tenancy node-groups
sole-tenancy node-templates
snapshots
resource-name
: リソースの名前。例:my_instance
member
: ロールを付与する有効な ID。形式はuser|group|serviceAccount:email
またはdomain:domain
にする必要があります。たとえば、次のようにします。user:test-user@gmail.com
group:admins@example.com
serviceAccount:test123@example.domain.com
domain:example.domain.com
role
: この ID を割り当てるロール。
現在ベータ版のリソースへのアクセス権を付与するには、代わりに gcloud beta compute
コマンドを使用します。
REST
API を使用して IAM ポリシーを変更するには、次の手順を実行します。
リソースのそれぞれの
getIamPolicy
メソッドを使用して、既存のポリシーを読み取ります。たとえば、次の HTTP リクエストでは VM の IAM ポリシーを読み取ります。POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instances/instance:getIamPolicy
以下を置き換えます。
project-id
: この VM が属するプロジェクト ID。zone
: VM のゾーン。リージョン リソースまたはグローバル リソースの場合は、zones/zone
をregions/region
またはglobal
に置き換えます。instance
: VM インスタンスの名前。
Compute Engine からレスポンスとして現在のポリシーが返されます。
テキスト エディタでポリシーを編集して、メンバーおよび関連するロールを追加または削除します。たとえば、
compute.admin
ロールを email@example.com に付与するには、次の新しいバインディングをポリシーに追加します。{ "members": [ "user:email@example.com" ], "role":"roles/compute.admin" }
setIamPolicy()
を使用して、更新したポリシーを書き込みます。POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instances/instance:setIamPolicy
以下を置き換えます。
project-id
: この VM が属するプロジェクト ID。zone
: VM のゾーン。リージョン リソースまたはグローバル リソースの場合は、zones/zone
をregions/region
またはglobal
に置き換えます。instance
: VM インスタンスの名前。
リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。
リソースへのアクセス権の取り消し
Compute Engine リソースへのアクセスが不要になったメンバーに対しては、アクセス権を取り消すことをおすすめします。
コンソール
- Google Cloud Console で、権限を追加するそれぞれのリソースページに移動します。
- インスタンスの場合は、[VM インスタンス] ページに移動します。
- ゾーンディスクとリージョン ディスクの場合は、[ディスク] ページに移動します。
- スナップショットの場合は、[スナップショット] ページに移動します。
- イメージの場合は、[イメージ] ページに移動します。
- インスタンス グループの場合は、[インスタンス グループ] ページに移動します。
- インスタンス テンプレートの場合は、[インスタンス テンプレート] ページに移動します。
- 単一テナントノードの場合は、[単一テナントノード] ページに移動します。
- 更新するリソースの横にあるチェックボックスをオンにします。
- [情報パネルを表示] をクリックして、権限の列を展開します。
- メンバーを削除するリソースに対するロールカードをクリックします。カードが展開され、そのリソースに対するロールを持つメンバーが表示されます。
- [ ](削除)をクリックして、そのロールからメンバーを削除します。
gcloud
リソースに対するロールをメンバーから削除するには、--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
regionDisks
sole-tenancy node-groups
sole-tenancy node-templates
snapshots
resource-name
: リソースの名前。たとえば、my_instance
です。member
: 削除する ID。形式はuser|group|serviceAccount:email
またはdomain:domain
にする必要があります。たとえば、次のようにします。user:test-user@gmail.com
group:admins@example.com
serviceAccount:test123@example.domain.com
domain:example.domain.com
role
: ID を削除するロール。
現在ベータ版のリソースへのアクセス権限を取り消すには、代わりに gcloud beta compute
コマンドを使用します。
REST
API を使用して IAM ポリシーを直接変更するには、次の手順に従います。
リソースのそれぞれの
getIamPolicy
メソッドを使用して、既存のポリシーを読み取ります。たとえば、次の HTTP リクエストでは VM の IAM ポリシーを読み取ります。POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instances/instance:getIamPolicy
以下を置き換えます。
project-id
: この VM インスタンスのプロジェクト ID。zone
: VM のゾーン。リージョン リソースまたはグローバル リソースの場合は、zones/zone
をregions/region
またはglobal
に置き換えます。instance
: VM インスタンスの名前。
Compute Engine からレスポンスとして現在のポリシーが返されます。
テキスト エディタでポリシーを編集して、メンバーを関連するロールから削除します。たとえば、
compute.admin
のロールから email@example.com を削除します。{ "members": [ "user:owner@example.com" ], "role":"roles/compute.admin" }
setIamPolicy()
を使用して、更新したポリシーを書き込みます。POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instances/instance:setIamPolicy
以下を置き換えます。
project-id
: この VM が属するプロジェクト ID。zone
: VM のゾーン。リージョン リソースまたはグローバル リソースの場合は、zones/zone
をregions/region
またはglobal
に置き換えます。instance
: VM インスタンスの名前。
リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。
呼び出し元の権限の有無のテスト
ID が持つ権限がわからない場合は、testIamPermissions
API メソッドを使用して、ID に付与されている権限を確認します。
このメソッドに入力パラメータとしてリソース URL と一連の権限を渡すと、呼び出し元に許可されている一連の権限が返されます。このメソッドは、サポートされているリソースのすべてで使用できます。
通常、testIamPermissions
は、カスタマイズされたグラフィカル ユーザー インターフェースなど、お客様独自のソフトウェアとの統合を目的としています。一般的に、Google Cloud で権限を直接管理している場合、testIamPermissions
は呼び出しません。
たとえば、Compute Engine API を基盤とする GUI を構築し、その GUI にインスタンスを起動する「スタート」ボタンを配置する場合などに、compute.instances.testIamPermissions()
を呼び出して、ボタンを有効または無効にするかを決定できます。
リソースに対する呼び出し元の特定の権限の有無をテストするには:
リクエスト本文にチェック対象の権限のリストを含めたリクエストをリソースに送信します。
たとえば、あるインスタンスの
compute.instances.start
、compute.instances.stop
、compute.instances.delete
をチェックする場合は、次のようにします。POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instances/instance-name/testIamPermissions { "permissions": [ "compute.instances.start", "compute.instances.stop", "compute.instances.delete" ] }
リクエストにより、呼び出し元で有効になっている権限が返されます。
{ "permissions": [ "compute.instances.start", "compute.instances.stop" ] }
複数のメンバーのリソース アクセス権の変更
複数のメンバーを対象として Compute Engine リソースへのアクセス権を同時に変更する場合は、プログラムで IAM ポリシーを変更する方法に関する推奨事項を確認してください。
次のステップ
- IAM を使用してカスタム イメージへのアクセスを管理する方法を学習する。
- サービス アカウントの詳細を確認する。
- Compute Engine IAM のロールの詳細を確認する。
- Compute Engine IAM の事前定義ロールに含まれる権限の詳細を確認する。
- カスタムロールの作成と管理の方法を確認する。