服务账号模拟

经过身份验证的主账号(例如用户或其他服务账号)以服务账号的身份进行身份验证以获取该服务账号的权限时,这就称为模拟服务账号。通过模拟服务账号,经过身份验证的主账号可以访问服务账号可以访问的任何内容。只有具有适当权限的经过身份验证的主账号才能模拟服务账号。

如果您想在不更改 Identity and Access Management (IAM) 政策的情况下更改用户权限,则模拟非常有用。例如,您可以使用模拟向用户临时授予提升的访问权限,或测试一组特定权限是否足以执行任务。您还可以使用模拟在本地开发只能以服务账号身份运行的应用,或者验证在 Google Cloud 外部运行的应用的身份。

Google Cloud 服务账号模拟类似于 AssumeRole 等 Amazon Web Services (AWS) Security Token Service API 方法。

服务账号模拟的工作原理

服务账号模拟始终涉及两个身份:经过身份验证的主账号和主账号模拟的服务账号。为了模拟服务账号,经过身份验证的主账号会获得服务账号的令牌,然后使用该令牌以服务账号的身份进行身份验证。

您可以通过多种方式模拟服务账号:

  • 运行 Google Cloud CLI 命令时,设置 --impersonate-service-account 标志impersonate-service-account 属性。当您使用此设置运行 gcloud CLI 命令时,gcloud CLI 会为服务账号创建短期有效凭据,然后使用这些凭据运行命令。

    您还可以在设置应用默认凭据文件时使用 --impersonate-service-account 标志。此设置使支持模拟的客户端库能够自动模拟服务账号。

  • 使用 Service Account Credentials API 创建短期有效凭据,然后使用这些凭据验证 API 请求的身份。

    短期有效凭据的生命周期有限,持续时间仅为几个小时或更短,不会自动刷新。与服务账号密钥等长期有效凭据相比,短期有效凭据可以降低风险。

  • 使用凭据配置文件配置外部应用来模拟服务账号。此选项仅适用于使用工作负载身份联合的应用。

    当应用使用凭据配置文件访问 Google Cloud 时,首先会使用其特定于环境的凭据获取指定服务账号的短期有效凭据。然后,它使用该短期有效凭据向 Google Cloud 进行身份验证。

如果主账号在模拟服务账号期间访问资源,则大多数审核日志都会同时包含其身份及其模拟的服务账号的身份。如需了解详情,请参阅解读审核日志

使用 Google Cloud 控制台时,您始终会使用用户凭据进行身份验证:您无法模拟服务账号来访问 Google Cloud 控制台中的资源。

不通过模拟进行身份验证

通过以下几种方式,工作负载或用户无需模拟服务账号即可以服务账号身份进行身份验证:

  • 工作负载使用关联的服务账号向 Google API 进行身份验证。在这种情况下,关联的服务账号充当工作负载的身份,并且是请求中涉及的唯一经过身份验证的身份。

    如需了解工作负载如何向 Google Cloud 进行身份验证,请参阅工作负载的身份

  • 主账号以服务账号身份使用服务账号密钥进行身份验证。以服务账号身份使用服务账号密钥进行身份验证时,只会涉及一个经过身份验证的身份,即服务账号的身份。由于只涉及一个身份,因此使用密钥并不是服务账号模拟行为。

在这些情况下,审核日志仅记录服务账号的身份。不会记录任何其他身份,例如在工作负载上执行代码的用户的身份,或者使用服务账号密钥进行身份验证的用户的身份。因此,使用服务账号密钥或授权开发者在特权资源上执行代码(例如与虚拟机实例的 SSH 会话)可能会产生提权和不可否认风险。

所需权限

如需模拟服务账号,您需要拥有 iam.serviceAccounts.getAccessToken 权限。Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator) 等角色具有此权限。

如需详细了解模拟所需的角色,请参阅服务账号身份验证角色

服务账号模拟的应用场景

当您需要执行如下任务时,服务账号模拟非常有用:

  • 向用户授予临时提升的访问权限
  • 测试一组特定权限是否足以完成任务
  • 在本地开发只能以服务账号身份运行的应用
  • 验证外部应用的身份

授予临时提升的访问权限

在某些情况下,您可能希望允许用户临时访问特定资源。例如,您可能希望向某人授予额外的访问权限,以便他们解决突发事件,或者让他们在记录理由后在有限的时间内访问敏感数据。

服务账号模拟是您可以为用户提供这种临时提升的访问权限的方法之一。如需使用服务账号授予临时提升的访问权限,请先向该服务账号授予您要临时授予用户的 IAM 角色。然后,允许用户模拟该服务账号,方法是授予他们模拟服务账号的权限,或使用令牌代理为颁发该服务账号的短期有效凭据。

如需详细了解为用户提供临时提升的访问权限的方法,请参阅临时提升的访问权限概览

测试权限

在某些情况下,您可能需要检查一组特定权限是否足以完成任务。例如,您可能想要确认在移除某些多余的权限后,服务账号仍然可以运行应用。或者,您可能正在帮助用户排查任务问题,并希望验证他们是否可以使用其当前 IAM 角色运行特定命令。

您可以使用服务账号模拟来测试一组特定权限。首先,创建一个服务账号,并向其授予一个或多个具有您要测试的权限的 IAM 角色。然后,模拟该服务账号并尝试执行任务。此方法无需创建测试用户账号或修改自己的 IAM 权限即可测试权限。

如需了解如何模拟服务账号,请参阅使用服务账号模拟

在本地开发应用

在本地开发应用时,您通常可以使用用户凭据进行身份验证。但在某些情况下,可能无法实现这一点,例如,如果您想要对某个服务进行身份验证,而该服务需要具有自定义受众的令牌,但用户通常无法配置这种令牌。在这些情况下,您需要以服务账号身份进行身份验证,而不是使用用户凭据进行身份验证。

对于这些情况,我们建议使用服务账号模拟。使用服务账号模拟可以避免使用服务账号密钥,这会带来额外的安全风险。

如需了解如何模拟服务账号来开发应用,请参阅服务账号模拟

验证外部应用的身份

要访问 Google Cloud 资源,在 Google Cloud 外部运行的应用需要向 Google Cloud 进行身份验证。验证这些应用的身份的一种方法是使用服务账号模拟。

如需让您的应用模拟服务账号,您首先需要设置工作负载身份联合,为您的应用提供经过身份验证的身份。然后,您可以使用凭据配置文件配置应用以模拟服务账号。

虽然可以使用服务账号密钥验证外部应用的身份,但我们强烈建议不使用。服务账号密钥会产生额外的安全风险,应尽可能避免使用。

后续步骤