管理对项目、文件夹和组织的访问权限

本页面介绍如何授予、更改和撤消项目、文件夹和组织的访问权限。如需了解如何管理对其他资源的访问权限,请参阅以下指南:

在 Identity and Access Management (IAM) 中,访问权限通过 IAM 政策进行管理。IAM 政策已附加到 Google Cloud 资源。每个政策都包含一组角色绑定,这些角色绑定会将一个或多个主帐号(例如用户或服务帐号)与 IAM 角色相关联。这些角色绑定会向指定主帐号授予指定的角色,包括针对政策附加的资源以及资源的所有后代。如需详细了解 IAM 政策,请参阅了解政策

您可以使用 Google Cloud Console、gcloud 命令行工具、REST API 或 Resource Manager 客户端库管理对项目、文件夹和组织的访问权限。

准备工作

启用 Cloud Resource Manager API。

启用 API

所需权限

如需管理对项目、文件夹或组织的访问权限,您需要包含以下权限的角色,其中 RESOURCE_TYPE 是主帐号将管理其访问权限的资源类型(projectsfoldersorganizations):

  • resourcemanager.RESOURCE_TYPE.get
  • resourcemanager.RESOURCE_TYPE.getIamPolicy
  • resourcemanager.RESOURCE_TYPE.setIamPolicy

如需获得这些权限,同时遵循最小权限原则,请让管理员向您授予以下角色之一:

  • 如需管理对项目的访问权限:Project IAM Admin (roles/resourcemanager.projectIamAdmin)
  • 管理对项目和文件夹的访问权限:Folder Admin (roles/resourcemanager.folderAdmin)
  • 要管理对项目、文件夹和组织的访问权限:Organization Admin (roles/resourcemanager.organizationAdmin)
  • 如需管理几乎所有 Google Cloud 资源的访问权限:Security Admin (roles/iam.securityAdmin)

或者,管理员也可以向您授予具有所需权限的其他角色,例如自定义角色或更宽松的预定义角色

查看当前访问权限

您可以使用 Cloud Console、gcloud 工具、REST API 或 Resource Manager 客户端库查看谁有权访问您的项目、文件夹或组织。

控制台

  1. 在 Cloud Console 中,转到 IAM 页面。

    转到 IAM

  2. 选择一个项目、文件夹或组织。

    Cloud Console 会列出已被授予您的项目、文件夹或组织的所有角色的主帐号。此列表包括从父级资源继承资源角色的主帐号。如需详细了解政策沿用,请参阅政策沿用和资源层次结构

  3. 可选:如需查看 Google 管理的服务帐号的角色授予,请选中包括 Google 提供的角色授予复选框。

gcloud

要查看谁有权访问您的项目、文件夹或组织,请获取资源的 IAM 政策。如需了解如何解读 IAM 政策,请参阅了解政策

如需获取资源的 IAM 政策,请运行资源的 get-iam-policy 命令:

gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT > PATH

请提供以下值:

  • RESOURCE_TYPE:您要查看其访问权限的资源的类型。请使用以下某个值:projectsresource-manager foldersorganizations
  • RESOURCE_ID:您的 Google Cloud 项目、文件夹或组织 ID。项目 ID 为字母数字,例如 my-project。文件夹和组织 ID 是数字,例如 123456789012
  • FORMAT:政策所需的格式。请使用 jsonyaml
  • PATH:指向政策的新输出文件的路径。

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

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

REST

要查看谁有权访问您的项目、文件夹或组织,请获取资源的 IAM 政策。如需了解如何解读 IAM 政策,请参阅了解政策

Resource Manager API 的 getIamPolicy 方法可获取项目、文件夹或组织的 IAM 政策。

