了解服务帐号

背景

服务帐号是属于您的应用或虚拟机 (VM)(而非单个最终用户)的特殊 Google 帐号。您的应用会使用服务帐号的身份调用 Google API,这样用户就不必直接参与其中。服务帐号可以有零对或更多对服务帐号密钥,用于向 Google 进行身份验证。

一旦您决定需要服务帐号,便可以问自己以下问题,以了解您将如何使用服务帐号:

  • 服务帐号可以访问哪些资源?
  • 服务帐号需要什么权限?
  • 采用服务帐号身份的代码将在何处运行:在 Google Cloud Platform 上还是在本地?

使用以下流程图来找出对上述问题的答案:

服务帐号流程图

IAM 服务帐号的特点之一是您可以将其视为资源身份

将服务帐号视为身份时,您可以为服务帐号授予角色,以使其能够访问资源(例如项目)。

将服务帐号视为资源时,您可以授予用户访问该服务帐号的权限。您可以为用户授予所有者、编辑者、查看者或服务帐号用户角色以访问该服务帐号。

为服务帐号授予访问权限

为服务帐号授予访问资源的权限与为任何其他身份授予访问权限类似。例如,如果您有一个在 Google Compute Engine 上运行的应用,您希望该应用只能访问在 Google Cloud Storage 中创建的对象。您可以为该应用创建一个服务帐号,并为其授予存储对象创建者角色。下图演示了此示例:

服务帐号流程图

了解如何为服务帐号授予角色

作为服务帐号

假设您有一个长期运行的作业,您的员工有权启动该作业。当最后启动该作业的员工离开公司时,您不希望该作业终止。

解决此问题的方法是创建一个服务帐号来启动和停止该作业。可按以下步骤进行操作:

  1. 创建服务帐号

  2. 将此服务帐号的服务帐号用户 (iam.serviceAccountUser) 角色授予需要权限来启动该作业的员工。这种情况下,服务帐号就是资源。

  3. 为相同的员工授予计算实例管理员 (roles/compute.instanceAdmin.v1) 角色。

  4. 现在,员工可以创建运行此服务帐号的 Compute Engine 实例,连接到它们并使用此服务帐号启动该作业。例如:

    gcloud compute instances create my-instance --scopes=cloud-platform \
    --service-account=my-service-account@test9q.iam.gserviceaccount.com \
    --zone=us-central1-a
    

有关详情,请参阅 serviceAccountUser 角色

将数据迁移到 Google Cloud Platform

假设您在其他云服务提供方中进行了一些数据处理,并且希望将处理后的数据转移到 Google Cloud Platform。您可以使用外部云虚拟机中的服务帐号将该数据推送到 Google Cloud Platform。为此,您必须在创建服务帐号时创建并下载服务帐号密钥,然后使用外部流程中的该密钥调用 Cloud Platform API。

跟踪服务帐号

一段时间后,随着您创建越来越多的服务帐号,您可能无法跟踪哪个服务帐号用于何种用途。

服务帐号的显示名称是一种不错的方法,可以捕获有关该服务帐号的其他信息,例如服务帐号的用途或该帐号的联系人。对于新的服务帐号,您可以在创建服务帐号时填充显示名称。对于现有服务帐号,请使用 serviceAccounts.update() 方法修改显示名称。

删除并重新创建服务帐号

删除服务帐号后创建名称相同的新服务帐号,这一操作是可以实现的。但如果您再次使用已删除服务帐号的名称,则可能会导致意外行为。

删除服务帐号时,不会立即删除其角色绑定。如果您创建一个与最近删除的服务帐号同名的新服务帐号,则旧绑定可能仍然存在;但是,它们不会应用于新的服务帐号,即使两个帐号具有相同的电子邮件地址也是如此。出现这种行为的原因是服务帐号在创建时获得了在 Cloud IAM 中的唯一 ID。系统在内部使用这些 ID 授予所有角色绑定,而不是使用服务帐号的电子邮件地址。因此,为已删除的服务帐号存在的任何角色绑定都不会应用于使用相同电子邮件地址的新服务帐号。

