授予、更改和撤消对资源的访问权限

本页介绍了如何授予、更改和撤消对资源的访问权限。对于您所拥有的资源,您可以使用精确的 Cloud IAM 角色,将不同级别的访问权限授予不同的用户。

您可以通过 Cloud Console、gcloud 命令行工具、REST API 或客户端库管理用户角色。使用 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 群组添加为成员,但每个项目必须至少有一名个人成员。

  5. 选择角色。角色可赋予成员相应级别的权限。为采取确保安全性的最佳做法,我们强烈建议向成员授予其所需的最小权限。拥有 Owner 级别权限的成员同时也是项目所有者,可以管理项目的所有方面,包括关停项目。

  6. 点击保存

要向成员授予多个项目的角色,请执行以下操作:

  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 工具组。例如,您可以使用 projectsorganizations
  • [RESOURCE]:资源的名称。
  • [MEMBER]:成员的标识符,通常其格式如下:member_type:id。例如 user:alice@example.com。如需 [MEMBER] 可以采用的值的完整列表,请参阅政策绑定参考文档
  • [ROLE_ID]:角色的名称。

例如,要向项目 my-project 的用户 alice@example.com 授予 Viewer 角色,请使用以下命令:

    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 工具组。例如,您可以使用 projectsorganizations
  • [RESOURCE]:资源的名称。
  • [MEMBER]:成员的标识符,通常其格式如下:member_type:id。例如 user:alice@example.com。如需 [MEMBER] 可以采用的值的完整列表,请参阅政策绑定参考文档
  • [ROLE_ID]:角色的名称。

例如,要撤消项目 my-project 的用户 bob@example.comViewer 角色,请使用以下命令:

    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 已被授予 Owner 角色,bob@example.comservice-account-13@appspot.gserviceaccount.com 已被授予 Editor 角色:

{
      "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
    }
    

您可以使用“读取-修改-写入”模式更新资源的政策。也就是说,创建、修改或撤消用户访问权限所采用的方法并无不同。相反,所有修改均通过以下方式进行:

  1. 通过调用 getIamPolicy() 读取当前政策。
  2. 使用文本编辑器或以编程方式修改返回的政策,以添加或移除任何目标成员以及为其授予的角色。
  3. 通过调用 setIamPolicy() 写入更新后的政策。

为整个项目或组织授予权限是很常见的做法。但是,您还可以针对各种Google Cloud 资源更精细地设置政策(例如 Compute Engine 实例Cloud Storage 存储分区)。如需查看角色的完整列表以及可以授予各角色的最低资源级别,请参阅了解角色

以下几个部分展示了如何获取、修改和设置项目的政策。

获取当前政策

gcloud 命令

运行 get-iam-policy 命令:

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

请提供以下值:

  • [PROJECT_ID]:要更新的项目(例如 my-project)。
  • [FORMAT]:值 JSONYAML
  • [FILEPATH]:政策新输出文件的路径。

例如,以下命令以 JSON 格式获取项目 my-project 的政策,并将其保存到用户的主目录:

    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 授予 Editor 角色。要授予此角色,请将用户附加到 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 授予 Editor 角色。要授予此角色,请将用户附加到 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 授予 Reader 角色。要授予此角色,请向政策的 bindings 数组添加新绑定:

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

REST API

通过修改由 get-iam-policy 命令返回的 JSON 或 YAML 政策来添加新绑定。请注意,此政策更改将在设置更新后的政策后才会生效。

以下示例会向 eve@example.com 授予 Reader 角色。要授予此角色,请向政策的 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

在项目上授予权限时有一些独特的限制,授予 Owner 角色时尤其如此。如需了解详情,请参阅 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 进行比较,并且仅当值匹配时才会写入政策。

后续步骤