管理对服务账号的访问权限

本页面介绍如何授予、更改和撤消主账号对单个服务账号的访问权限。如需管理主账号对项目、文件夹或组织中所有服务账号的访问权限,请在项目、文件夹或组织级层管理其访问权限。

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

服务账号既是其他主账号可以被授予访问权限的资源,也是可以被授予其他资源访问权限的主账号。本页面将服务账号视为资源,并介绍如何授予其他主账号访问服务账号的权限。如需了解如何向服务账号授予对其他资源的访问权限,请参阅以下指南:

本页面介绍如何使用 Google Cloud 控制台、Google Cloud CLI 和 REST API 管理服务账号的访问权限。您还可以使用 IAM 客户端库管理访问权限。

准备工作

所需的角色

如需获得管理服务账号的访问权限所需的权限,请让您的管理员为您授予该服务账号或拥有该服务账号的项目的 Service Account Admin (roles/iam.serviceAccountAdmin) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

此预定义角色可提供管理服务账号的访问权限所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

如需管理对服务账号的访问权限,您需要具有以下权限:

  • iam.serviceAccounts.get
  • iam.serviceAccounts.list
  • iam.serviceAccounts.getIamPolicy
  • iam.serviceAccounts.setIamPolicy

您也可以使用自定义角色或其他预定义角色来获取这些权限。

查看当前访问权限

以下部分介绍如何使用 Google Cloud 控制台、gcloud CLI 和 REST API 查看谁有权访问服务账号。您还可以使用 IAM 客户端库获取服务账号的允许政策,以查看相关的访问权限。

控制台

  1. 在 Google Cloud 控制台中,转到服务账号页面。

    转到“服务账号”

  2. 选择一个项目。

  3. 点击服务账号的电子邮件地址。

  4. 转到权限标签页。有权访问此服务账号的主账号部分列出了被授予该服务账号角色的所有主账号。

    此列表包括其访问权限来自其在父资源上被授予的角色的主账号。如需详细了解政策沿用,请参阅政策沿用和资源层次结构

  5. 可选:如需查看服务代理的角色授权,请选中包括 Google 提供的角色授权复选框。

gcloud

如需查看谁有权访问您的服务账号,请获取服务账号的允许政策。如需了解如何解读允许政策,请参阅了解允许政策

如需获取服务账号的允许政策,请对服务账号运行 get-iam-policy 命令:

gcloud iam service-accounts get-iam-policy SA_ID --format=FORMAT > PATH

请提供以下值:

  • SA_ID:您的服务账号的 ID。此 ID 可以是服务账号的电子邮件地址(格式为 SA_NAME@PROJECT_ID.iam.gserviceaccount.com)或服务账号的唯一数字 ID。

  • FORMAT:政策的格式。使用 jsonyaml

  • PATH:指向政策的新输出文件的路径。

例如,以下命令会获取服务账号 my-service-account 的政策,并以 JSON 格式将其保存到主目录中:

gcloud iam service-accounts get-iam-policy my-service-account --format json > ~/policy.json

REST

如需查看谁有权访问您的服务账号,请获取服务账号的允许政策。如需了解如何解读允许政策,请参阅了解允许政策

serviceAccounts.getIamPolicy 方法可获取服务账号的允许政策。

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

  • PROJECT_ID:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如 my-project
  • SA_ID:您的服务账号的 ID。此 ID 可以是服务账号的电子邮件地址(格式为 SA_NAME@PROJECT_ID.iam.gserviceaccount.com)或服务账号的唯一数字 ID。

  • POLICY_VERSION:要返回的政策版本。请求应指定最新的政策版本,即政策版本 3。如需了解详情,请参阅在获取政策时指定政策版本

HTTP 方法和网址:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID:getIamPolicy

请求 JSON 正文:

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

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

响应内容包含服务账号的允许政策。例如:

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

授予或撤消单个角色

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

政策更改通常会在 2 分钟内生效。但是,在某些情况下,更改可能需要长达 7 分钟的时间才能传播到整个系统。

如果您需要帮助来确定最合适的预定义角色,请参阅选择预定义角色

授予单个角色

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