为避免混淆,我们建议使用唯一的服务帐号名称。如果无法做到这一点,您可以通过以下方式为新服务帐号授予角色:

  1. 明确移除将角色授予旧服务帐号的任何绑定。
  2. 将这些角色重新授予新服务帐号。

您必须先移除角色绑定,然后再重新添加。简单地再次授予角色会将角色授予已删除的旧服务帐号,从而导致毫无征兆的失败。

为服务帐号授予最低权限

您应该只授予服务帐号实现其目标所需的最低权限集。了解如何为服务帐号授予特定资源的角色

为用户授予访问服务帐号的权限时,请注意,用户可以访问服务帐号有权访问的所有资源。因此,请务必仔细配置服务帐号的权限;即,严格限制您的团队中的哪些人可以充当服务帐号。

如果用户具有 IAM 角色,可以更新 App Engine 和 Compute Engine 实例(例如 App Engine 部署者计算实例管理员),则可以作为用于运行这些实例的服务帐号有效运行代码,并间接访问这些服务帐号有权访问的所有资源。同样,对 Compute Engine 实例的 SSH 访问权限也能够作为该实例执行代码。

管理服务帐号密钥

有两种类型的服务帐号密钥:

  • GCP 管理的密钥。这些密钥由 Cloud Platform 服务(例如 App Engine 和 Compute Engine)使用。您无法下载它们,它们会自动轮换并用于签名,使用时间最多两周。轮替过程具有概率性;新密钥的使用率随密钥的生命周期先逐渐上升,再逐渐下降。我们建议将服务帐号的公钥集缓​​存最多 24 小时,以确保您始终可以访问当前的密钥集。

  • 用户管理的密钥。这些密钥由用户创建、下载和管理。它们在创建后 10 年过期。

对于用户管理的密钥,您需要确保具有适当的流程来解决密钥管理需求,例如:

  • 密钥存储
  • 密钥分配
  • 密钥撤消
  • 密钥轮替
  • 防止未经授权用户访问密钥
  • 密钥恢复

有权访问这些密钥的任何人都可以通过服务帐号访问资源。建议开发者不要将密钥签入源代码中或将其留在“下载内容”目录中。

要增强密钥的安全性,请遵循以下指导:

在 Compute Engine 中使用服务帐号

Compute Engine 实例需要作为服务帐号运行以访问其他 Cloud Platform 资源。要确保您的 Compute Engine 实例的安全性,请考虑以下事项:

  • 您可以使用不同的服务帐号在同一个项目中创建虚拟机。要在创建虚拟机后更改其服务帐号,请使用 instances.setServiceAccount 方法。

  • 您可以将 IAM 角色授予服务帐号以定义它们可以访问的内容。在很多情况下,您不再需要依赖范围。这样,您就可以在不重新创建实例的情况下修改虚拟机服务帐号的权限。

  • 由于实例依赖其服务帐号才有权访问 Cloud Platform 资源,因此请避免在运行中的实例仍在使用服务帐号时将其删除。如果您删除服务帐号,实例就可能会开始无法成功执行其操作。

最佳做法

  • 限制谁可以充当服务帐号。属于服务帐号的服务帐号用户的用户可以间接访问该服务帐号有权访问的所有资源。因此,在向用户授予 serviceAccountUser 角色时要谨慎。

  • 只授予服务帐号实现其目标所需的最低权限集。了解如何为服务帐号授予特定资源的角色

  • 为每项服务创建服务帐号,并仅为其授予该服务所需的权限。

  • 使用服务帐号的显示名称来跟踪服务帐号。在创建服务帐号时,请根据服务帐号的用途填充显示名称。

  • 为您的服务帐号定义一种命名约定。

  • 实施相关流程以自动轮替用户管理的服务帐号密钥。

  • 利用 IAM 服务帐号 API 来实现密钥轮替。

  • 使用 serviceAccount.keys.list() 方法或控制台中的日志查看器页面审核服务帐号和密钥。

  • 请勿删除 Google App Engine 或 Google Compute Engine 上运行中的实例正在使用的服务帐号。

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Cloud Identity and Access Management Documentation