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

Compute Engine リソース用の Cloud IAM ポリシーを使用すると、VM インスタンス、ディスク、イメージなどの特定のリソースに対する Cloud IAM の役割を管理して、それらのリソースへのアクセスを許可できます。これにより、最小権限の原則を柔軟に適用できます。たとえば、作業の実施に必要な特定のリソースのみに共同編集者権限を付与できます。

リソースは親リソースのポリシーも継承します。特定のリソースに対して有効なポリシーは、そのリソースに設定されたポリシーとリソース階層の上位から継承されるポリシーの和です。

リソースにメンバーをバインディングする際や、リソースに対するポリシーを設定する際に、メンバーは招待メールを受け取りません。各メンバーのアクセス権は直接更新されます。

Cloud IAM ポリシーに含めることができるメンバーの種類(ユーザーやグループなど)の詳細については、Cloud IAM ドキュメントをご覧ください。

始める前に

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

現時点では、以下の Compute Engine リソースへのアクセス権を付与できます。

以下のリソースにもアクセス権を付与できますが、このリソースへのアクセス権の付与は現在ベータ版であるため、関連する gcloud beta または Beta API コマンドを使用する必要があります。

リソースのメンバー バインディングの追加と削除

リソースに対する Cloud IAM バインディングにより、そのリソースに対する特定の役割がメンバーに付与されます。インスタンス、ディスク、イメージ、スナップショットの Cloud IAM バインディングは、Google Cloud Platform Console および gcloud コマンドライン ツールを使用して追加および削除できます。

特定リソースについてすべてのメンバーの Cloud IAM ポリシーを更新するには、リソースのポリシーの取得と設定をご覧ください。

Console

  1. 権限を追加するリソースのページに移動します。
  2. 更新するリソースの横にあるチェックボックスをオンにします。
  3. [情報パネルを表示] をクリックして、権限の列を展開します。
  4. メンバーを追加するには:
    1. [メンバーを追加] フィールドに 1 人以上のメンバーを追加します。
    2. [役割を選択] プルダウン メニューで、役割を 1 つ以上選択します。
    3. [追加] をクリックして変更内容を保存します。
  5. メンバーを削除するには:
    1. リソースに 1 つ以上の役割に対するポリシー バインディングが存在する場合は、それらの役割が拡張可能なカードとして表示されます。削除する 1 人または複数のメンバーに対応する役割のカードをクリックします。
    2. 削除アイコン(ゴミ箱に似た削除アイコン)をクリックして、各役割を削除します。

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] はリソースのタイプ(disksimagesinstancesinstance-templatessole-tenancy node-groupssole-tenancy node-templatessnapshots のいずれか)です。
  • [RESOURCE_NAME] はリソースの名前です。たとえば my_instance などです。
  • [MEMBER] は、バインディングを追加するメンバーです。
    • 形式は user|group|serviceAccount:email または domain:domain にする必要があります。たとえば、user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.comdomain:example.domain.com などです。
    • 次の特別な値のいずれかを使用することもできます。
      • allUsers: インターネット上のすべてのユーザー。Google アカウントの有無は関係ありません。
      • allAuthenticatedUsers: Google アカウントまたはサービス アカウントで認証されるすべてのユーザー。
  • [ROLE] は、当該メンバーに割り当てる役割です。

現在ベータ版のリソースへのアクセス権を付与するには、代わりに gcloud beta compute コマンドを使用します。

リソースのポリシーの取得と設定

リソースの Cloud IAM ポリシーは、そのリソースに対するアクセスが誰に付与されているかを定義するステートメントの集合です。

読み取り - 変更 - 書き込みパターンを使用して、リソースのポリシーを更新できます。この場合、まずリソースの現在の Cloud IAM ポリシーを取得し、更新して、最後に設定します。このパターンの詳細については、Cloud IAM のドキュメントをご覧ください。

gcloud

