Compute Engine リソースへのアクセスの管理


このページでは、親リソース(プロジェクト、フォルダ、組織など)ではなく、特定の Compute Engine リソースへのアクセスを許可することで、最小権限の原則を実行する方法を説明します。

リソースへのアクセスを許可するには、リソースに Identity and Access Management(IAM)ポリシーを設定します。このポリシーでは、ユーザーやサービス アカウントなどの 1 つ以上のメンバーを 1 つ以上のロールにバインドします。各ロールには、メンバーがリソースを操作できる権限のリストが含まれています。

親リソース(プロジェクトなど)にアクセス権を付与すると、そのすべての子リソース(そのプロジェクト内のすべての VM など)にもアクセス権が付与されることになります。リソースへのアクセスを制限するには、可能であれば、プロジェクト レベル以上のリソースではなく、下位レベルのリソースで IAM ポリシーを設定します。

Compute Engine と関係のないリソースへのアクセス権(たとえば、Google Cloud プロジェクトへのアクセス権)を付与、変更、取り消す方法については、IAM ドキュメントでリソースへのアクセス権の付与、変更、取り消しをご覧ください。

始める前に

  • IAM の概要を確認します。
  • Compute Engine のアクセス制御の概要を読みます。
  • Compute Engine の IAM ロールをよく理解します。
  • まだ設定していない場合は、認証を設定します。認証とは、Google Cloud サービスと API にアクセスするために ID を確認するプロセスです。ローカル開発環境からコードまたはサンプルを実行するには、次のように Compute Engine に対する認証を行います。

    このページのサンプルをどのように使うかに応じて、タブを選択してください。

    コンソール

    Google Cloud コンソールを使用して Google Cloud サービスと API にアクセスする場合、認証を設定する必要はありません。

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. デフォルトのリージョンとゾーンを設定します

    REST

    このページの REST API サンプルをローカル開発環境で使用するには、gcloud CLI に指定した認証情報を使用します。

      Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init

必要なロール

Compute Engine リソースへのアクセスを管理するために必要な権限を取得するには、リソースに対する Compute 管理者roles/compute.admin)IAM ロールの付与を管理者に依頼してくださいロールの付与の詳細については、アクセス権の管理をご覧ください。

この事前定義ロールには、Compute Engine リソースへのアクセスの管理に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

Compute Engine リソースへのアクセスを管理するには、次の権限が必要です。

  • リソースへのアクセス権を付与または取り消す:
    • プロジェクトに対する compute.projects.get
    • リソースに対する compute.RESOURCE_TYPE.get
    • リソースに対する compute.RESOURCE_TYPE.getIamPolicy
    • リソースに対する compute.RESOURCE_TYPE.setIamPolicy
  • 呼び出し元の権限をテストする: リソースに対する compute.RESOURCE_TYPE.getIamPolicy

    RESOURCE_TYPE はアクセスを管理するリソースに置き換えます。たとえば、instancesinstanceTemplatesimages です。

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

サポートされているリソース

リソースレベルのアクセス制御をサポートする Compute Engine リソースの一覧を表示するには、IAM ポリシーを受け入れるリソースタイプCompute Engine 用のフィルタをご覧ください。

リソースレベルのアクセス制御をサポートしていない Compute Engine リソースの場合は、これらのリソースへのアクセスをプロジェクト フォルダ レベル、または組織レベルで管理する必要があります。組織、フォルダ、プロジェクトについては、リソース階層をご覧ください。

Compute Engine リソースへのアクセスの許可

プリンシパル(ユーザーやサービス アカウントなど)は、Compute Engine リソースにアクセスできます。ID はプリンシパルのプロパティです。通常、プリンシパルの ID は、アカウントに関連付けられたメールアドレスで表されます。

リソースに対する IAM のロールをプリンシパルに付与する前に、特定のリソースに関して付与できるロールの種類を確認してください。詳細については、リソースに対して付与可能なロールの表示をご覧ください。

特定の Compute Engine リソースへのアクセス権を付与するには、そのリソースで IAM ポリシーを設定します。