控制台

  1. 在 Google Cloud 控制台中,转到服务账号页面。

    转到“服务账号”

  2. 选择一个项目。

  3. 点击服务账号的电子邮件地址。

  4. 转到权限标签页,找到有权访问此服务账号的主账号部分。

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

    • 如需向已具有服务账号上的其他角色的主账号授予角色,请找到包含主账号的行,点击该行中的 修改主账号,然后点击 添加其他角色

      如需向服务代理授予角色,请选中包括 Google 提供的角色授权复选框以查看其电子邮件地址。

    • 如需向尚未拥有服务账号的任何角色的主账号授予角色,请点击 Grant access(授予访问权限),然后输入该主账号的标识符,例如 my-user@example.com

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

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

  8. 点击保存。将向该主账号授予服务账号上的角色。

gcloud

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

gcloud iam service-accounts add-iam-policy-binding SA_ID \
    --member=PRINCIPAL --role=ROLE_NAME \
    --condition=CONDITION

请提供以下值:

  • SA_ID:您的服务账号的 ID。此 ID 可以是服务账号的电子邮件地址(格式为 SA_NAME@PROJECT_ID.iam.gserviceaccount.com)或服务账号的唯一数字 ID。

  • PRINCIPAL:主账号(或成员)的标识符,通常其格式如下:PRINCIPAL-TYPE:ID。例如 user:my-user@example.com。如需查看 PRINCIPAL 可以采用的值的完整列表,请参阅主要标识符

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

  • ROLE_NAME:您要授予的角色的名称。请采用以下某种格式:

    • 预定义角色:roles/SERVICE.IDENTIFIER
    • 项目级自定义角色:projects/PROJECT_ID/roles/IDENTIFIER
    • 组织级自定义角色:organizations/ORG_ID/roles/IDENTIFIER

    如需了解完整的预定义角色的列表,请参阅了解角色

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

例如,如需向服务账号 my-service-account@my-project.iam.gserviceaccount.com 的用户my-user@example.com授予 Service Account User 角色,请运行以下命令:

gcloud iam service-accounts add-iam-policy-binding my-service-account@my-project.iam.gserviceaccount.com \
    --member=user:my-user@example.com --role=roles/iam.serviceAccountUser

撤消单个角色

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

控制台

  1. 在 Google Cloud 控制台中,转到服务账号页面。

    转到“服务账号”

  2. 选择一个项目。

  3. 点击服务账号的电子邮件地址。

  4. 转到权限标签页,找到有权访问此服务账号的主账号部分。

  5. 找到包含要撤消其访问权限的主账号的行。然后,点击该行中的 修改主账号

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

gcloud

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

gcloud iam service-accounts remove-iam-policy-binding SA_ID \
    --member=PRINCIPAL --role=ROLE_NAME

请提供以下值:

  • SA_ID:您的服务账号的 ID。此 ID 可以是服务账号的电子邮件地址(格式为 SA_NAME@PROJECT_ID.iam.gserviceaccount.com)或服务账号的唯一数字 ID。

  • PRINCIPAL:主账号(或成员)的标识符,通常其格式如下:PRINCIPAL-TYPE:ID。例如 user:my-user@example.com。如需查看 PRINCIPAL 可以采用的值的完整列表,请参阅主要标识符

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

  • ROLE_NAME:要撤消的角色的名称。请采用以下某种格式:

    • 预定义角色:roles/SERVICE.IDENTIFIER
    • 项目级自定义角色:projects/PROJECT_ID/roles/IDENTIFIER
    • 组织级自定义角色:organizations/ORG_ID/roles/IDENTIFIER

    如需了解完整的预定义角色的列表,请参阅了解角色

例如,如需撤消服务账号 my-service-account@my-project.iam.gserviceaccount.com 的用户my-user@example.com的服务账号 User 角色,请运行以下命令:

gcloud iam service-accounts remove-iam-policy-binding my-service-account@my-project.iam.gserviceaccount.com \
    --member=user:my-user@example.com --role=roles/iam.serviceAccountUser

使用 Google Cloud 控制台授予或撤消多个角色