gcloud コマンドを実行してリソースのポリシーを取得または設定するときは、JSON または YAML ファイルを使用できます。このセクションの例では、JSON を使用します。

  1. リソースの get-iam-policy サブコマンドを実行して、変更するポリシーを取得します。

    gcloud compute [RESOURCE_TYPE] get-iam-policy [RESOURCE_NAME] --format json > policy.json
    

    ここで:

    • [RESOURCE_TYPE] は、リソースのタイプ(disksimagesinstancesinstance-templatessnapshots のいずれか)です。
    • [RESOURCE_NAME] はリソースの名前です。

    たとえば、example-disk という名前のディスクの Cloud IAM ポリシーを取得するには、次のコマンドを実行します。

    gcloud compute disks get-iam-policy example-disk --format json > policy.json
    
  2. 空の JSON ポリシー ファイルは、次のようになります。etag プロパティは、前回のリクエスト以降にポリシーが変更されたかどうかを確認するために使用されます。

    {
      "etag": "ACAB"
    }
    
  3. テキスト エディタを使用して、JSON ファイルを更新します。配列を含む bindings オブジェクトを構築します。配列内の各オブジェクトは、members の配列とそれらのメンバーに関連付けられた役割です。たとえば、all-devs@example.comsome-devs@other-place.com のグループに roles/compute.imageUser の役割を付与し、bob@example.comroles/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"
    }
    
  4. リソースの 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
    
  5. このコマンドを実行すると更新されたポリシーが出力されます。出力には更新された 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

既存のポリシーを変更するには:

  1. リソースの getIamPolicy() メソッドを呼び出して、既存のポリシーを取得します。

    たとえば、ディスクの場合は次のようになります。

    GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/disks/[DISK_NAME]/getIamPolicy
    
  2. リクエストにより、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"
          ]
        }
      ]
    }
    
  3. 必要に応じてポリシーを変更した後、setIamPolicy() を呼び出して、更新したポリシーを設定します。

    たとえば、email2@gmail.comcompute.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"
          ]
        }
      ]
    }
    
  4. レスポンスには更新されたポリシーが示され、更新された 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() を呼び出して、ボタンを有効にするか、無効にするかを決定できます。

呼び出し元がリソースに対する特定の権限を持っているかどうかをテストするには:

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

    たとえば、あるインスタンスの compute.instances.startcompute.instances.stopcompute.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"
       ]
    }
    
  2. リクエストにより、呼び出し元で有効になっている権限が返されます。

    {
      "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 に付与するには:

  1. Cloud IAM ポリシーを取得します。

    gcloud compute images get-iam-policy shared-image --format json > policy.json
    
  2. テキスト エディタで policy.json を変更し、all-devs@example.comroles/compute.imageUser の役割を付与します。

    {
      "bindings": [
        {
          "members": [
            "group:all-devs@example.com"
          ],
          "role": "roles/compute.imageUser"
        }
      ],
      "etag": "ACAB"
    }
    
  3. 変更された 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 を利用できるようにするには:

  1. Cloud IAM ポリシーを取得します。

    GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/images/shared-image/getIamPolicy
    
  2. リクエストからポリシーが返されます。

    {
     "etag": "ACAB"
    }
    
  3. 変更後のポリシーを適用します。

    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"
    }
    
  4. リクエストから更新後のポリシーが返されます。

    {
     "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 で行う方法は次のとおりです。

  1. インスタンスの Cloud IAM ポリシーを取得します。

    gcloud compute instances get-iam-policy example-instance --format json > policy.json
    
  2. テキスト エディタで policy.json を変更します。

    {
      "bindings": [
        {
          "members": [
            "user:alice@example.com"
          ],
          "role": "roles/compute.instanceAdmin.v1"
        }
      ],
      "etag": "ACAB"
    }
    
  3. 変更後の policy.json をインスタンスに適用します。

    gcloud compute instances set-iam-policy example-instance policy.json
    
  4. インスタンスのサービス アカウントに対するサービス アカウント ユーザーの役割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=
    
  5. プロジェクトに対する 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 ドキュメント