リソースへのアクセス権の付与、変更、取り消し

このページでは、リソースへのアクセス権を付与、変更、取り消す方法について説明します。Cloud IAM の細かな役割を使用することによって、所有しているリソースへの異なるレベルのアクセス権をさまざまなユーザーに付与できます。

ユーザーの役割を管理するには、GCP Console、gcloud コマンドライン ツール、REST API、またはクライアント ライブラリを使用します。この記事の前半で説明するように、GCP Console を使用するのが最も簡単な方法でます。より複雑なシナリオのためのプログラム手法の使用については、後で説明します。

Cloud IAM と Cloud Identity-Aware Proxy(Cloud IAP)を使用してアプリケーションへのアクセスを保護する場合は、Cloud IAP のドキュメントをご覧ください。

始める前に

GCP Console の使用

GCP Console を使用すると、ユーザーの役割をすばやく簡単に管理できます。 ユーザーに役割を付与すると、招待メールが送信されなくなります。ユーザーのアクセス権は直接更新されます。

アクセスの許可

チームメンバーをプロジェクトに追加し、Cloud IAM の役割を付与するには:

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

    [IAM] ページを開く

  2. [プロジェクトを選択] をクリックし、プロジェクトを選択して [開く] をクリックします。

  3. [追加] をクリックします。

  4. メールアドレスを入力します。個人、サービス アカウント、Google グループをメンバーとして追加することはできますが、すべてのプロジェクトに少なくとも 1 人のメンバーが必要です。

  5. 役割を選択します。役割はメンバーに適切な権限レベルを付与します。メンバーに与える権限は最小限の権限に留めることを推奨します。オーナーレベルの権限を持つメンバーはプロジェクト オーナーでもあり、プロジェクトのシャットダウンを含めてプロジェクトのすべての側面を管理できます。

  6. [保存] をクリックします。

複数のプロジェクトに関して、1 人のメンバーに 1 つの役割を付与するには:

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

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

  2. 権限を付与するプロジェクトをすべて選択します。

  3. [情報パネルを表示] をクリックし、[権限] タブをクリックします。

  4. [メンバーを追加] フィールドにメールアドレスを入力し、プルダウン メニューから目的の役割を選択します。

  5. [追加] ボタンをクリックします。メンバーは、選択された各プロジェクトで選択された役割を付与されます。

アクセス権の取り消し

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

    [IAM] ページを開く

  2. [プロジェクトを選択] をクリックします。

  3. プロジェクトを選択して [開く] をクリックします。

  4. アクセスを取り消すメンバーを見つけて、右側の [編集](edit)ボタンをクリックします。

  5. 取り消す役割ごとに [削除](delete)ボタンをクリックし、[保存] をクリックします。

アクセス権の変更

アクセスを変更するための特別な手順はありません。ユーザーが目的の役割を得られるまで、アクセス権の許可と取り消しの手順に従います。

gcloud、REST API、またはクライアント ライブラリを使用する

場合によっては、GCP Console を使用するのではなく、プログラムによってアクセス制御を管理する方が簡単です。gcloud コマンドライン ツール、REST API、または Cloud IAM のクライアント ライブラリを使用できます。プログラムを利用する方法は、GCP Console で行うと時間がかかる大規模な更新や自動更新を行う場合に特に便利です。

gcloud コマンドライン ツールを使用した迅速な更新

コマンドラインを使用して 1 人のユーザーに対して役割の付与または取り消しを迅速に行うには、add-iam-policy-binding コマンドと remove-iam-policy-binding コマンドを使用します。追加または削除するう役割ごとに --roleフラグを渡します。

役割を付与するには:

gcloud [GROUP] add-iam-policy-binding [RESOURCE-NAME]
  --member user:[USER-EMAIL] --role [ROLE-ID]

役割を取り消すには、次のコマンドを実行します。

gcloud [GROUP] remove-iam-policy-binding [RESOURCE-NAME]
  --member user:[EMAIL] --role [ROLE-ID]

[GROUP] は、アクセス権を付与するリソースの gcloud グループです(projectsorganizations など)。[RESOURCE] はリソースの名前です。[EMAIL] は役割の付与先であるユーザーです。[ROLE-ID] は、付与する役割の ID です。

以下の例では、user-1@gmail.com にプロジェクト my-project の閲覧者の役割を付与します(プロジェクトにオーナーの役割を追加するのは、コンソールでのみ可能です)。

gcloud projects add-iam-policy-binding my-project
  --member user:user-1@gmail.com --role roles/viewer

Cloud IAM ポリシーの概要

