服务帐号

本页面介绍了服务帐号、服务帐号的类型以及适用于服务帐号的 IAM 角色。

准备工作

  • 了解 IAM 的基本概念。

什么是服务帐号?

服务帐号是由应用或计算工作负载(例如 Compute Engine 虚拟机 (VM) 实例)而非人员使用的特殊帐号。应用使用服务帐号来执行已获授权的 API 调用(以服务帐号本身的身份授权或者以 Google Workspace 或 Cloud Identity 用户的身份通过全网域授权功能授权)。

例如,Compute Engine 虚拟机可以以服务帐号的身份运行,该帐号可被授予访问其所需资源的权限。这样,服务帐号就是相应服务的标识,服务帐号的权限用于控制可以访问该服务的资源。

服务帐号由其电子邮件地址(对该帐号是唯一的)标识。

服务帐号与用户帐号之间的区别

服务帐号与用户帐号之间主要存在以下几大区别:

  • 服务帐号没有密码,无法通过浏览器或 Cookie 登录。
  • 服务帐号与用于向 Google 进行身份验证以及签署数据的公钥/私钥 RSA 密钥对相关联。
  • 您可以允许其他用户或服务帐号模拟服务帐号。
  • 不同于用户帐号,服务帐号属于您的 Google Workspace 网域。如果您与整个 Google Workspace 网域共享 Google Workspace 资源(例如文档或事件),系统并不会与服务帐号共享这些资源。同样,服务帐号创建的 Google Workspace 资源不会在您的 Google Workspace 网域中创建。因此,您的 Google Workspace 和 Cloud Identity 管理员无法拥有或管理这些资源。

防止创建服务帐号

您可以通过在组织、项目或文件夹中强制执行 constraints/iam.disableServiceAccountCreation 组织政策限制条件来防止创建服务帐号。

在强制执行此限制条件之前,请考虑以下限制:

  • 如果您在项目或组织的所有项目中强制实施此限制条件,则某些 Google Cloud 服务将无法创建默认服务帐号。因此,如果项目运行的工作负载需要模拟服务帐号,则该项目可能不包含工作负载可以使用的服务帐号。

    如需解决此问题,您可以跨项目启用服务帐号模拟。启用此功能后,您可以在集中项目中创建服务帐号,然后将服务帐号附加到其他项目中的资源。

  • 某些功能(例如工作负载身份联合)要求您创建服务帐号。

    如果您不使用工作负载身份联合,请考虑使用组织政策限制条件来阻止来自所有身份提供商的联合

服务帐号和 Google 群组

您可以将服务帐号添加到 Google 群组,然后向该群组授予角色。但是,将服务帐号添加到群组不是最佳做法。服务帐户由应用使用,每个应用可能都有自己的访问权限要求。

服务帐号的密钥类型

每个服务帐号都与一个公钥/私钥 RSA 密钥对相关联。Service Account Credentials API 使用此内部密钥对创建短期有效的服务帐号凭据以及为 blob 和 JSON Web 令牌 (JWT) 签名。此密钥对称为“Google 管理的密钥对”

此外,您还可以创建多个公钥/私钥 RSA 密钥对(称为“用户管理的密钥对”),并使用私钥向 Google API 进行身份验证。此私钥称为“服务帐号密钥”

Google 管理的密钥对

Service Account Credentials API 以及 Google Cloud 服务(例如 App Engine 和 Compute Engine)使用由 Google 管理的密钥对来生成服务帐号的短期凭据

Google 管理的密钥对会自动轮替并用于签名,使用时间最多两周。轮替过程具有概率性;新密钥的使用率随密钥的生命周期先逐渐上升,再逐渐下降。

由 Google 管理的密钥对中的私钥始终由第三方托管,您永远无法直接访问。

Google 管理的密钥对中的公钥可公开访问,因此任何人都可以验证使用私钥创建的签名。您可以通过多种不同格式访问公钥:

  • X.509 certificate:https://www.googleapis.com/service_accounts/v1/metadata/x509/SERVICE_ACCOUNT_EMAIL
  • JSON Web 密钥 (JWK):https://www.googleapis.com/service_accounts/v1/jwk/SERVICE_ACCOUNT_EMAIL
  • 原始格式:https://www.googleapis.com/service_accounts/v1/metadata/raw/SERVICE_ACCOUNT_EMAIL

如果您下载并缓存公钥,我们建议您将其缓存最多 24 小时,以确保您始终拥有当前密钥。无论您何时检索公钥,它都会在检索后至少 24 小时内有效。

用户管理的密钥对

您可为服务帐号创建用户管理的密钥对,然后使用每个密钥对中的私钥向 Google API 进行身份验证。此私钥称为“服务帐号密钥”。每个服务帐号最多可以有 10 个服务帐号密钥。Google 只存储用户管理的密钥对的公开部分。

有几种不同的方法可用于为服务帐号创建用户管理的密钥对:

