管理服务帐号模拟

本页面介绍了如何使成员和资源能够模拟或充当 Identity and Access Management (IAM) 服务帐号。其中还介绍了如何查看哪些成员能够模拟给定 IAM 服务帐号。

准备工作

确保您了解服务帐号在 IAM 中的工作原理

使成员能够模拟服务帐号

使成员能够模拟服务帐号的几个预定义角色如下:

  • Service Account User (roles/iam.serviceAccountUser):通过服务帐号,允许成员间接访问所有资源。例如,如果某位成员在一个服务帐号中具有 Service Account User 角色,而该服务帐号在项目中具有 Cloud SQL Admin 角色 (roles/cloudsql.admin),则该成员可以模拟服务帐号来创建 Cloud SQL 实例。

    通过此角色,成员还可以将服务帐号绑定到资源,如本页中所述。

  • Service Account Token Creator (roles/iam.serviceAccountTokenCreator):使成员能够模拟服务帐号创建 OAuth 2.0 访问令牌、对 JSON Web 令牌 (JWT) 和二进制 blob 进行签名,以便它们能够用于身份验证。如需了解详情,请参阅创建短期有效的服务帐号凭据

  • Workload Identity User (roles/iam.workloadIdentityUser):允许成员模拟 GKE 工作负载中的服务帐号。无法对单个服务帐号授予此角色,但可以对项目、文件夹或组织授予此角色。

或者,您也可以授予其他预定义角色或授予自定义角色,只要它们包含与上述角色相同的权限即可。

以下部分介绍了如何对项目、文件夹和组织授予这些角色,以及如何对单个服务帐号授予这些角色。根据您要授予的访问权限大小选择级别:

使成员能够模拟多个服务帐号

要使成员能够模拟在项目、文件夹或组织中创建的所有服务帐号,请对项目、文件夹或组织授予角色:

控制台

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

    转到 IAM 页面

  2. 在页面顶部的项目选择器中,选择您要授予角色的项目、文件夹或组织。

  3. 点击添加

  4. 输入您的成员的电子邮件地址。

  5. 选择一个使成员能够模拟服务帐号的角色。请参阅使成员能够模拟服务帐号的角色列表。

  6. 点击保存

gcloud

要向成员授予使其能够模拟服务帐号的角色,请修改项目、文件夹或组织的 IAM 政策。

  1. 读取资源的 IAM 政策:

    gcloud resource get-iam-policy resource-id \
        --format=json > policy.json
    

    替换以下值:

    • resource:您要设置政策的资源的类型。此值应为 projectsresource-manager foldersorganizations 之一。
    • resource-id:您要设置政策的资源的 ID。

    该命令会将资源的政策存储在 policy.json 文件中。

    如果相应资源上已经设置了政策,则 policy.json 文件类似于以下内容:

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

    如果相应资源上未设置政策,则 policy.json 文件仅包含默认 etag

    如果没有现有政策,请在以下步骤中使用 JSON 手动创建政策作为模板。

  2. 修改政策以向您的成员授予适当角色。要授予角色,请执行以下操作之一:

    • 如果角色不存在绑定,请向 bindings 数组添加一个对象,以指明您要授予的角色以及要将角色授予的成员。
    • 如果角色已存在绑定,请将新成员添加到现有成员列表中。如果您的政策包含条件角色绑定,您还应在添加成员之前确保绑定具有适当的条件。

    如果 bindings 数组不存在,您可以创建一个。

    示例

    要向 robin@example.com 授予 Service Account User 角色 (roles/iam.serviceAccountUser),请更改上一步中显示的示例,如下所示:

    {
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "user:robin@example.com"
          ]
        },
        {
          "role": "roles/owner",
          "members": [
            "user:hollis@example.com"
          ]
        }
      ],
      "etag": "BwUqLaVeua8=",
      "version": 1
    }
    
  3. 写入更新后的政策:

    gcloud resource set-iam-policy resource-id \
        policy-file
    

    替换以下值:

    • resource:您要设置政策的资源的类型。此值应为 projectsresource-manager foldersorganizations 之一。
    • resource-id:您要设置政策的资源的 ID。
    • policy-file:包含更新后政策的文件的路径。

    该命令会输出更新后的政策,其中包含更新后的 etag 值。

REST

要使用 Resource Manager REST API 授予角色,您需要读取项目、文件夹或组织的当前 IAM 政策;修改该政策以授予所需角色;然后写入更新后的政策。