リソースへのアクセスは、Cloud IAM ポリシーによって管理されます。 ポリシーは、ユーザー アカウントやサービス アカウントなどのメンバーを役割に関連付けるバインディングのコレクションです。ポリシーは JSON または YAML を使用して表現されます。

以下にポリシーの例を示します。user-1@gmail.com にオーナーの役割が付与され、user-2@gmail.com と service-account-13@appspot.gserviceaccount.com に編集者の役割が付与されます。

{
  "bindings":[
    {
      "members":[
        "user:user-1@gmail.com"
      ],
      "role":"roles/owner"
    },
    {
      "members":[
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:user-2@gmail.com"
      ],
      "role":"roles/editor"
    }
  ],
  "etag":"BwUjMhCsNvY=",
  "version":1
}

リソースのポリシーを更新するには、read-modify-write パターンを使用します。つまり、ユーザーのアクセス権の作成、変更、取り消しのために専用のメソッドはありません。代わりに、すべての変更は次の手順で行われます。

  1. getIamPolicy() を呼び出して、現在のポリシーを読み取ります。
  2. テキスト エディタを使用するかプログラムを使用して、返されたポリシーを編集し、目的のメンバーとそのメンバーに付与される役割の追加や削除を行います。
  3. setIamPolicy() を呼び出して、更新されたポリシーを書き込みます。

プロジェクト全体、または組織全体に権限を付与することは一般的です。ただし、Compute Engine のインスタンスCloud Storage のバケットなどの GCP リソースに対して、細かいレベルでポリシーを設定することもできます。役割の全リストと、各役割を付与できる最も低いリソースレベルについては、役割についてをご覧ください。

以下のセクションでは、プロジェクトのポリシーの取得、変更、設定の方法について説明します。

ポリシーの取得

gcloud コマンド

get-iam-policy コマンドを実行します。

gcloud projects get-iam-policy [PROJECT] --format [FORMAT] > [FILE-PATH]

[PROJECT] はプロジェクトの名前です。[FORMAT] は JSON または YAML です。[FILE-PATH] は、ポリシーを保存するディスク上のパスです。

たとえば、次の例では、プロジェクト my-project のポリシーが JSON 形式で取得され、ユーザーのホーム ディレクトリに保存されます。

gcloud projects get-iam-policy my-project --format json > ~/policy.json

レスポンスは、ポリシーになります。

REST API

getIamPolicy() を呼び出します。

POST https://cloudresourcemanager.googleapis.com/v1/[PROJECT]:getIamPolicy

[PROJECT] は、ポリシーを取得するリソースの名前です(たとえば、projects/my-project)。

レスポンスは、ポリシーになります。

C#

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用の C# の設定手順に従ってください。 詳細については、Cloud IAM C# API のリファレンス ドキュメントをご覧ください。


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy GetPolicy(string projectId)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        var policy = service.Projects.GetIamPolicy(new GetIamPolicyRequest(),
            projectId).Execute();
        return policy;
    }
}

Python

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用の Python の設定手順に従ってください。 詳細については、Cloud IAM Python API のリファレンス ドキュメントをご覧ください。

def get_policy(project_id):
    """Gets IAM policy for a project."""

    # pylint: disable=no-member
    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
        scopes=['https://www.googleapis.com/auth/cloud-platform'])
    service = googleapiclient.discovery.build(
        'cloudresourcemanager', 'v1', credentials=credentials)
    policy = service.projects().getIamPolicy(
        resource=project_id, body={}).execute()
    print(policy)
    return policy

ポリシーの変更

プログラムまたはテキスト エディタを使用してポリシーを変更し、特定のユーザーへの役割の付与や取り消しを行います。

ユーザーに既存の役割を付与するには:

gcloud コマンド

次の例では、テキスト エディタでバインディングの下の members 配列にメールアドレスを追加して、user-3@gmail.com編集者の役割を付与します。

{
  "members":[
    "serviceAccount:service-account-13@appspot.gserviceaccount.com",
    "user:user-2@gmail.com",
    "user:user-3@gmail.com"
  ],
  "role":"roles/editor"
}

REST API

次の例では、テキスト エディタでバインディングの下の members 配列にメールアドレスを追加して、user-3@gmail.com編集者の役割を付与します。

{
  "members":[
    "serviceAccount:service-account-13@appspot.gserviceaccount.com",
    "user:user-2@gmail.com",
    "user:user-3@gmail.com"
  ],
  "role":"roles/editor"
}

C#

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用の C# の設定手順に従ってください。 詳細については、Cloud IAM C# API のリファレンス ドキュメントをご覧ください。


