对于某些 Google Cloud 资源,您可以指定用户管理的服务账号,供资源用作其默认身份。此过程称为“将服务账号附加到资源”或“将服务账号与资源关联”。当资源上运行的代码访问 Google Cloud 服务和资源时,它会使用关联到资源的服务账号作为其身份。例如,如果您将服务账号关联到某个 Compute Engine 实例,并且该实例上的应用使用客户端库来调用 Google Cloud API,则这些应用会自动使用关联的服务账号来进行身份验证和授权。
本页面介绍如何配置服务账号,以便将其关联到资源。
准备工作
Enable the IAM and Resource Manager APIs.
确保您了解服务账号在 IAM 中的工作原理。
所需的角色
如需获得将服务账号附加到资源所需的权限,请让您的管理员为您授予服务账号的 Service Account User (roles/iam.serviceAccountUser
) IAM 角色。
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
此预定义角色可提供将服务账号关联到资源所需的 iam.serviceAccounts.actAs
权限。
将服务账号关联到资源
在大多数情况下,您必须在创建资源时将服务账号附加到该资源。创建资源后,您无法更改将哪个服务账号附加到该资源。Compute Engine 实例是此规则的一个例外情况;您可以根据需要更改附加到实例的服务账号。
在将服务账号附加到资源之前,您必须先配置服务账号。此过程取决于服务账号和资源是位于同一项目还是不同项目中。配置服务账号后,您可以创建资源并将服务账号附加到该资源。
为同一项目中的资源进行配置
在将服务账号附加到同一项目中的其他资源之前,请向服务账号授予角色,以便其能够访问相应资源,就像您向其他任何主账号授予角色一样。
为不同项目中的资源进行配置
在某些情况下,您可能需要将服务账号附加到位于其他项目中的资源。例如,如果您在单个项目中创建所有服务账号,则可能需要将其中一个服务账号附加到其他项目中的新资源。
在将服务账号连接到其他项目中的资源之前,请先执行以下操作:
- 在服务账号所在的项目中,按照本页面中的步骤允许跨项目关联服务账号。
- 确定要在其中创建资源的项目。
确定您将附加到的资源的服务账号类型,以及该类型资源的服务。
例如,如果您要创建 Pub/Sub 订阅,则 Pub/Sub 是拥有该资源的服务。
找到服务的服务代理的电子邮件地址。
不同的服务使用不同的服务代理。如需了解详情,请参阅服务代理。
向服务代理授予 Service Account Token Creator 角色 (
roles/iam.serviceAccountTokenCreator
):控制台
在 Google Cloud 控制台中,转到服务账号页面。
选择将您要附加到资源的服务账号所属的项目。
点击附加到资源的服务账号的电子邮件地址。
转到权限标签页,找到有权访问此服务账号的主账号部分。
点击
授予访问权限,然后输入服务代理的电子邮件地址。点击选择角色,输入
Service Account Token Creator
,然后点击相应角色。点击保存以保存更改。
可选:如果您需要向其他服务代理授予该角色,请重复执行上述步骤。
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 Run functions | Cloud Run 函数 |
Cloud Life Sciences | 流水线 |
Cloud Run | 服务 |
Cloud Scheduler | 作业 |
Cloud Source Repositories | |
Compute Engine | |
Dataflow | 作业 |
Datalab | 实例 |
Dataproc | 集群 |
Eventarc | 触发器 |
Google Kubernetes Engine | |
笔记本 | 笔记本实例 |
Pub/Sub | 订阅 |
Vertex AI | |
Workflows | 工作流 |
创建资源并将服务账号附加到该资源之后,您可以向该服务账号授予角色,以便它可以访问适当的资源。该过程与向任何其他主账号授予角色的过程相同。
如需了解如何授予角色,请参阅授予、更改和撤消对资源的访问权限。
将服务账号关联到其他项目中的资源
默认情况下,您无法将在一个项目中创建服务账号附加到其他项目中的资源上。如果您希望将所有服务账号保留在一个项目中,则必须更新该项目的组织政策。
允许跨项目关联服务账号
如需允许用户将一个项目中的服务账号关联到另一个项目中的资源,请在服务账号所在的项目的组织政策中,检查以下布尔值限制条件:
确保不会为项目强制执行
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 资源依赖于其他项目中的服务账号。
关于关联服务账号的审核日志
当主账号使用 iam.serviceAccounts.actAs
权限将服务账号附加到资源时,IAM 会生成审核日志。此审核日志包含以下信息:
- 将服务账号附加到资源的正文的电子邮件地址
- 有关附加到资源的服务账号的详细信息
如需查看可将服务账号关联到的资源列表,请参阅本页面上的将服务账号关联到新资源。
如需查看此类审核日志的示例,请参阅使用 iam.serviceAccounts.actAs
权限的审核日志。如需详细了解审核日志,请参阅 Cloud Audit Logs 概览。
后续步骤
- 了解如何将服务账号关联到 Compute Engine 实例。
- 查看并应用保护服务账号的最佳实践。
- 详细了解 IAM 的审核日志记录。