在使用任何请求数据之前,请先进行以下替换:

  • API_VERSION:要使用的 API 版本。对于项目和组织,请使用 v1。对于文件夹,请使用 v2
  • RESOURCE_TYPE:您要管理其政策的资源类型。使用值 projectsfoldersorganizations
  • RESOURCE_ID:您的 Google Cloud 项目、组织或文件夹 ID。 项目 ID 是字母数字字符串,例如 my-project。文件夹和组织 ID 是数字,例如 123456789012
  • POLICY_VERSION:要返回的政策版本。请求应指定最新的政策版本,即政策版本 3。如需了解详情,请参阅在获取政策时指定政策版本

HTTP 方法和网址:

POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:getIamPolicy

请求 JSON 正文:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

如需发送您的请求,请展开以下选项之一:

响应内容包含资源的 IAM 政策。例如:

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:owner@example.com"
      ]
    }
  ]
}

C#


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;
    }
}

Java

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.v3.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.v3.model.GetIamPolicyRequest;
import com.google.api.services.cloudresourcemanager.v3.model.Policy;
import com.google.api.services.iam.v1.IamScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class GetPolicy {

  // Gets a project's policy.
  public static Policy getPolicy(String projectId) {
    // projectId = "my-project-id"

    Policy policy = null;

    CloudResourceManager service = null;
    try {
      service = createCloudResourceManagerService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return policy;
    }

    try {
      GetIamPolicyRequest request = new GetIamPolicyRequest();
      policy = service.projects().getIamPolicy(projectId, request).execute();
      System.out.println("Policy retrieved: " + policy.toString());
      return policy;
    } catch (IOException e) {
      System.out.println("Unable to get policy: \n" + e.toString());
      return policy;
    }
  }

  public static CloudResourceManager createCloudResourceManagerService()
      throws IOException, GeneralSecurityException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));

    CloudResourceManager service =
        new CloudResourceManager.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

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

授予或撤消单个角色

您可以使用 Cloud Console 和 gcloud 工具快速授予或撤消单个主帐号的单个角色,而无需直接修改资源的 IAM 政策。常见的主帐号类型包括 Google 帐号、服务帐号、Google 群组和网域。如需查看所有主帐号类型的列表,请参阅与身份相关的概念

授予单个角色

如需向主帐号授予单个角色,请执行以下操作:

控制台

  1. 在 Cloud Console 中,转到 IAM 页面。

    转到 IAM

  2. 选择一个项目、文件夹或组织。

  3. 选择要向其授予一个角色的主帐号:

    • 如需向已在资源上具有其他角色的主帐号授予角色,请找到包含该主帐号电子邮件地址的行,点击该行中的 修改主帐号,然后点击 添加其他角色

      要向 Google 代管的服务帐号授予角色,请选中包括 Google 提供的角色授予复选框以查看其电子邮件地址。

    • 要向尚未拥有资源其他角色的主帐号授予角色,请点击 添加,然后输入该主帐号的电子邮件地址。

  4. 从下拉列表中选择要授予的角色。按照确保安全性的最佳做法,请选择一个仅包含主帐号所需权限的角色。

  5. 可选:为角色添加条件

  6. 点击保存。将向主帐号授予资源上的角色。

如需针对多个项目、文件夹或组织向主帐号授予角色,请执行以下操作:

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

  2. 选择要为其授予权限的所有资源。

  3. 如果信息面板尚未显示,请点击显示信息面板。然后,点击权限

  4. 选择要向其授予一个角色的主帐号:

    • 如需向已具有其他角色的主帐号授予角色,请找到包含主帐号电子邮件地址的行,点击该行中的 修改主帐号,然后点击 添加其他角色

    • 如需向尚未拥有其他角色的主帐号授予角色,请点击 添加主帐号,然后输入该主帐号的电子邮件地址。

  5. 从下拉列表中选择要授予的角色。

  6. 可选:为角色添加条件

  7. 点击保存。系统会为主帐号授予各个选中资源上的所选角色。

gcloud

要快速向主帐号授予角色,请运行 add-iam-policy-binding 命令:

gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID \
    --member=PRINCIPAL --role=ROLE_ID \
    --condition=CONDITION