您可以使用 Google Cloud 控制台为单个主账号授予和撤消多个角色:

  1. 在 Google Cloud 控制台中,转到服务账号页面。

    转到“服务账号”

  2. 选择一个项目。

  3. 点击服务账号的电子邮件地址。

  4. 转到权限标签页,找到有权访问此服务账号的主账号部分。

  5. 选择要修改其角色的主账号:

    • 如需修改已拥有服务账号上角色的主账号的角色,请找到包含该主账号的行,然后点击该行中的 修改主账号,然后点击 添加其他角色

      如需修改服务代理的角色,请选中包括 Google 提供的角色授权复选框以查看其电子邮件地址。

    • 如需向未拥有服务账号的现有任何角色的主账号授予角色,请点击 授予访问权限,然后输入该主账号的电子邮件地址或其他标识符。

  6. 修改主账号的角色:

    • 如需向尚未拥有资源的任何角色的主账号授予角色,请点击选择角色,然后从下拉列表中选择要授予的角色。
    • 如需向主账号授予其他角色,请点击添加其他角色,然后从下拉列表中选择要授予的角色。
    • 如需将某个主账号的某个角色替换为其他角色,请点击现有角色,然后从下拉列表中选择要授予的其他角色。
    • 如需撤销主账号的某个角色,请点击要撤消的每个角色对应的删除 按钮。

    您还可以为角色添加条件修改角色的条件移除角色的条件

  7. 点击保存

以编程方式授予或撤消多个角色

如需进行涉及为多个主账号授予和撤销多个角色的大规模访问权限更改,请使用“读取-修改-写入”模式更新服务账号的允许政策:

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

本部分介绍如何使用 gcloud CLI 和 REST API 来更新允许政策。您还可以使用 IAM 客户端库来更新允许政策。

政策更改通常会在 2 分钟内生效。但是,在某些情况下,更改可能需要长达 7 分钟的时间才能传播到整个系统。

获取当前允许政策

gcloud

如需获取服务账号的允许政策,请对服务账号运行 get-iam-policy 命令:

gcloud iam service-accounts get-iam-policy SA_ID --format=FORMAT > PATH

请提供以下值:

  • SA_ID:您的服务账号的 ID。此 ID 可以是服务账号的电子邮件地址(格式为 SA_NAME@PROJECT_ID.iam.gserviceaccount.com)或服务账号的唯一数字 ID。

  • FORMAT:允许政策的格式。使用 jsonyaml

  • PATH:指向允许政策的新输出文件的路径。

例如,以下命令会获取服务账号 my-service-account 的允许政策,并以 JSON 格式将其保存到主目录中:

gcloud iam service-accounts get-iam-policy my-service-account --format json > ~/policy.json

REST

serviceAccounts.getIamPolicy 方法可获取服务账号的允许政策。

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

  • PROJECT_ID:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如 my-project
  • SA_ID:您的服务账号的 ID。此 ID 可以是服务账号的电子邮件地址(格式为 SA_NAME@PROJECT_ID.iam.gserviceaccount.com)或服务账号的唯一数字 ID。

  • POLICY_VERSION:要返回的政策版本。请求应指定最新的政策版本,即政策版本 3。如需了解详情,请参阅在获取政策时指定政策版本

HTTP 方法和网址:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID:getIamPolicy

请求 JSON 正文:

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

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

响应内容包含服务账号的允许政策。例如:

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

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

Java

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。 如需了解详情,请参阅 IAM Java API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证


import com.google.cloud.iam.admin.v1.IAMClient;
import com.google.iam.admin.v1.ServiceAccountName;
import com.google.iam.v1.GetIamPolicyRequest;
import com.google.iam.v1.Policy;
import java.io.IOException;

public class GetServiceAccountPolicy {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your project ID.
    String projectId = "your-project-id";
    // TODO: Replace with your service account name.
    String serviceAccount = "your-service-account";
    getPolicy(projectId, serviceAccount);
  }

  // Gets a service account's IAM policy.
  public static Policy getPolicy(String projectId, String serviceAccount) throws IOException {

    // Construct the service account email.
    // You can modify the ".iam.gserviceaccount.com" to match the name of the service account
    // whose allow policy you want to get.
    String serviceAccountEmail = serviceAccount + "@" + projectId + ".iam.gserviceaccount.com";

    // Initialize client that will be used to send requests.
    // This client only needs to be created once, and can be reused for multiple requests.
    try (IAMClient iamClient = IAMClient.create()) {
      GetIamPolicyRequest request = GetIamPolicyRequest.newBuilder()
              .setResource(ServiceAccountName.of(projectId, serviceAccountEmail).toString())
              .build();
      Policy policy = iamClient.getIamPolicy(request);
      System.out.println("Policy retrieved: " + policy.toString());
      return policy;
    }
  }
}

