ポリシーの管理

このページでは、Google Cloud Platform Console、API、および gcloud ツールを使用して、リソースに対するアクセス制御を管理する手順について説明します。

目次

このガイドの前提条件

Google Cloud Platform Console によるアクセス制御

Cloud Platform Console を使用して、プロジェクト レベルでアクセス制御を設定します。

  1. Cloud Platform Console で [IAM] ページを開きます。

    [IAM] ページを開く

  2. [プロジェクトを選択] プルダウン ボックスを選択して、[続行] をクリックします。
  3. [メンバーを追加] をクリックして、プロジェクトに新しいメンバーを追加し、その権限を設定します。

同じプロジェクト メンバーに複数の役割を付与するには、次のように操作します。

  1. Cloud Platform Console で [IAM] ページを開きます。

    [IAM] ページを開く

  2. [プロジェクトを選択] プルダウン ボックスを選択して、[続行] をクリックします。
  3. 以前にそのメンバーに付与した役割をクリックします。
  4. そのメンバーの行を探します。
  5. [役割] プルダウン ボックスで、そのメンバーに付与する他の役割を選択します。このプルダウン ボックスでは役割を複数選択できることに注意してください。
  6. [保存] をクリックします。

複数のプロジェクトに対して、1 人のメンバーに役割を 1 つ付与するには、次のように操作します。

  1. Cloud Platform Console で [IAM と管理] ページを開きます。

    [IAM と管理] ページを開く

  2. 権限を付与するプロジェクトをすべて選択します。
  3. 右側のペインにある [IAM] タブで、新しいメンバーを追加し、役割を選択すると、選択したすべてのプロジェクトにその役割が付与されます。

リソースレベルでの役割の付与をサポートしているサービスに対しては、リソースレベルでアクセス制御を設定することもできます。たとえば、Pub/Sub リソースに対してアクセス制御を設定するには、Pub/Sub のアクセス制御をご覧ください。

API によるアクセス制御

Cloud IAM では、Google Cloud Platform リソースに対するアクセス制御ポリシーを作成および管理するために使用できる標準的なメソッドが用意されています。これらのメソッドは、Cloud IAM をサポートするサービスによって公開されている場合があります。たとえば、Cloud IAM メソッドは、Cloud Resource Manager(CRM)、Cloud Pub/Sub、および Genomics の API で公開されています。

Cloud IAM のメソッドは次のとおりです。

  • setIamPolicy(): リソースにポリシーを設定できます。
  • getIamPolicy(): 以前に設定したポリシーを取得できます。
  • testIamPermissions(): 呼び出し元にリソースに対する特定の権限があるかどうかをテストできます。

Cloud IAM のポリシーは、Policy オブジェクトで表現されます。Policy は、bindings のリストで構成されています。Bindingmembers のリストを role にバインドします。

members には ID を指定します。次の形式を使用できます。

  • user:{emailid}: Google アカウントを表すメールアドレス。たとえば、alice@gmail.com や joe@example.com です。

  • serviceAccount:{emailid}: サービス アカウントのメールアドレス。たとえば、my-other-app@appspot.gserviceaccount.com のようになります。

  • group:{emailid}: Google グループをメールアドレスで指定します。たとえば、admins@example.com です。

  • domain:{domain}: Directory API で指定されている Google Apps for Work の顧客 ID。

  • allAuthenticatedUsers: Google アカウントまたはサービス アカウントで認証されたユーザー全員を表す特殊な識別子。

  • allUsers: Google アカウントを持っているか持っていないかにかかわらず、インターネット上のすべての人を表す特別な ID。

role はユーザーに割り当てる役割です。roleroles/<name of the role> という形式で指定します。たとえば、roles/ownerroles/editor、および roles/viewer のようになります。

次のコード スニペットは、Cloud IAM ポリシーの構造を示しています。このポリシーでは、owner の役割を alice@example.comadmins@example.comgoogle.commy-other-app@appspot.gserviceaccount.com に割り当て、viewer の役割を bob@example.com に割り当てます。