请提供以下值:

  • RESOURCE_TYPE:要管理其访问权限的资源类型。请使用 projectsresource-manager foldersorganizations
  • RESOURCE_ID:您的 Google Cloud 项目、文件夹或组织 ID。项目 ID 为字母数字,例如 my-project。文件夹和组织 ID 是数字,例如 123456789012
  • PRINCIPAL:主帐号(或成员)的标识符,通常其格式如下:PRINCIPAL_TYPE:ID。例如 user:my-user@example.com。如需 PRINCIPAL 可以采用的值的完整列表,请参阅政策绑定参考文档

    对于主帐号类型 user,标识符中的域名必须是 Google Workspace 网域或 Cloud Identity 网域。如需了解如何设置 Cloud Identity 网域,请参阅 Cloud Identity 概览

  • ROLE_ID:您要授予的角色的名称。例如 roles/resourcemanager.projectCreator。如需查看角色列表,请参阅了解角色

  • CONDITION:可选。要添加到角色绑定的条件。如需详细了解条件,请参阅条件概览

例如,要针对项目 my-project 向用户 my-user@example.com 授予 Project Creator 角色:

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

撤消单个角色

如需撤消主帐号的单个角色,请执行以下操作:

控制台

  1. 在 Cloud Console 中,转到 IAM 页面。

    转到 IAM

  2. 选择一个项目、文件夹或组织。

  3. 找到要撤消其访问权限的主帐号的电子邮件地址所在的行。然后,点击该行中的 修改主帐号

  4. 点击要撤消的每个角色对应的删除 按钮,然后点击保存

gcloud

要快速撤消用户的角色,请运行 remove-iam-policy-binding 命令:

gcloud RESOURCE_TYPE remove-iam-policy-binding RESOURCE_ID \
    --member=PRINCIPAL --role=ROLE_ID

请提供以下值:

  • RESOURCE_TYPE:要管理其访问权限的资源类型。请使用 projectsresource-manager foldersorganizations
  • RESOURCE_ID:您的 Google Cloud 项目、文件夹或组织 ID。项目 ID 为字母数字,例如 my-project。文件夹和组织 ID 是数字,例如 123456789012
  • PRINCIPAL:主帐号(或成员)的标识符,通常其格式如下:PRINCIPAL_TYPE:ID。例如 user:my-user@example.com。如需 PRINCIPAL 可以采用的值的完整列表,请参阅政策绑定参考文档

    对于主帐号类型 user,标识符中的域名必须是 Google Workspace 网域或 Cloud Identity 网域。如需了解如何设置 Cloud Identity 网域,请参阅 Cloud Identity 概览

  • ROLE_ID:要撤消的角色的名称。例如 roles/resourcemanager.projectCreator。如需查看角色列表,请参阅了解角色

例如,如需撤消项目 my-project 的用户 my-user@example.com 的 Project Creator 角色,请使用以下命令:

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

授予或撤消多个角色

如需进行涉及访问权限和撤消多个角色的大规模访问权限更改,请使用读取-修改-写入模式更新资源的 IAM 政策:

  1. 通过调用 getIamPolicy() 读取当前政策。
  2. 使用文本编辑器或以编程方式修改返回的政策,以添加或移除任何主帐号或角色绑定。
  3. 通过调用 setIamPolicy() 写入更新后的政策。

您可以使用 gcloud 工具、REST API 或 Resource Manager 客户端库来更新政策。

获取当前政策

gcloud

如需获取资源的 IAM 政策,请运行资源的 get-iam-policy 命令:

gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT > PATH

请提供以下值:

  • RESOURCE_TYPE:要获取政策的资源类型。请使用以下某个值:projectsresource-manager foldersorganizations
  • RESOURCE_ID:您的 Google Cloud 项目、文件夹或组织 ID。项目 ID 为字母数字,例如 my-project。文件夹和组织 ID 是数字,例如 123456789012
  • FORMAT:政策所需的格式。请使用 jsonyaml
  • PATH:指向政策的新输出文件的路径。

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

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

