将服务账号关联到资源

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

当该资源需要访问其他 Google Cloud 服务和资源时,它会使用其关联的服务账号作为其身份。例如,如果您将服务账号关联到 Compute Engine 实例,则该实例上的应用使用客户端库来调用 Google Cloud API,这些应用会自动以关联的服务账号身份进行身份验证。

本页面介绍如何配置服务账号,以便将其关联到资源。

准备工作

将服务账号关联到资源

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

在将服务账号附加到资源之前,您必须先配置服务账号。此过程取决于服务账号和资源是位于同一项目还是不同项目中。配置服务账号后,您可以创建资源并将服务账号附加到该资源。

为同一项目中的资源进行配置

在将服务账号附加到同一项目中的其他资源之前,请向服务账号授予角色,以便其能够访问相应资源,就像您向其他任何主账号授予角色一样。

为不同项目中的资源进行配置

在某些情况下,您可能需要将服务账号附加到位于其他项目中的资源。例如,如果您在单个项目中创建所有服务账号,则可能需要将其中一个服务账号附加到其他项目中的新资源。

在将服务账号连接到其他项目中的资源之前,请先执行以下操作:

  1. 在服务账号所在的项目中,按照本页面中的步骤允许跨项目关联服务账号
  2. 确定要在其中创建资源的项目。
  3. 确定您将附加到的资源的服务账号类型,以及该类型资源的服务。

    例如,如果您要创建 Pub/Sub 订阅,则 Pub/Sub 是拥有该资源的服务。

  4. 找到服务的服务代理的电子邮件地址。

    不同的服务使用不同的服务代理。如需了解详情,请参阅服务代理

  5. 向服务代理授予 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator):

    控制台

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

      转到“服务账号”

    2. 选择将您要附加到资源的服务账号所属的项目。

    3. 点击附加到资源的服务账号的电子邮件地址。

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

    5. 点击 授予访问权限,然后输入服务代理的电子邮件地址。

    6. 点击选择角色,输入 Service Account Token Creator,然后点击该角色。

    7. 点击保存以保存更改。

    8. 可选:如果您需要向其他服务代理授予该角色,请重复执行上述步骤。

    gcloud

    使用 gcloud iam service-accounts add-iam-policy-binding 命令:

    gcloud iam service-accounts add-iam-policy-binding \
        SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --member=serviceAccount:SERVICE_AGENT_EMAIL \
        --role=roles/iam.serviceAccountTokenCreator
    

    替换以下值:

    • SERVICE_ACCOUNT_NAME:您要附加到资源的用户管理服务账号的名称。
    • PROJECT_ID:用户管理的服务账号所在的项目 ID。
    • SERVICE_AGENT_EMAIL:服务代理的电子邮件地址。

    该命令会输出用户管理的服务账号的更新后的允许政策。

    可选:如果您需要向其他服务代理授予该角色,请再次运行该命令。

    REST

    要授予此角色,请使用 read-modify-write 模式更新用户管理的服务账号的允许政策。

    首先,读取用户管理的服务账号的允许政策

    projects.serviceAccounts.getIamPolicy 方法可返回服务账号的允许政策。

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

    • PROJECT_ID:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如 my-project
    • USER_SA_NAME:您绑定到资源的用户管理服务账号的名称。

    HTTP 方法和网址:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/USER_SA_NAME@PROJECT_ID.iam.gserviceaccount.com:getIamPolicy

    请求 JSON 正文:

    {
      "requestedPolicyVersion": 3
    }
    

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

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

    {
      "version": 1,
      "etag": "BwWl3KCTUMY=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com"
          ]
        }
      ]
    }
    

    接下来,请修改允许政策以向服务代理授予 Service Account Token Creator 角色

    {
      "version": 1,
      "etag": "BwWl3KCTUMY=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "serviceAccount:SERVICE_AGENT_EMAIL"
          ]
        },
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com"
          ]
        }
      ]
    }
    

    替换以下内容:

    • SERVICE_AGENT_EMAIL:服务代理的电子邮件地址
    • SERVICE_ACCOUNT_NAME:用户管理的服务账号的名称。
    • PROJECT_ID:用户管理的服务账号所在的项目 ID。

    最后,写入更新后的允许政策

    projects.serviceAccounts.setIamPolicy 方法会更新您的服务账号的允许政策。

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

    • PROJECT_ID:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如 my-project
    • USER_SERVICE_ACCOUNT_NAME:您绑定到资源的用户管理服务账号的名称。
    • SERVICE_AGENT_EMAIL:为用户管理的服务账号创建访问令牌的服务代理的电子邮件地址。

    HTTP 方法和网址:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com:setIamPolicy

    请求 JSON 正文:

    {
      "policy": {
        "version": 1,
        "etag": "BwWl3KCTUMY=",
        "bindings": [
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:SERVICE_AGENT_EMAIL"
            ]
          },
          {
            "role": "roles/iam.serviceAccountUser",
            "members": [
              "serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com"
            ]
          }
        ]
      }
    }
    

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

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

    {
      "version": 1,
      "etag": "BwWo331TkHE=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "serviceAccount:SERVICE_AGENT_EMAIL"
          ]
        },
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com"
          ]
        }
      ]
    }
    