Python

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。 如需了解详情,请参阅 IAM Python API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

from google.cloud import iam_admin_v1
from google.iam.v1 import iam_policy_pb2, policy_pb2


def get_service_account_iam_policy(project_id: str, account: str) -> policy_pb2.Policy:
    """
    Get policy for service account.
    project_id: ID or number of the Google Cloud project you want to use.
    account: ID or email which is unique identifier of the service account.
    """

    iam_client = iam_admin_v1.IAMClient()
    request = iam_policy_pb2.GetIamPolicyRequest()
    request.resource = f"projects/{project_id}/serviceAccounts/{account}"

    policy = iam_client.get_iam_policy(request)
    return policy

修改允许政策

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

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

如需修改允许政策授予的角色,您需要修改允许政策中的角色绑定。角色绑定采用以下格式:

{
  "role": "ROLE_NAME",
  "members": [
    "PRINCIPAL_1",
    "PRINCIPAL_2",
    ...
    "PRINCIPAL_N"
  ],
  "conditions:" {
    CONDITIONS
  }
}

占位符具有以下值:

  • ROLE_NAME:您要授予的角色的名称。请采用以下某种格式:

    • 预定义角色:roles/SERVICE.IDENTIFIER
    • 项目级自定义角色:projects/PROJECT_ID/roles/IDENTIFIER
    • 组织级自定义角色:organizations/ORG_ID/roles/IDENTIFIER

    如需了解完整的预定义角色的列表,请参阅了解角色

  • PRINCIPAL_1PRINCIPAL_2...PRINCIPAL_N:您要向其授予相应角色的主账号的标识符。

    主账号标识符通常采用以下格式:PRINCIPAL-TYPE:ID。例如 user:my-user@example.com。如需查看 PRINCIPAL 可以采用的值的完整列表,请参阅主要标识符

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

  • CONDITIONS:可选。指定何时授予访问权限的任何条件

授予角色

要向主账号授予角色,请修改允许政策中的角色绑定。如需了解您可以授予哪些角色,请参阅了解角色查看可授予的服务账号角色。如果您需要帮助来确定最合适的预定义角色,请参阅选择预定义角色

(可选)您可以使用条件,仅在满足特定要求时授予角色。

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

gcloud

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

例如,假设允许政策包含以下角色绑定,其将 Service Account User 角色 (roles/iam.serviceAccountUser) 授予给 Kai:

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

如需向 Raha 授予相同的角色,请将 Raha 添加到现有角色绑定:

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

REST

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

例如,假设允许政策包含以下角色绑定,其将 Service Account User 角色 (roles/iam.serviceAccountUser) 授予给 Kai:

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

如需向 Raha 授予相同的角色,请将 Raha 添加到现有角色绑定:

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

如需授予允许政策中未包含的角色,请添加新的角色绑定:

gcloud

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

例如,如需向 Raha 授予 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator),请将以下角色绑定添加到允许政策的 bindings 数组中:

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

REST

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

例如,如需向 Raha 授予 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator),请将以下角色绑定添加到允许政策的 bindings 数组中:

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

撤消角色

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

gcloud

通过移除主账号或整个角色绑定来修改允许政策。此更改在您设置更新后的允许政策后才会生效。

例如,假设允许政策包含以下角色绑定,其向 Kai 和 Raha 授予 Service Account User 角色 (roles/iam.serviceAccountUser):

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

如需从 Kai 撤消角色,请从角色绑定中移除 Kai 的主账号标识符:

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

如需同时从 Kai 和 Raha 撤消角色,请从允许政策中移除该角色绑定。

REST

通过移除主账号或整个角色绑定来修改允许政策。此更改在您设置更新后的允许政策后才会生效。

例如,假设允许政策包含以下角色绑定,其向 Kai 和 Raha 授予 Service Account User 角色 (roles/iam.serviceAccountUser):

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

如需从 Kai 撤消角色,请从角色绑定中移除 Kai 的主账号标识符:

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

如需同时从 Kai 和 Raha 撤消角色,请从允许政策中移除该角色绑定。

设置允许政策

修改允许政策以授予和撤消角色后,请调用 setIamPolicy() 进行更新。

gcloud

如需设置资源的允许政策,请对服务账号运行 set-iam-policy 命令:

gcloud iam service-accounts set-iam-policy SA_ID PATH