REST

Resource Manager API 的 getIamPolicy 方法可获取项目、文件夹或组织的 IAM 政策。

在使用任何请求数据之前,请先进行以下替换:

  • API_VERSION:要使用的 API 版本。对于项目和组织,请使用 v1。对于文件夹,请使用 v2
  • RESOURCE_TYPE:您要管理其政策的资源类型。使用值 projectsfoldersorganizations
  • RESOURCE_ID:您的 Google Cloud 项目、组织或文件夹 ID。 项目 ID 是字母数字字符串,例如 my-project。文件夹和组织 ID 是数字,例如 123456789012
  • POLICY_VERSION:要返回的政策版本。请求应指定最新的政策版本,即政策版本 3。如需了解详情,请参阅在获取政策时指定政策版本

HTTP 方法和网址:

POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:getIamPolicy

请求 JSON 正文:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

如需发送您的请求,请展开以下选项之一:

响应内容包含资源的 IAM 政策。例如:

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:owner@example.com"
      ]
    }
  ]
}

将响应保存在相应类型(jsonyaml)的文件中。

C#


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;
    }
}

Java

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.v3.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.v3.model.GetIamPolicyRequest;
import com.google.api.services.cloudresourcemanager.v3.model.Policy;
import com.google.api.services.iam.v1.IamScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class GetPolicy {

  // Gets a project's policy.
  public static Policy getPolicy(String projectId) {
    // projectId = "my-project-id"

    Policy policy = null;

    CloudResourceManager service = null;
    try {
      service = createCloudResourceManagerService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return policy;
    }

    try {
      GetIamPolicyRequest request = new GetIamPolicyRequest();
      policy = service.projects().getIamPolicy(projectId, request).execute();
      System.out.println("Policy retrieved: " + policy.toString());
      return policy;
    } catch (IOException e) {
      System.out.println("Unable to get policy: \n" + e.toString());
      return policy;
    }
  }

  public static CloudResourceManager createCloudResourceManagerService()
      throws IOException, GeneralSecurityException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));

    CloudResourceManager service =
        new CloudResourceManager.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

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

修改政策

通过编程或文本编辑器修改资源政策的本地副本,以反映您要针对给定用户授予或撤消的角色。

如需确保您不会覆盖其他政策更改,请勿修改或移除政策的 etag 字段。etag 字段标识当前政策状态。在您设置更新后的政策后,IAM 会将请求中的 etag 值与现有的 etag 进行比较,并且仅当值匹配时才会写入政策。

授予角色

要向主帐号授予角色,请修改政策中的角色绑定。如需了解您可以授予哪些角色,请参阅了解角色查看可授予的资源角色

如需授予政策中已包含的角色,请将该主帐号添加到现有角色绑定:

gcloud

将主帐号添加到现有角色绑定,以修改返回的政策。请注意,此政策更改在您设置更新后的政策后才会生效。

例如,假设返回的政策包含以下角色绑定,其将 Security Reviewer 角色 (roles/iam.securityReviewer) 授予 kai@example.com

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com"
  ]
}

如需向 raha@example.com 授予相同的角色,请将 raha@example.com 添加到现有角色绑定:

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

REST

将主帐号添加到现有角色绑定,以修改返回的政策。请注意,此政策更改在您设置更新后的政策后才会生效。

例如,假设返回的政策包含以下角色绑定,其将 Security Reviewer 角色 (roles/iam.securityReviewer) 授予 kai@example.com

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com"
  ]
}

如需向 raha@example.com 授予相同的角色,请将 raha@example.com 添加到现有角色绑定:

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

C#

如需了解如何安装和使用 Secret Manager 客户端库,请参阅 Resource Manager 客户端库


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;
    }
}

Java

如需了解如何安装和使用 Secret Manager 客户端库,请参阅 Resource Manager 客户端库