将服务账号关联到新资源

配置用户管理的服务账号后,您可以创建新资源并将服务账号附加到该资源。请务必在相应的项目中创建新资源。

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

创建资源时附加服务账号
AI Platform Prediction 模型版本
AI Platform Training 作业
App Engine 标准环境 应用版本
App Engine 柔性环境 应用版本
Cloud Composer 环境
Cloud Functions Cloud Functions 函数
Cloud Life Sciences 流水线
Cloud Run 服务
Cloud Scheduler 作业
Cloud Source Repositories
Compute Engine
Dataflow 作业
Datalab 实例
Dataproc 集群
Eventarc 触发器
Google Kubernetes Engine
笔记本 笔记本实例
Pub/Sub 订阅
Vertex AI
工作流 工作流

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

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

将服务账号关联到其他项目中的资源

默认情况下,您无法将在一个项目中创建服务账号附加到其他项目中的资源上。如果您希望将所有服务账号保留在一个项目中,则必须更新该项目的组织政策

允许跨项目关联服务账号

如需允许用户将一个项目中的服务账号关联到另一个项目中的资源,请在服务账号所在的项目的组织政策中,检查以下布尔值限制条件

  • 确保不会为项目强制执行 iam.disableCrossProjectServiceAccountUsage 布尔值限制。

    此布尔值限制条件用于控制是否可以将服务账号附加到另一个项目中的资源。默认情况下,强制执行限制条件。

    如果不强制执行此限制条件,IAM 会添加一个项目安全锁,以防止删除项目。此安全锁的来源为 iam.googleapis.com/cross-project-service-accounts。我们强烈建议您不要删除此安全锁。

  • 推荐:确保对项目强制执行 iam.restrictCrossProjectServiceAccountLienRemoval 布尔值限制条件。

    此布尔值限制条件可确保主账号只有在组织级层具有 resourcemanager.projects.updateLiens 权限时才可以移除项目安全锁。如果未强制执行此限制条件,则主账号在项目级层拥有此权限时可以移除项目安全锁。

如需了解如何在组织政策中查看或更改布尔值限制条件,请参阅创建和管理组织政策

禁止跨项目关联服务账号

如果您之前允许跨项目关联服务账号,我们强烈建议您不要停用此功能,尤其是在生产环境中。

具体来说,在服务账号所在的项目中,您不应做出以下任何更改:

  • 请勿更新项目的组织政策以强制执行 iam.disableCrossProjectServiceAccountUsage 布尔值限制条件。
  • 不要将项目的组织政策更新为不强制执行 iam.restrictCrossProjectServiceAccountLienRemoval 布尔值限制条件。
  • 请勿移除带有源 iam.googleapis.com/cross-project-service-accounts项目安全锁,以防删除项目。
  • 请勿删除项目。

如果您愿意接受停用此功能的风险,则可以通过停用您在各种项目中使用的服务账号来降低风险,然后监控 Google Cloud 环境从而发现问题。 如果发现任何问题,您可以重新启用服务账号。如果未发现任何问题,则可能是因为没有任何 Google Cloud 资源依赖于其他项目中的服务账号。

后续步骤