{
  "bindings": [
   {
     "role": "roles/owner",
     "members": [
       "user:alice@example.com",
       "group:admins@example.com",
       "domain:google.com",
       "serviceAccount:my-other-app@appspot.gserviceaccount.com"]
   },
   {
     "role": "roles/viewer",
     "members": ["user:bob@example.com"]
   }
   ]
}

Cloud Resource Manager の API を使用したコードの例

このセクションでは、例として Cloud Resource Manager を使用する setIamPolicy()getIamPolicy()、および testIamPermissions() について説明します。このセクションのコード スニペットでは、これらのメソッドを使用してプロジェクトのポリシーを管理する方法について説明します。

ポリシーの取得

getIamPolicy() を使用すると、以前に設定した policy を取得することができます。このメソッドでは、入力パラメータとして GetIamPolicyRequest を受け取ります。これにはリソースが含まれています。そしてそのリソースに関連付けされた Policy を返します。

次のコード スニペットではリソース https://cloudresourcemanager.googleapis.com/v1beta1/projects/$our-project-123 に対するポリシーを返します。

プロトコル

リクエスト:
POST
https://cloudresourcemanager.googleapis.com/v1beta1/projects/$our-project-123:getIamPolicy
レスポンス:
{
  "bindings": [
  {
    "role": "roles/editor",
    "members": [
          "serviceAccount:my-other-app@appspot.gserviceaccount.com"
    ]
  },
  {
    "role": "roles/owner",
    "members": [
          "user:email1@gmail.com",
          "user:email2@gmail.com",
          "user:email3@gmail.com"
    ]
  }
  ]
}

Java

import com.google.api.services.cloudresourcemanager.model.Binding;
import com.google.api.services.cloudresourcemanager.model.GetIamPolicyRequest;
import com.google.api.services.cloudresourcemanager.model.Policy;

...

String projectId = "our-project-123";
Policy policy = client.projects().getIamPolicy(
    projectId, new GetIamPolicyRequest()).execute();
System.out.println(policy);

for (Binding binding : policy.getBindings()) {
  if (binding.getRole().equals("roles/owner")) {
    for (String member : binding.getMembers()) {
      System.out.println("Found Owners: " + member);
    }
  }
}
...

ポリシーの設定

setIamPolicy() メソッドを使用すると、ポリシーにリソースを関連付けることができます。setIamPolicy() は入力パラメータとして SetIamPolicyRequest を受け取り、結果として Policy を返します。SetIamPolicyRequest には設定するポリシーと、ポリシーを割り当てるリソースが含まれます。

読み取り - 変更 - 書き込み: リソースのメタデータを更新するための一般的なパターンです。たとえば、Policy はその現在の状態を読み取り、データをローカルに更新した後、その変更したデータを書き込みのために送信することを行います。このような処理は、2 つ以上の独立したプロセスが一連の操作を同時に試行する場合に競合を引き起こすことがあります。たとえば、ある 1 つのプロジェクトにオーナーが 2 人あり、両者が同時にポリシーに対して競合する変更を行おうとする場合があります。この場合、一方のプロジェクト オーナーによって行われた変更が失敗する可能性があります。Cloud IAM では、この問題を Cloud IAM ポリシーの etag プロパティを使用して解決します。このプロパティは、最後のリクエスト以降にポリシーが変更されたかどうかを確認するために使用します。etag 値を保持している Cloud IAM にリクエストを出すと、Cloud IAM はリクエスト内の etag 値と、ポリシーに関連付けられている既存の etag 値を比較します。そして etag 値が一致した場合にのみポリシーを書き込みます。

policy を更新するときには、最初に getIamPolicy() を使用して policy を取得し、policy を更新した後、setIamPolicy() を使用して更新した policy を書き込みます。policy を設定するときに etag 値を使用するのは、GetPolicyResponse 内の対応するポリシーに etag 値が含まれている場合だけです。