import com.google.api.services.cloudresourcemanager.v3.model.Binding;
import com.google.api.services.cloudresourcemanager.v3.model.Policy;
import java.util.List;

public class AddMember {

  // Adds a member to a preexisting role.
  public static void addMember(Policy policy) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();

    String role = "roles/existing-role";
    String member = "user:member-to-add@example.com";

    List<Binding> bindings = policy.getBindings();

    for (Binding b : bindings) {
      if (b.getRole().equals(role)) {
        b.getMembers().add(member);
        System.out.println("Member " + member + " added to role " + role);
        return;
      }
    }

    System.out.println("Role not found in policy; member not added");
  }
}

Python

如需了解如何安装和使用 Secret Manager 客户端库,请参阅 Resource Manager 客户端库

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

要授予政策中未包含的角色,请添加新的角色绑定:

gcloud

通过添加向主帐号授予该角色的新角色绑定来修改返回的政策。此政策更改将在设置更新后的政策后才会生效。

例如,如需向 raha@example.com 授予 Compute Storage Admin 角色 (roles/compute.storageAdmin),请将以下角色绑定添加到政策的 bindings 数组中:

{
  "role": "roles/compute.storageAdmin",
  "members": [
    "user:raha@example.com"
  ]
}

REST

通过添加向主帐号授予该角色的新角色绑定来修改返回的政策。此政策更改将在设置更新后的政策后才会生效。

例如,如需向 raha@example.com 授予 Compute Storage Admin 角色 (roles/compute.storageAdmin),请将以下角色绑定添加到政策的 bindings 数组中:

{
  "role": "roles/compute.storageAdmin",
  "members": [
    "user:raha@example.com"
  ]
}

C#

如需了解如何安装和使用 Secret Manager 客户端库,请参阅 Resource Manager 客户端库


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;
    }
}

Java

如需了解如何安装和使用 Secret Manager 客户端库,请参阅 Resource Manager 客户端库

import com.google.api.services.cloudresourcemanager.v3.model.Binding;
import com.google.api.services.cloudresourcemanager.v3.model.Policy;
import java.util.ArrayList;
import java.util.List;

public class AddBinding {

  // Adds a member to a role with no previous members.
  public static void addBinding(Policy policy) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();

    String role = "roles/role-to-add";
    List<String> members = new ArrayList<String>();
    members.add("user:member-to-add@example.com");

    Binding binding = new Binding();
    binding.setRole(role);
    binding.setMembers(members);

    policy.getBindings().add(binding);
    System.out.println("Added binding: " + binding.toString());
  }
}

Python

如需了解如何安装和使用 Secret Manager 客户端库,请参阅 Resource Manager 客户端库

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 (roles/owner) 角色时尤其如此。如需了解详情,请参阅 projects.setIamPolicy() 参考文档

撤消角色

如需撤消角色,请从角色绑定中移除该主帐号。如果角色绑定中没有其他主帐号,请移除整个角色绑定。

gcloud

通过修改由 get-iam-policy 命令返回的 JSON 或 YAML 政策来撤消角色。此政策更改将在设置更新后的政策后才会生效。

如需撤消主帐号的角色,请在政策的 bindings 数组中删除所需的主帐号或绑定。

REST

通过修改由 get-iam-policy 命令返回的 JSON 或 YAML 政策来撤消角色。此政策更改将在设置更新后的政策后才会生效。

如需撤消主帐号的角色,请在政策的 bindings 数组中删除所需的主帐号或绑定。

C#

如需了解如何安装和使用 Secret Manager 客户端库,请参阅 Resource Manager 客户端库


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;
        }
    }
}

Java

如需了解如何安装和使用 Secret Manager 客户端库,请参阅 Resource Manager 客户端库

import com.google.api.services.cloudresourcemanager.v3.model.Binding;
import com.google.api.services.cloudresourcemanager.v3.model.Policy;
import java.util.List;