用户管理的密钥是非常强大的凭据,如果管理不正确,就可能面临安全风险。如需限制使用用户管理的密钥,您可以在组织、项目或文件夹中强制实施以下组织政策限制条件

  • constraints/iam.disableServiceAccountKeyCreation:禁止主帐号创建用户管理的服务帐号密钥。
  • constraints/iam.disableServiceAccountKeyUpload:禁止主帐号上传服务帐号的公钥。

如果您因使用工作负载身份联合而强制实施这些限制条件,请考虑将组织政策限制条件用于工作负载身份联合来指定允许哪些身份提供商。

服务帐号的类型

用户管理的服务帐号

您可以使用 IAM API、Cloud Console 或 gcloud 命令行工具在项目中创建用户管理的服务帐号。您负责管理和保护这些帐号。

默认情况下,您可以在一个项目中最多创建 100 个用户管理的服务帐号。如果此配额不能满足您的需求,您可以使用 Cloud Console 申请增加配额。本页面介绍的默认服务帐号不计入此配额。

在项目中创建用户管理的服务帐号时,请选择服务帐号的名称。此名称显示在用于标识服务帐号的电子邮件地址中,该地址采用以下格式:

service-account-name@project-id.iam.gserviceaccount.com

默认服务帐号

如果您启用或使用某些 Google Cloud 服务,这些服务会创建用户管理的服务帐号,以使该服务能够部署可访问其他 Google Cloud 资源的作业。这些帐号称为默认服务帐号

如果您的应用在具有默认服务帐号的 Google Cloud 环境中运行,您的应用可以使用默认服务帐号的凭据来调用 Google Cloud API。或者,您可以创建自己的用户管理的服务帐号,并使用该帐号进行身份验证。如需了解详情,请参阅自动查找凭据

下表列出了可创建默认服务帐号的服务:

服务 服务帐号名称 电子邮件地址
App Engine 以及任何使用 App Engine 的 Google Cloud 服务 App Engine 默认服务帐号 project-id@appspot.gserviceaccount.com
Compute Engine 以及任何使用 Compute Engine 的 Google Cloud 服务 Compute Engine 默认服务帐号 project-number-compute@developer.gserviceaccount.com

Google 管理的服务帐号

某些 Google Cloud 服务需要访问您的资源才能代表您执行操作。例如,当您使用 Cloud Run 运行容器时,服务需要访问所有可触发容器的 Pub/Sub 主题。

为了满足这一需求,Google 会为许多 Google Cloud 服务创建和管理服务帐号。这些服务帐号称为 Google 管理的服务帐号。您可以在项目的 IAM 政策、审核日志中或 Cloud Console 的 IAM 页面上看到 Google 管理的服务帐号。

Google 管理的服务帐号未在 Cloud Console 的服务帐号页面中列出。

例如:

  • Google APIs Service Agent。您的项目可能包含一个名为 Google APIs Service Agent 的服务帐号,其电子邮件地址采用以下格式:project-number@cloudservices.gserviceaccount.com

    该服务帐号代表您运行内部 Google 流程。它会自动获得项目的 Editor 角色 (roles/editor)。

  • Google 管理的服务帐号的角色管理员。您的 IAM 审核日志可能引用了服务帐号 service-agent-manager@system.gserviceaccount.com

    此服务帐号管理已授予其他 Google 管理的服务帐号的角色。它仅在审核日志中可见。

    例如,如果您使用新的 API,则 Google 可能会自动创建一个新的 Google 管理的服务帐号,并向该服务帐号授予针对项目的角色。如果授予这些角色,则系统会生成一个审核日志条目,其中显示 service-agent-manager@system.gserviceaccount.com 为项目设置了 IAM 政策。

  • 其他 Google 管理的服务帐号。您的项目可能包含其他代表各项服务执行操作的 Google 管理的服务帐号。这些服务帐号有时称为“服务代理”。角色可能会自动授予给这些服务代理;这些角色的名称通常以 serviceAgent 结尾。

    如需查看服务代理以及自动授予给每个服务代理的角色的完整列表,请参阅服务代理

服务帐号位置

每个服务帐号都位于一个项目中。服务帐号创建后,便无法再移动到其他项目中。

您可以通过以下几种方式将服务帐号整理到项目中:

  • 在同一项目中创建服务帐号和资源。

    这种方法让您可以轻松开始使用服务帐号。但是,当服务帐户分布在多个项目中时,可能很难跟踪它们。

  • 集中不同项目中的服务帐号

    此方法会将您的组织的所有服务帐号都放置在少量项目中,从而简化服务帐号的管理。但是,如果将服务帐号连接到其他项目中的资源,则此方法需要额外的设置,这使这些资源可以将服务帐号用作其身份。

    如果一个服务帐号位于一个项目中,并且其访问另一个项目中的资源,您通常必须在这两个项目中为此资源启用 API。例如,如果您在项目 my-service-accounts 中拥有一个服务帐号并在项目 my-application 中拥有一个 Cloud SQL 实例,您必须同时在 my-service-accountsmy-application 中启用 Cloud SQL API。

    默认情况下,您最多可以在一个项目中创建 100 个服务帐号。如果您需要创建其他服务帐号,请申请增加配额