请提供以下值:

  • SA_ID:您的服务账号的 ID。此 ID 可以是服务账号的电子邮件地址(格式为 SA_NAME@PROJECT_ID.iam.gserviceaccount.com)或服务账号的唯一数字 ID。

  • PATH:包含新允许政策的文件的路径。

响应包含更新后的允许政策。

例如,以下命令会将存储在 policy.json 中的允许政策设置为服务账号 my-service-account@my-project.iam.gserviceaccount.com 的允许政策:

gcloud iam service-accounts set-iam-policy my-service-account@my-project.iam.gserviceaccount.com \
    ~/policy.json

REST

serviceAccounts.setIamPolicy 方法会为服务账号设置更新后的允许政策。

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

  • PROJECT_ID:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如 my-project
  • SA_ID:您的服务账号的 ID。此 ID 可以是服务账号的电子邮件地址(格式为 SA_NAME@PROJECT_ID.iam.gserviceaccount.com)或服务账号的唯一数字 ID。

  • POLICY:您要设置的政策的 JSON 格式。如需详细了解政策的格式,请参阅政策参考

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

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

HTTP 方法和网址:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID:setIamPolicy

请求 JSON 正文:

{
  "policy": POLICY
}

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

响应包含更新后的允许政策。

Java

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。 如需了解详情,请参阅 IAM Java API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

import com.google.cloud.iam.admin.v1.IAMClient;
import com.google.iam.admin.v1.ServiceAccountName;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import com.google.protobuf.FieldMask;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class SetServiceAccountPolicy {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your project ID.
    String projectId = "your-project-id";
    // TODO: Replace with your service account name.
    String serviceAccount = "your-service-account";
    // TODO: Replace with your policy, GetPolicy.getPolicy(projectId, serviceAccount).
    Policy policy = Policy.newBuilder().build();

    setServiceAccountPolicy(policy, projectId, serviceAccount);
  }

  // Sets a service account's policy.
  public static Policy setServiceAccountPolicy(Policy policy, String projectId,
                                               String serviceAccount) throws IOException {

    // Construct the service account email.
    // You can modify the ".iam.gserviceaccount.com" to match the name of the service account
    // whose allow policy you want to set.
    String accountEmail = String.format("%s@%s.iam.gserviceaccount.com", serviceAccount, projectId);

    // Initialize client that will be used to send requests.
    // This client only needs to be created once, and can be reused for multiple requests.
    try (IAMClient iamClient = IAMClient.create()) {
      List<String> paths = Arrays.asList("bindings", "etag");
      SetIamPolicyRequest request = SetIamPolicyRequest.newBuilder()
              .setResource(ServiceAccountName.of(projectId, accountEmail).toString())
              .setPolicy(policy)
              // A FieldMask specifying which fields of the policy to modify. Only
              // the fields in the mask will be modified. If no mask is provided, the
              // following default mask is used:
              // `paths: "bindings, etag"`
              .setUpdateMask(FieldMask.newBuilder().addAllPaths(paths).build())
              .build();

      return iamClient.setIamPolicy(request);
    }
  }
}

Python

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。 如需了解详情,请参阅 IAM Python API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

from google.cloud import iam_admin_v1
from google.iam.v1 import iam_policy_pb2, policy_pb2


def set_service_account_iam_policy(
    project_id: str, account: str, policy: policy_pb2.Policy
) -> policy_pb2.Policy:
    """
    Set policy for service account. Pay attention that previous state will be completely rewritten.
    If you want to update only part of the policy follow the approach read->modify->write.
    For more details about policies check out https://cloud.google.com/iam/docs/policies

    project_id: ID or number of the Google Cloud project you want to use.
    account: ID or email which is unique identifier of the service account.
    policy: Policy which has to be set.
    """

    # Same approach as for policies on project level, but client stub is different.
    iam_client = iam_admin_v1.IAMClient()
    request = iam_policy_pb2.SetIamPolicyRequest()
    request.resource = f"projects/{project_id}/serviceAccounts/{account}"

    # request.etag field also will be merged which means you are secured from collision,
    # but it means that request may fail and you need to leverage exponential reties approach
    # to be sure policy has been updated.
    request.policy.MergeFrom(policy)

    policy = iam_client.set_iam_policy(request)
    return policy

后续步骤

自行试用

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

免费开始使用