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

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

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

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

始める前に

Cloud Console の使用

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

アクセス権の付与

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

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

    IAM ページを開きます

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

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

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

  5. 役割を選択します。役割はメンバーに適切な権限レベルを付与します。最善のセキュリティを得るため、必要最小限の権限をメンバーに付与することを強くおすすめします。オーナーレベルの権限を持つメンバーはプロジェクト オーナーでもあり、プロジェクトのシャットダウンを含めてプロジェクトのすべての側面を管理できます。

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

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

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

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

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

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

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

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

アクセス権を取り消す

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

    [IAM] ページを開く

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

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

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

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

アクセス権の変更

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

gcloud による更新

gcloud コマンドライン ツールを使用すると、アクセス権をすばやく付与または取り消すことができます。

アクセス権の付与

メンバーに役割をすばやく付与するには、gcloud ツールの add-iam-policy-binding コマンドを実行します。

    gcloud [GROUP] add-iam-policy-binding [RESOURCE] \
        --member [MEMBER] --role [ROLE_ID]
    

次の値を指定します。

  • [GROUP]: 更新するリソースの gcloud ツールグループ。たとえば、projects または organizations を使用できます。
  • [RESOURCE]: リソースの名前。
  • [MEMBER]: メンバーの識別子。通常、member_type:id の形式で指定します。例: user:alice@example.com[MEMBER] に使用できる値の一覧については、ポリシー バインディングのリファレンスをご覧ください。
  • [ROLE_ID]: 役割の名前。

たとえば、プロジェクト my-project のユーザー alice@example.com閲覧者の役割を付与するには、次のコマンドを使用します。

    gcloud projects add-iam-policy-binding my-project \
        --member user:alice@example.com --role roles/viewer
    

アクセス権を取り消す

ユーザーの役割をすばやく取り消すには、gcloud ツールの remove-iam-policy-binding コマンドを実行します。

    gcloud [GROUP] remove-iam-policy-binding [RESOURCE] \
        --member [MEMBER] --role [ROLE_ID]
    

次の値を指定します。

  • [GROUP]: 更新するリソースの gcloud ツールグループ。たとえば、projects または organizations を使用できます。
  • [RESOURCE]: リソースの名前。
  • [MEMBER]: メンバーの識別子。通常、member_type:id の形式で指定します。例: user:alice@example.com[MEMBER] に使用できる値の一覧については、ポリシー バインディングのリファレンスをご覧ください。
  • [ROLE_ID]: 役割の名前。

たとえば、プロジェクト my-project のユーザー bob@example.com閲覧者の役割を取り消すには、次のコマンドを使用します。

    gcloud projects remove-iam-policy-binding my-project \
        --member user:bob@example.com --role roles/viewer
    

プログラムによるアクセスの制御

プログラムでアクセス制御を管理したほうが簡単な場合もあります。プログラムでアクセスを制御するには、gcloud コマンドライン ツールREST API またはクライアント ライブラリを使用します。Cloud Console で大規模な更新や自動更新を行うと、処理に時間がかかることがあります。また、メンバーごとに gcloud コマンドを実行するのも手間がかかります。このような場合、プログラムを使用すると、効率的に作業を行うことができます。

Cloud IAM ポリシーの概要

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

次の例のポリシーでは、alice@example.comオーナー役割が付与され、bob@example.comservice-account-13@appspot.gserviceaccount.com編集者の役割が付与されています。

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

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

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

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

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

現在のポリシーの取得

gcloud コマンド

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

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

次の値を指定します。

  • [PROJECT_ID]: 更新するプロジェクト(たとえば my-project)。
  • [FORMAT]: 値 JSON または YAML
  • [FILEPATH]: ポリシーの新しい出力ファイルのパス。

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

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

REST API

getIamPolicy() を呼び出します。

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

[PROJECT_ID] は、情報を取得するプロジェクト(たとえば、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, version=1):
        """Gets IAM policy for a project."""

        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={"options": {"requestedPolicyVersion": version}},
            )
            .execute()
        )
        print(policy)
        return policy

    

ポリシーの変更