读取资源的 IAM 政策。

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

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

  • api-version:要使用的 API 版本。对于项目和组织,请使用 v1。对于文件夹,请使用 v2
  • resource-type:您要管理其政策的资源类型。使用值 projectsfoldersorganizations
  • resource-id:您的 Google Cloud 项目、组织或文件夹 ID。
  • policy-version:要返回的政策版本。请求应指定最新的政策版本,即政策版本 3。如需了解详情,请参阅在获取政策时指定政策版本

HTTP 方法和网址:

POST https://cloudresourcemanager.googleapis.com/api-version/resource-type/resource-id:getIamPolicy

请求 JSON 正文:

{
  "options": {
    "requestedPolicyVersion": policy-version
  }
}

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

您应该收到类似以下内容的 JSON 响应:

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

如果没有现有政策,则响应仅包含默认的 etag。如果收到此响应,请添加一个 version 字段(设置为 3)和一个 bindings 字段(设置为一个空数组)。

修改政策以向您的成员授予适当角色。

要授予角色,请执行以下操作之一:

  • 如果角色不存在绑定,请向 bindings 数组添加一个对象,以指明您要授予的角色以及要将角色授予的成员。
  • 如果角色已存在绑定,请将新成员添加到现有成员列表中。

示例

要向 robin@example.com 授予 Service Account User 角色 (roles/iam.serviceAccountUser),请更改上一步中显示的示例,如下所示:

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

写入更新后的政策。

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

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

  • api-version:要使用的 API 版本。对于项目和组织,请使用 v1。对于文件夹,请使用 v2
  • resource-type:您要管理其政策的资源类型。使用值 projectsfoldersorganizations
  • resource-id:您的 Google Cloud 项目、组织或文件夹 ID。
  • 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
}

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

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

使成员能够模拟单个服务帐号

要使成员能够模拟单个服务帐号,请对服务帐号授予角色:

控制台

  1. 在 Cloud Console 中,转到服务帐号页面。

    转到“服务帐号”页面

  2. 点击选择项目,然后选择一个项目并点击打开

  3. 选择服务帐号。如果信息面板尚未显示,请点击显示信息面板。该面板会显示已对服务帐号授予的角色列表。

  4. 点击添加成员

  5. 输入您的成员的电子邮件地址。

  6. 选择一个使成员能够模拟服务帐号的角色。请参阅使成员能够模拟服务帐号的角色列表。

  7. 点击添加,将此角色应用于项目成员。

要对多个服务帐号授予角色,请为每个服务帐号重复上述步骤。

gcloud

要向成员授予使其能够模拟服务帐号的角色,请修改您的服务帐号的 IAM 政策。

  1. 使用 service-accounts get-iam-policy 命令读取当前政策:

    gcloud iam service-accounts get-iam-policy sa-id \
        --format=json > policy.json
    

    替换以下值:

    • sa-id:您的服务帐号的 ID。此 ID 可以是服务帐号的电子邮件地址(格式为 sa-name@project-id.iam.gserviceaccount.com),也可以是服务帐号的唯一数字 ID。

    该命令会将服务帐号的政策存储在 policy.json 文件中。

    如果服务帐号上已经设置了政策,则 policy.json 文件类似于以下内容:

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

    如果服务帐号上未设置政策,则 policy.json 文件仅包含默认 etag

    如果没有现有政策,请在以下步骤中使用 JSON 手动创建政策作为模板。

  2. 在文本编辑器中,修改 policy.json 文件中的绑定数组,以向成员授予适当的角色。要授予角色,请执行以下操作之一:

    • 如果角色不存在绑定,请向 bindings 数组添加一个新对象,以定义您要授予的角色以及要将角色授予的成员。
    • 如果角色已存在绑定,请将新成员添加到现有成员列表中。如果您的政策包含条件角色绑定,您还应在添加成员之前确保绑定具有适当的条件。

    如果 bindings 数组不存在,您可以创建一个。

    示例

    要向 robin@example.com 授予 Service Account User 角色 (roles/iam.serviceAccountUser),请更改上一步中显示的示例,如下所示:

    {
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "user:robin@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountAdmin",
          "members": [
            "user:hollis@example.com"
          ]
        }
      ],
      "etag": "BwUqLaVeua8=",
      "version": 1
    }
    
  3. 使用 service-accounts set-iam-policy 命令写入更新后的政策:

    gcloud iam service-accounts set-iam-policy sa-id \
        policy-file
    

    替换以下值:

    • sa-id:您的服务帐号的 ID。此 ID 可以是服务帐号的电子邮件地址(格式为 sa-name@project-id.iam.gserviceaccount.com),也可以是服务帐号的唯一数字 ID。
    • policy-file:包含更新后政策的文件的路径。

    该命令会输出更新后的政策,其中包含更新后的 etag 值。