public class RemoveMember {

  // Removes member from a role; removes binding if binding contains 0 members.
  public static void removeMember(Policy policy) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();

    String role = "roles/existing-role";
    String member = "user:member-to-remove@example.com";

    List<Binding> bindings = policy.getBindings();
    Binding binding = null;
    for (Binding b : bindings) {
      if (b.getRole().equals(role)) {
        binding = b;
      }
    }
    if (binding.getMembers().contains(member)) {
      binding.getMembers().remove(member);
      System.out.println("Member " + member + " removed from " + role);
      if (binding.getMembers().isEmpty()) {
        policy.getBindings().remove(binding);
      }
      return;
    }

    System.out.println("Role not found in policy; member not removed");
    return;
  }
}

Python

如需了解如何安装和使用 Secret Manager 客户端库,请参阅 Resource Manager 客户端库

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

如需设置资源的 IAM 政策,请运行资源的 set-iam-policy 命令:

gcloud RESOURCE_TYPE set-iam-policy RESOURCE_ID PATH

请提供以下值:

  • RESOURCE_TYPE:您要设置政策的资源的类型。请使用以下某个值:projectsresource-manager foldersorganizations
  • RESOURCE_ID:您的 Google Cloud 项目、文件夹或组织 ID。项目 ID 为字母数字,例如 my-project。文件夹和组织 ID 是数字,例如 123456789012
  • PATH:包含新政策的文件的路径。

响应中包含更新后的政策。

例如,以下命令将存储在 policy.json 中的政策设置为项目 my-project 的政策:

gcloud projects set-iam-policy my-project ~/policy.json

REST

Resource Manager API 的 setIamPolicy 方法会将请求中的政策设置为项目、文件夹或组织的新 IAM 政策。

在使用任何请求数据之前,请先进行以下替换:

  • API_VERSION:要使用的 API 版本。对于项目和组织,请使用 v1。对于文件夹,请使用 v2
  • RESOURCE_TYPE:您要管理其政策的资源类型。使用值 projectsfoldersorganizations
  • RESOURCE_ID:您的 Google Cloud 项目、组织或文件夹 ID。 项目 ID 是字母数字字符串,例如 my-project。文件夹和组织 ID 是数字,例如 123456789012
  • POLICY:您要设置的政策的 JSON 格式。如需详细了解政策的格式,请参阅政策参考文档

    例如,要设置上一步中显示的政策,请将 POLICY 替换为以下内容:

    {
      "version": 1,
      "etag": "BwUqLaVeua8=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "user:robin@example.com"
          ]
        },
        {
          "role": "roles/owner",
          "members": [
            "user:owner@example.com"
          ]
        }
      ]
    }
    

HTTP 方法和网址:

POST https://iam.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:setIamPolicy

请求 JSON 正文:

{
  "policy": POLICY
}

如需发送您的请求,请展开以下选项之一:

响应中包含更新后的政策。

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();
    }
}

Java

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.v3.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.v3.model.Policy;
import com.google.api.services.cloudresourcemanager.v3.model.SetIamPolicyRequest;
import com.google.api.services.iam.v1.IamScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class SetPolicy {

  // Sets a project's policy.
  public static void setPolicy(Policy policy, String projectId) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();
    // projectId = "my-project-id"

    CloudResourceManager service = null;
    try {
      service = createCloudResourceManagerService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    try {
      SetIamPolicyRequest request = new SetIamPolicyRequest();
      request.setPolicy(policy);
      Policy response = service.projects().setIamPolicy(projectId, request).execute();
      System.out.println("Policy set: " + response.toString());
    } catch (IOException e) {
      System.out.println("Unable to set policy: \n" + e.toString());
    }
  }

  public static CloudResourceManager createCloudResourceManagerService()
      throws IOException, GeneralSecurityException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));

    CloudResourceManager service =
        new CloudResourceManager.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

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

后续步骤

自行试用

如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。

免费开始使用