服务帐号权限

服务帐号属于身份资源

由于服务帐号是身份,因此您可以为服务帐号授予项目中的资源,就像为其他任何主帐号授予这些角色一样。例如,如果您希望允许该服务帐号访问 Cloud Storage 存储分区中的对象,则可以向服务帐号授予存储分区的 Storage Object Viewer 角色 (roles/storage.objectViewer)。

但是,服务帐号也是接受 IAM 政策的资源。因此,您可以为主帐号授予服务帐号的角色或某个服务帐号的父资源,从而允许其他成员访问服务帐号。例如,如需允许用户模拟服务帐号,您可以向该服务帐号授予 Service Account User 角色 (roles/iam.serviceAccountUser)。

如需详细了解如何向主帐号(包括服务帐号)授予角色,请参阅授予、更改和撤消访问权限

如需详细了解如何对服务帐号授予用户角色,请参阅管理服务帐号模拟

Service Account User 角色

您可以在项目级为项目中的所有服务帐号授予 Service Account User 角色 (roles/iam.serviceAccountUser),也可以在服务帐号级授予该角色。

  • 通过将 Service Account User 角色授予某项目的用户,可让该用户有权访问该项目中的所有服务帐号(包括将来可能创建的服务帐号)。

  • 通过将 Service Account User 角色授予特定服务帐号的用户,可让该用户只有权访问该服务帐号。

在服务帐号中具有 Service Account User 角色的用户可以用其间接访问该服务帐号有权访问的所有资源。例如,如果某个服务帐号具有 Compute Admin 角色 (roles/compute.admin),则该服务帐号上具有 Service Account User 角色 (roles/iam.serviceAccountUser) 的用户可以该服务帐号的身份启动 Compute Engine 实例。在此流程中,用户会模拟该服务帐号,使用其获得的角色和权限执行任何任务。

如需详细了解如何对服务帐号授予用户角色,请参阅管理服务帐号模拟

服务帐号代表您的服务级安全性。服务的安全性取决于具有 IAM 角色来管理和使用服务帐号的人员,以及为这些服务帐号保留私有外部密钥的人员。确保安全性的最佳做法包括:

  • 使用 IAM API 审核服务帐号、密钥和这些服务帐号的政策。
  • 如果您的服务帐号不需要外部密钥,请删除它们。
  • 如果用户不需要管理或使用服务帐号的权限,请将其从适用的 IAM 政策中移除。
  • 确保服务帐号拥有尽可能少的权限。请谨慎使用默认服务帐号,因为系统会自动向其授予项目的 Editor (roles/editor) 角色。

如需详细了解最佳做法,请参阅了解服务帐号

Service Account Token Creator 角色

此角色可以模拟服务帐号以创建 OAuth2 访问令牌、签署 Blob 或 JWT。

访问权限范围

访问权限范围是为 Compute Engine 虚拟机 (VM) 实例指定权限的传统方法。它们定义了来自 gcloud 工具和客户端库的请求中使用的默认 OAuth 范围。

Google Cloud 现在使用 IAM(而非访问权限范围)为 Compute Engine 实例指定权限。但是,在将实例配置为模拟服务帐号时,您仍需设置访问权限范围。

如需了解详情,请参阅 Compute Engine 文档

短期服务帐号凭据

您可以创建短期凭据,以获得 Google Cloud 服务帐号的身份。这些凭据可用于对 Google Cloud API 或其他非 Google API 调用进行身份验证。

这些凭据的最常见使用场景是临时委派访问权限以访问跨不同项目、组织或帐号的 Google Cloud 资源。例如,可向外部调用者授予临时紧急访问权限,而不是提供高权限服务帐号的永久性凭据。或者,外部调用者采用具有较少权限的指定服务帐号,而无需更高权限的服务帐号的凭据。

如需了解详情,请参阅创建短期服务帐号凭据

工作负载身份联合

您可以向 Google Cloud 外部(例如 Amazon Web Services (AWS) 或 Microsoft Azure)运行的工作负载的身份授予模拟服务帐号的权限。这样,您就可以使用短期凭据(而不是使用服务帐号密钥)直接访问资源。

如需了解详情,请参阅工作负载身份联合

应用默认凭据

应用默认凭据是 Google Cloud 客户端库用于自动发现服务帐号凭据的工具。您可以在环境变量中指定服务帐号密钥,而应用默认凭据会自动使用该服务帐号密钥。如果您未指定密钥,则应用默认凭据会使用关联到运行代码的资源的服务帐号,或者关联到运行代码的服务的默认服务帐号。

如需了解详情,请参阅自动查找凭据

后续步骤

自行试用

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

免费开始使用