using System.Linq;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public Policy AddMember(Policy policy, string role, string member)
    {
        var binding = policy.Bindings.First(x => x.Role == role);
        binding.Members.Add(member);
        return policy;
    }
}

Python

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用の Python の設定手順に従ってください。 詳細については、Cloud IAM Python API のリファレンス ドキュメントをご覧ください。

def modify_policy_add_member(policy, role, member):
    """Adds a new member to a role binding."""

    binding = next(b for b in policy['bindings'] if b['role'] == role)
    binding['members'].append(member)
    print(binding)
    return policy

まだ存在していない新しい役割にユーザーを追加するには、新しい binding を追加します。

gcloud コマンド

テキスト エディタを使用して、新しい bindingbindings 配列に追加します。次の例では、user-3@gmail.com読み取りの役割を付与します。

{
  "members":[
    "user:user-3@gmail.com"
  ],
  "role":"roles/reader"
}

REST API

テキスト エディタを使用して、新しい bindingbindings 配列に追加します。次の例では、user-3@gmail.com読み取りの役割を付与します。

{
  "members":[
    "user:user-3@gmail.com"
  ],
  "role":"roles/reader"
}

C#

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用の C# の設定手順に従ってください。 詳細については、Cloud IAM C# API のリファレンス ドキュメントをご覧ください。


using System.Collections.Generic;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy AddBinding(Policy policy, string role, string member)
    {
        var binding = new Binding
        {
            Role = role,
            Members = new List<string> { member }
        };
        policy.Bindings.Add(binding);
        return policy;
    }
}

Python

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用の Python の設定手順に従ってください。 詳細については、Cloud IAM Python API のリファレンス ドキュメントをご覧ください。

def modify_policy_add_role(policy, role, member):
    """Adds a new role binding to a policy."""

    binding = {
        'role': role,
        'members': [member]
    }
    policy['bindings'].append(binding)
    print(policy)
    return policy

アクセス権を取り消すには、目的のメンバーまたはバインディング全体を削除します。メンバーがいない空のバインディングは許可されません。

アクティブ化された API サービスに関連する役割のみを付与できます。Compute Engine などのサービスが有効でない場合は、Compute Engine のみに関連する役割を付与することはできません。詳細については、API を有効または無効にするをご覧ください。

プロジェクトに権限を付与する場合、特にオーナーの役割を付与するときには、いくつかの制約があります。詳細については、projects.setIamPolicy() リファレンス ドキュメントをご覧ください。

ポリシーの設定

必要な役割を付与するようにポリシーを変更したら、setIamPolicy() を呼び出して更新を行います。

gcloud コマンド

更新されたポリシーが含まれる JSON ファイルへのパスを指定して set-iam-policy コマンドを実行します。

gcloud projects set-iam-policy [PROJECT] [FILE-PATH]

get-iam-policyと同様に、[PROJECT] はポリシーを設定するプロジェクトの名前です。[FILE-PATH] は、新しいポリシーが含まれるファイルへのパスです。

レスポンスは、更新されたポリシーになります。

REST API

setIamPolicy() を呼び出します。

POST https://cloudresourcemanager.googleapis.com/v1/[PROJECT]:setIamPolicy

[PROJECT] は、ポリシーを設定するリソースの名前です(たとえば、projects/my-project)。

リクエストの本文には、更新された IAM ポリシーが含まれている必要があります。

レスポンスは、更新されたポリシーになります。

C#


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy SetPolicy(string projectId, Policy policy)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        return service.Projects.SetIamPolicy(new SetIamPolicyRequest
        {
            Policy = policy
        }, projectId).Execute();
    }
}

Python

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用の Python の設定手順に従ってください。 詳細については、Cloud IAM Python API のリファレンス ドキュメントをご覧ください。

def set_policy(project_id, policy):
    """Sets IAM policy for a project."""

    # pylint: disable=no-member
    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
        scopes=['https://www.googleapis.com/auth/cloud-platform'])
    service = googleapiclient.discovery.build(
        'cloudresourcemanager', 'v1', credentials=credentials)

    policy = service.projects().setIamPolicy(
        resource=project_id, body={
            'policy': policy
        }).execute()
    print(policy)
    return policy

複数のソースで同時にポリシーの更新が試行される場合の衝突を防ぐために、ポリシーには etag 値が含まれています。setIamPolicy() を呼び出すと、Cloud IAM はリクエスト内の etag 値と既存の etag を比較し、値が一致する場合にのみポリシーを書き込みます。

次のステップ

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

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

Cloud IAM のドキュメント