REST

要使用 IAM REST API 授予角色,您需要读取服务帐号的当前 IAM 政策,修改该政策以授予所需的角色,然后写入更新后的政策。

读取服务帐号的 IAM 政策。

serviceAccounts.getIamPolicy 方法可获取服务帐号的 IAM 政策。

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

  • project-id:您的 Google Cloud 项目 ID。
  • 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
  }
}

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

您应该收到类似以下内容的 JSON 响应:

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

如果没有现有政策,则响应仅包含默认的 etag。如果收到此响应,请添加一个 version 字段(设置为 3)和一个 bindings 字段(设置为一个空数组)。

修改政策以向您的成员授予适当角色。

在文本编辑器中,从响应正文修改绑定数组,以向您的成员授予适当的角色。要授予角色,请执行以下操作之一:

  • 如果角色不存在绑定,请向 bindings 数组添加一个新对象,以定义您要授予的角色以及要将角色授予的成员。
  • 如果角色已存在绑定,请将新成员添加到现有成员列表中。

示例

要向 robin@example.com 授予 Service Account User 角色 (roles/iam.serviceAccountUser),请更改上一步中显示的示例,如下所示:

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

写入更新后的政策。

serviceAccounts.setIamPolicy 方法为服务帐号设置更新后的 IAM 政策。

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

  • project-id:您的 Google Cloud 项目 ID。
  • 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": [
            "user:robin@example.com"
          ]
        },
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:admin@example.com"
          ]
        }
      ]
    }
    

HTTP 方法和网址:

POST https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-id:setIamPolicy

请求 JSON 正文:

{
  "policy": policy
}

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

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

列出可访问服务帐号的成员

使用 Cloud Console 查看有权访问服务帐号的所有成员,无论他们有权访问是因为拥有对服务帐号授予的角色,还是拥有对项目、文件夹或组织授予的角色。

  1. 在 Cloud Console 中,转到服务帐号页面。

    转到“服务帐号”页面

  2. 点击选择项目,然后选择一个项目并点击打开

  3. 选中所需服务帐号旁边的复选框。

  4. 如果信息面板尚未显示,请点击显示信息面板。此时系统会显示已对该服务帐号授予的角色列表。

  5. 展开各个角色即可查看在该服务帐号上已被授予相应角色的成员。

将服务帐号附加到资源

对于某些 Google Cloud 资源,您可以指定用户管理的服务帐号,供资源用作其默认身份。此过程称为“将服务帐号附加到资源”或“将服务帐号与资源关联”

当该资源需要访问其他 Google Cloud 服务和资源时,它会模拟附加到它的服务帐号。例如,如果您将服务帐号附加到 Compute Engine 实例,则该实例上的应用会在调用 Google Cloud API 时自动使用该服务帐号。

在大多数情况下,您必须在创建资源时将服务帐号附加到该资源。创建资源后,您无法更改将哪个服务帐号附加到该资源。Compute Engine 实例是此规则的一个例外情况;您可以根据需要更改将哪个服务帐号附加到实例

请参阅您要创建的资源类型对应的说明:

创建资源时附加服务帐号
AI Platform Notebooks 笔记本实例
AI Platform Prediction 模型版本
AI Platform Training 作业
Cloud Composer 环境
Cloud Functions Cloud Functions 函数
Cloud Life Sciences 流水线
Cloud Run 服务
Cloud Scheduler 作业
Cloud Source Repositories
Compute Engine
Dataflow 作业
Datalab 实例
Dataproc 集群
Google Kubernetes Engine
Pub/Sub 订阅

创建资源并将服务帐号附加到该资源之后,您可以向该服务帐号授予角色,以便它可以访问适当的资源。该过程与向任何其他成员授予角色的过程相同。

如需了解如何授予角色,请参阅授予、更改和撤消对资源的访问权限

后续步骤