コンソール

  1. Google Cloud Console で、権限を追加するそれぞれのリソースページに移動します。
  2. 更新するリソースの横にあるチェックボックスをオンにします。
  3. リソースページに基づいて、次の手順を行います。
    • VM インスタンスの場合は、[ 権限] をクリックします。
    • 他のすべてのリソースについては、次の操作を行います。
      1. 情報パネルが表示されているかどうかを確認します。表示されていない場合は、[情報パネルを表示] をクリックします。
      2. [権限] タブを選択します。
  4. [プリンシパルを追加] をクリックします。
  5. プリンシパルの ID を追加し、必要なロールを選択します。
  6. 変更を保存するには、[保存] をクリックします。

gcloud

リソースに対するロールをプリンシパルに付与するには、--member フラグと --role フラグを指定して、そのリソースの add-iam-policy-binding サブコマンドを使用します。

gcloud compute RESOURCE_TYPE add-iam-policy-binding RESOURCE_NAME \
    --member='PRINCIPAL' \
    --role='ROLE'

次のように置き換えます。

  • RESOURCE_TYPE: リソースのタイプ。有効な値は次のとおりです。
    • disks
    • images
    • instances
    • instance-templates
    • machine-images
    • reservations
    • sole-tenancy node-groups
    • sole-tenancy node-templates
    • snapshots
  • RESOURCE_NAME: リソースの名前。例: my_instance
  • PRINCIPAL: ロールを付与するプリンシパルの有効な ID。形式は user|group|serviceAccount:EMAIL_ADDRESS または domain:DOMAIN_ADDRESS にする必要があります。例:
    • user:test-user@gmail.com
    • group:admins@example.com
    • serviceAccount:test123@example.domain.com
    • domain:example.domain.com
  • ROLE: このプリンシパルを割り当てるロール。

プレビュー版のリソースへのアクセス権を付与する場合は、代わりに gcloud beta compute コマンドを使用します。

REST

API を使用して IAM ポリシーを変更するには、次の手順を実行します。

  1. リソースのそれぞれの getIamPolicy メソッドを使用して、既存のポリシーを読み取ります。たとえば、次の HTTP リクエストでは VM の IAM ポリシーを読み取ります。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME:getIamPolicy

    次のように置き換えます。

    • PROJECT_ID: この VM が属するプロジェクトのプロジェクト ID。
    • ZONE: VM のゾーン。リージョン リソースまたはグローバル リソースの場合は、zones/ZONEregions/REGION または global に置き換えます。
    • VM_NAME: VM インスタンスの名前。

    Compute Engine からレスポンスとして現在のポリシーが返されます。

  2. テキスト エディタでポリシーを編集して、プリンシパルとそれに関連するロールを追加または削除します。たとえば、compute.admin ロールを email@example.com に付与するには、次の新しいバインディングをポリシーに追加します。

    {
      "members": [
        "user:email@example.com"
      ],
      "role":"roles/compute.admin"
    }
    
  3. setIamPolicy() を使用して、更新したポリシーを書き込みます。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME:setIamPolicy

    次のように置き換えます。

    • PROJECT_ID: この VM が属するプロジェクトのプロジェクト ID。
    • ZONE: VM のゾーン。リージョン リソースまたはグローバル リソースの場合は、zones/ZONEregions/REGION または global に置き換えます。
    • VM_NAME: VM インスタンスの名前。

    リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。

リソースへのアクセス権の取り消し

Compute Engine リソースへのアクセスが不要になったプリンシパルに対しては、アクセス権を取り消すことをおすすめします。