以下の Java のコード スニペットでは、読み取り - 変更 - 書き込みのパターンに従って policy を追加しています。

プロトコル

リクエスト:

POST https://cloudresourcemanager.googleapis.com/v1beta1/projects/$our-project-123:setIamPolicy
{
  "policy": {
    "version": "0",
    "bindings": [
      {
        "role": "roles/owner",
 "members": [
          "user:email1@gmail.com",
          "user:email2@gmail.com",
          "user:email3@gmail.com"
        ]
      },
      {
        "role": "roles/editor",
        "members": [
          "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
      }
    ]
  }
}
レスポンス:
{
  "bindings": [
  {
    "role": "roles/owner",
    "members": [
          "user:email1@gmail.com",
          "user:email2@gmail.com",
          "user:email3@gmail.com"
    ]
  },
  {
    "role": "roles/editor",
    "members": [
          "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
  }
  ]
}

Java

import com.google.api.services.cloudresourcemanager.model.Policy;
import com.google.api.services.cloudresourcemanager.model.SetIamPolicyRequest;
import com.google.api.services.cloudresourcemanager.model.GetIamPolicyRequest;
import com.google.api.services.cloudresourcemanager.model.Binding;
import java.util.LinkedList;
inport java.util.Arrays;

...

String[] myViewers = new String[] {"user:testviewer1@gmail.com",
                                   "user:testviewer2@gmail.com"};

String targetRole = "viewers";

Policy policy =
    client.projects().getIamPolicy(projectId,
        new GetIamPolicyRequest()).execute();

Binding targetBinding = null;

// Make a local copy of the bindings for modifying
LinkedList bindings =
    new LinkedList(policy.getBindings());

// Search for the existing binding having role name of
// targetRole.
for (Binding binding : bindings) {
  if (binding.getRole().equals(targetRole)) {
    targetBinding = binding;
    break;
  }
}

// If no matching targetBinding is found, construct a new Binding object,
// and add it to the bindings list.
if (targetBinding == null) {
  targetBinding = new Binding();
  targetBinding.setRole(targetRole);
  bindings.add(targetBinding);
}

// Finally, set the list of members as the members of targetBinding.
targetBinding.setMembers(Arrays.asList(myViewers));

// Write the policy back into the project by calling SetIamPolicy.
SetIamPolicyRequest setIamPolicyRequest = new SetIamPolicyRequest();
setIamPolicyRequest.setPolicy(policy);
client.projects().setIamPolicy(projectId,
    setIamPolicyRequest).execute();

...

権限のテスト

testIamPermissions() を使用すると、あるリソースに対するユーザーの権限をテストすることができます。入力パラメータとして URL と権限のセットを受け取り、呼び出し元が許可されている権限のセットを返します。

権限の管理に Google Cloud Platform を直接使用している場合は、通常は testIamPermission() を実行しません。testIamPermissions() は、カスタマイズしたグラフィック ユーザー インターフェースなど、専用のソフトウェアとの統合のために使用することを意図しています。たとえば、Cloud Platform Console では内部で testIamPermissions() を使用して、ユーザーのログインにどの UI を使用するかを決定します。

このコード スニペットでは、プロジェクトに対する権限をテストしています。

プロトコル

リクエスト:

POST https://cloudresourcemanager.googleapis.com/v1beta1/projects/$our-project-123:testIamPermissions

{
  "permissions":  [
    "resourcemanager.projects.get",
    "resourcemanager.projects.delete"
   ]
}

レスポンス:

{
  "permissions": [
    "resourcemanager.projects.get"
   ]
}

Java

import com.google.api.services.cloudresourcemanager.model.TestIamPermissionsRequest;
import java.util.List;

...

TestIamPermissionsRequest testIamPermissionsRequest =
    new TestIamPermissionsRequest().setPermissions(
        Arrays.asList("resourcemanager.projects.get", "resourcemanager.projects.delete"));

TestIamPermissionsResponse testIamPermissionsResponse =
    client.projects().testIamPermissions(
        projectId, testIamPermissionsRequest).execute();
List testResults = testIamPermissionsResponse.getPermissions();
...

gcloud ツールによるアクセス制御

Cloud IAM のポリシーを管理するコマンドは Cloud SDK に含まれています。インストールするには、次のように操作します。

gcloud を使用して IAM ポリシーを取得する

プロジェクトの Cloud IAM ポリシーを入手するには、次のコマンドを実行します。

gcloud projects get-iam-policy PROJECT_ID

このコマンドの出力はポリシーで、次のようになります。

bindings:
- members:
  - user:email1@gmail.com
  role: roles/owner
- members:
  - serviceAccount:our-project-123@appspot.gserviceaccount.com
  - serviceAccount:123456789012-compute@developer.gserviceaccount.com
  role: roles/editor
etag: BwUjHYKHHiQ=
version: 1

gcloud を使用して IAM ポリシーを設定する

gcloud コマンドを使用してプロジェクトの Cloud IAM ポリシーを取得するには、次のように操作します。

  1. 変更するポリシーを入手して、これを JSON ファイルに書き込みます。

    gcloud projects get-iam-policy PROJECT_ID --format json > iam.json
    

    JSON ファイルの内容は次のようになります。

    {
      "bindings": [
       {
         "members": [
           "user:email1@gmail.com"
         ],
         "role": "roles/owner"
       },
       {
         "members": [
           "serviceAccount:our-project-123@appspot.gserviceaccount.com",
           "serviceAccount:123456789012-compute@developer.gserviceaccount.com"
          ],
          "role": "roles/editor"
       }
       ],
       "etag": "BwUjMhCsNvY=",
       "version": 1
    }
    
  2. テキスト エディタを使用して、グループのメンバーとメンバーの役割を定義する bindings 配列に新しいオブジェクトを追加します。たとえば、役割 roles/viewer をユーザー email2@gmail.com に付与するには、上記の例を次のように変更します。

    {
      "bindings": [
       {
         "members": [
           "user:email1@gmail.com"
          ],
          "role": "roles/owner"
       },
       {
         "members": [
           "serviceAccount:our-project-123@appspot.gserviceaccount.com",
           "serviceAccount:123456789012-compute@developer.gserviceaccount.com"
         ],
         "role": "roles/editor"
       },
       {
         "members": [
           "user:email2@gmail.com"
         ],
         "role": "roles/viewer"
       }
       ],
       "etag": "BwUjMhCsNvY=",
       "version": 1
     }
    
  3. 次のコマンドを実行して、プロジェクトのポリシーを更新します。

    gcloud projects set-iam-policy PROJECT_ID iam.json
    

    コマンドから更新したポリシーが出力されます。

    bindings:
    - members:
      - user:email1@gmail.com
      role: roles/owner
    - members:
      - serviceAccount:our-project-123@appspot.gserviceaccount.com
      - serviceAccount:123456789012-compute@developer.gserviceaccount.com
      role: roles/editor
    - members:
      - user:email2@gmail.com
      role: roles/viewer
    etag: BwUjMhXbSPU=
    version: 1
    
    

ポリシーにバインドを追加する

既存の Cloud IAM ポリシーにバインドを 1 つ追加するには、次のコマンドを実行します。

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member user:email3@gmail.com --role roles/editor

コマンドから更新したポリシーが出力されます。

bindings:
- members:
  - user:email1@gmail.com
  role: roles/owner
- members:
  - serviceAccount:our-project-123@appspot.gserviceaccount.com
  - serviceAccount:123456789012-compute@developer.gserviceaccount.com
  - user:email3@gmail.com
  role: roles/editor
- members:
  - user:email2@gmail.com
  role: roles/viewer
etag: BwUm38GGAQk=
version: 1

ポリシーからバインドを削除する

既存の Cloud IAM ポリシーからバインドを削除するには、次のコマンドを実行します。

gcloud projects remove-iam-policy-binding PROJECT_ID \
    --member user:email3@gmail.com --role roles/editor

コマンドから更新したポリシーが出力されます。

bindings:
- members:
  - user:email1@gmail.com
  role: roles/owner
- members:
  - serviceAccount:our-project-123@appspot.gserviceaccount.com
  - serviceAccount:123456789012-compute@developer.gserviceaccount.com
  role: roles/editor
- members:
  - user:email2@gmail.com
  role: roles/viewer
etag: BwUf0bMcTwg=
version: 1

リソースに付与できる役割を一覧表示する

リソースに付与できる役割をすべて一覧表示するには、list-grantable-roles コマンドを使用します。このコマンドでは、プロジェクト内で有効とされているサービスに対する役割だけが一覧表示されます。

次の例では、プロジェクトで Google Compute Engine、Google App Engine、Cloud Storage、Cloud Logging、Cloud Dataflow が有効になっています。

gcloud iam list-grantable-roles
//cloudresourcemanager.googleapis.com/projects/PROJECT_ID

このコマンドでは、//cloudresourcemanager.googleapis.com/projects/PROJECT_ID で指定されたプロジェクトに付与できる役割がすべて一覧表示されます。

roles:
- description: Access to browse GCP resources.
  name: roles/browser
  title: Browser
- description: Full control of GCE instance resources.
  name: roles/compute.instanceAdmin
  title: Compute Instance Admin
- description: Edit access to all resources.
  name: roles/editor
  title: Editor
- description: Access to obtain credentials for a service account.
  name: roles/iam.serviceAccountActor
  title: Service Account Actor
- description: Full access to all resources.
  name: roles/owner
  title: Owner
- description: Full control of GCS objects.
  name: roles/storage.objectAdmin
  title: Storage Object Admin
- description: Read access to all resources.
  name: roles/viewer
  title: Viewer
- description: Full management of App Engine apps (but not storage).
  name: roles/appengine.appAdmin
  title: App Engine Admin
- description: Necessary permissions to deploy new code to App Engine, and remove
    old versions.
  name: roles/appengine.deployer
  title: App Engine Deployer
- description: Can view and change traffic splits, scaling settings, and delete old
    versions; cannot create new versions.
  name: roles/appengine.serviceAdmin
  title: App Engine Service Admin
- description: Full control of GCE networking resources.
  name: roles/compute.networkAdmin
  title: Compute Network Admin
- description: Read-only access to GCE networking resources.
  name: roles/compute.networkViewer
  title: Compute Network Viewer
- description: Full control of GCE security resources.
  name: roles/compute.securityAdmin
  title: Compute Security Admin
- description: Full control of GCE storage resources.
  name: roles/compute.storageAdmin
  title: Compute Storage Admin
- description: Access to configure log exporting and metrics.
  name: roles/logging.configWriter
  title: Logs Configuration Writer
- description: Access to write logs.
  name: roles/logging.logWriter
  title: Logs Writer
- description: Access to view all logs, including logs with private contents.
  name: roles/logging.privateLogViewer
  title: Private Logs Viewer
- description: Access to view logs, except for admin logs.
  name: roles/logging.viewer
  title: Logs Viewer
- description: Full control of GCS resources.
  name: roles/storage.admin
  title: Storage Admin
- description: Access to create objects in GCS.
  name: roles/storage.objectCreator
  title: Storage Object Creator
- description: Read-Only access to GCS objects.
  name: roles/storage.objectViewer
  title: Storage Object Viewer
- description: Full operational access to Dataflow jobs.
  name: roles/dataflow.developer
  title: Dataflow Developer Role
- description: Read only access to Dataflow jobs.
  name: roles/dataflow.viewer
  title: Dataflow Viewer Role
- description: Worker access to Dataflow.  Intended for service accounts.
  name: roles/dataflow.worker
  title: Dataflow Worker Role

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Identity and Access Management