特定のユーザーに付与する役割または取り消す役割を反映する場合、プログラムまたはテキスト エディタを使用して、プロジェクトのポリシーのローカルコピーを変更します。

役割の付与

すでにポリシーに含まれている役割を付与するには:

gcloud コマンド

get-iam-policy コマンドで返された JSON または YAML ポリシーを編集して、役割を付与します。このポリシーの変更は、更新されたポリシーを設定するまで有効になりません。

次の例では、編集者の役割を eve@example.com に付与しています。この役割を付与するには、バインディングの members 配列にユーザーを追加します。

{
      "members": [
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:bob@example.com",
        "user:eve@example.com"
      ],
      "role": "roles/editor"
    }
    

REST API

get-iam-policy コマンドで返された JSON または YAML ポリシーを編集して、役割を付与します。このポリシーの変更は、更新されたポリシーを設定するまで有効になりません。

次の例では、編集者の役割を eve@example.com に付与しています。この役割を付与するには、バインディングの members 配列にユーザーを追加します。

{
      "members": [
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:bob@example.com",
        "user:eve@example.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 static 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 コマンド

get-iam-policy コマンドで返され JSON または YAML ポリシーを編集して、新しいバインディングを追加します。このポリシーの変更は、更新されたポリシーを設定するまで有効になりません。

次の例では、読み取りの役割を eve@example.com に付与しています。この役割を付与するには、新しいバインディングを bindings ポリシーの配列に追加します。

{
      "members": [
        "user:eve@example.com"
      ],
      "role": "roles/reader"
    }
    

REST API

get-iam-policy コマンドで返され JSON または YAML ポリシーを編集して、新しいバインディングを追加します。このポリシーの変更は、更新されたポリシーを設定するまで有効になりません。

次の例では、読み取りの役割を eve@example.com に付与しています。この役割を付与するには、新しいバインディングを bindings ポリシーの配列に追加します。

{
      "members": [
        "user:eve@example.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() リファレンス ドキュメントをご覧ください。

役割の取り消し

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

gcloud コマンド

get-iam-policy コマンドで返された JSON または YAML ポリシーを編集して、役割を取り消します。このポリシーの変更は、更新されたポリシーを設定するまで有効になりません。

メンバーの役割を取り消すには、ポリシーの bindings 配列から目的のメンバーまたはバインディングを削除します。

REST API

get-iam-policy コマンドで返された JSON または YAML ポリシーを編集して、役割を取り消します。このポリシーの変更は、更新されたポリシーを設定するまで有効になりません。

メンバーの役割を取り消すには、ポリシーの bindings 配列から目的のメンバーまたはバインディングを削除します。

C#

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


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

    public partial class AccessManager
    {
        public static Policy RemoveMember(Policy policy, string role, string member)
        {
            try
            {
                var binding = policy.Bindings.First(x => x.Role == role);
                if (binding.Members.Count != 0 && binding.Members.Contains(member))
                {
                    binding.Members.Remove(member);
                }
                if (binding.Members.Count == 0)
                {
                    policy.Bindings.Remove(binding);
                }
                return policy;
            }
            catch (System.InvalidOperationException e)
            {
                System.Diagnostics.Debug.WriteLine("Role does not exist in policy: \n" + e.ToString());
                return policy;
            }
        }
    }

Python

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

def modify_policy_remove_member(policy, role, member):
        """Removes a  member from a role binding."""
        binding = next(b for b in policy["bindings"] if b["role"] == role)
        if "members" in binding and member in binding["members"]:
            binding["members"].remove(member)
        print(binding)
        return policy

    

ポリシーの設定

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

gcloud コマンド

set-iam-policy コマンドを使用して、更新されたポリシーを含む JSON ファイルのパスを指定します。

    gcloud projects set-iam-policy [PROJECT_ID] [FILEPATH]
    

次の値を指定します。

  • [PROJECT_ID]: 更新するプロジェクト(たとえば my-project)。
  • [FILEPATH]: 新しいポリシーを含むファイルのパス。

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

REST API

setIamPolicy() を呼び出します。

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

[PROJECT_ID] は、更新するプロジェクトで置き換えます(たとえば、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."""

        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 を比較し、値が一致する場合にのみポリシーを書き込みます。

次のステップ