コンソール

  1. Google Cloud Console で、権限を追加するそれぞれのリソースページに移動します。
  2. 更新するリソースの横にあるチェックボックスをオンにします。
  3. リソースページに基づいて、次の手順を行います。
    • VM インスタンスの場合は、[ 権限] をクリックします。
    • 他のすべてのリソースについては、次の操作を行います。
      1. 情報パネルが表示されているかどうかを確認します。表示されていない場合は、[情報パネルを表示] をクリックします。
      2. [権限] タブを選択します。
  4. プリンシパルを削除するロールカードをクリックします。カードが展開され、そのリソースに対するロールを持つユーザーが表示されます。
  5. そのロールからプリンシパルを削除するには、[削除] をクリックします。

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
    • machine-images
    • reservations
    • sole-tenancy node-groups
    • sole-tenancy node-templates
    • snapshots
  • RESOURCE_NAME: リソースの名前。例: my_instance
  • PRINCIPAL: プリンシパルの有効な ID。形式は user|group|serviceAccount:EMAIL_ADDRESS または domain:DOMAIN_ADDRESS にする必要があります。例:
    • user:test-user@gmail.com
    • group:admins@example.com
    • serviceAccount:test123@example.domain.com
    • domain:example.domain.com
  • ROLE: プリンシパルを削除するロール。

プレビューのリソースへのアクセス権限を取り消すには、代わりに gcloud beta compute コマンドを使用します。

REST

API を使用して IAM ポリシーを直接変更するには、次の手順に従います。

  1. リソースのそれぞれの getIamPolicy メソッドを使用して、既存のポリシーを読み取ります。たとえば、次の HTTP リクエストでは VM の IAM ポリシーを読み取ります。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME:getIamPolicy

    次のように置き換えます。

    • PROJECT_ID: この VM が属するプロジェクトのプロジェクト ID。
    • ZONE: VM のゾーン。リージョン リソースまたはグローバル リソースの場合は、zones/ZONEregions/REGION または global に置き換えます。
    • VM_NAME: VM インスタンスの名前。

    Compute Engine からレスポンスとして現在のポリシーが返されます。

  2. テキスト エディタでポリシーを編集して、メンバーを関連するロールから削除します。たとえば、compute.admin のロールから email@example.com を削除します。

    {
      "members": [
        "user:owner@example.com"
      ],
      "role":"roles/compute.admin"
    }
    
  3. setIamPolicy() を使用して、更新したポリシーを書き込みます。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME:setIamPolicy

    次のように置き換えます。

    • PROJECT_ID: この VM が属するプロジェクトのプロジェクト ID。
    • ZONE: VM のゾーン。リージョン リソースまたはグローバル リソースの場合は、zones/ZONEregions/REGION または global に置き換えます。
    • VM_NAME: VM インスタンスの名前。

    リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。

呼び出し元の権限の有無のテスト

ID が持つ権限がわからない場合は、testIamPermissions API メソッドを使用して、ID に付与されている権限を確認します。

このメソッドに入力パラメータとしてリソース URL と一連の権限を渡すと、呼び出し元に許可されている一連の権限が返されます。このメソッドは、サポートされているリソースのすべてで使用できます。

通常、testIamPermissions は、カスタマイズされたグラフィカル ユーザー インターフェースなど、お客様独自のソフトウェアとの統合を目的としています。一般的に、Google Cloud で権限を直接管理している場合、testIamPermissions は呼び出しません。

たとえば、Compute Engine API を基盤とする GUI を構築し、その GUI にインスタンスを起動する「スタート」ボタンを配置する場合などに、compute.instances.testIamPermissions() を呼び出して、ボタンを有効または無効にするかを決定できます。

リソースに対する呼び出し元の特定の権限の有無をテストするには:

  1. リクエスト本文にチェック対象の権限のリストを含めたリクエストをリソースに送信します。

    たとえば、あるインスタンスの compute.instances.startcompute.instances.stopcompute.instances.delete をチェックする場合は、次のようにします。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/testIamPermissions
        {
          "permissions": [
            "compute.instances.start",
            "compute.instances.stop",
            "compute.instances.delete"
           ]
        }
  2. リクエストにより、呼び出し元で有効になっている権限が返されます。

    {
      "permissions": [
        "compute.instances.start",
        "compute.instances.stop"
      ]
    }
    

複数のメンバーのリソース アクセス権の変更

複数のメンバーを対象として Compute Engine リソースへのアクセス権を同時に変更する場合は、プログラムで IAM ポリシーを変更する方法に関する推奨事項を確認してください。

次のステップ