工作负载身份联合

本文档简要介绍了外部工作负载的身份联合。借助身份联合,您可以授予本地或多云端工作负载对 Google Cloud 资源的访问权限,而无需使用服务帐号密钥。

您可以将身份联合与 Amazon Web Services (AWS) 或任何支持 OpenID Connect (OIDC) 的身份提供商(如 Microsoft Azure)搭配使用。

为何选择身份联合?

传统上,在 Google Cloud 外部运行的应用使用服务帐号密钥来访问 Google Cloud 资源。服务帐号密钥是强大的凭据,如果管理不正确,就可能带来安全风险。

借助身份联合,您可以使用 Identity and Access Management (IAM) 授予外部身份 IAM 角色,包括模拟服务帐号的功能。这样一来,您便可以使用短期有效的访问令牌直接访问资源,而与服务帐号密钥相关联的维护和安全负担也得以消除。

工作负载身份池

工作负载身份池是外部身份集合的容器。

一个项目可以包含多个工作负载身份池,每个池都可以访问不同的资源。这样一来,您可以将相关身份分组到同一个池,然后授予他们对资源的精细访问权限,从而遵循最小权限原则。

通常,我们建议为需要访问 Google Cloud 资源的每个非 Google Cloud 环境(例如开发环境、预演环境或生产环境)创建一个新池。

工作负载身份提供商

工作负载身份提供商是描述 Google Cloud 与外部身份提供商之间关系的实体。示例提供商包括:

  • AWS
  • Azure Active Directory
  • 本地 Active Directory
  • Okta
  • Kubernetes 集群

工作负载身份联合遵循 OAuth 2.0 令牌交换规范。您可以将外部身份提供商提供的凭据提供给安全令牌服务,该服务验证凭据的身份,然后返回联合令牌进行交换。

特性映射

凭据通常包括提供由凭据声明的身份信息的特性,例如名称、电子邮件或用户 ID。特性映射将来自外部令牌的特性应用于 Google 令牌。这样一来,IAM 就可以使用外部提供商提供的令牌授权访问 Google Cloud 资源。

对于 AWS,Google 提供了可涵盖大多数常见场景的默认映射。您还可以提供自定义映射。

对于 OIDC 提供商,您需要提供映射。如需构建映射,请参阅提供商的文档,查看其凭据的特性列表。

特性映射支持通用表达式语言,可让您根据外部凭据绘制新的自定义特性,或使现有特性更易于阅读。例如,以下映射根据 Amazon 资源名称 (ARN) 是否包含 :instance-profile/Production 定义了 environment 特性:

attribute.environment=assertion.arn.contains(":instance-profile/Production") ? "prod" : "test"

条件

借助条件,您可以使用工作负载身份池限制哪些身份可以进行身份验证。使用 CEL 表达式,您可以检查请求凭据上的特性,并选择是否允许访问。

条件在以下几种情况下非常有用:

  • 如果您的工作负载使用向公众公开的身份提供商,您可以限制访问权限,以便只有您选择的身份才能访问您的工作负载身份池。

  • 如果您将一个身份提供商用于多个云端平台,则可以防止将预期用于其他平台的凭据用于 Google Cloud,反之亦然。这有助于避免混淆代理问题

以下示例仅接受来自具有特定 AWS 角色的身份的请求:

attribute.aws_role == "role-mapping"

服务帐号模拟

令牌交换流程会返回联合访问令牌。您可以使用此令牌模拟服务帐号并获取短期有效的 OAuth 2.0 访问令牌。短期有效的访问令牌可让您调用服务帐号有权访问的任何 Google Cloud API。

如需模拟服务帐号,请向您的外部身份授予服务帐号的 Workload Identity User 角色 (roles/iam.workloadIdentityUser),以及您的工作负载所需的角色。您可以向工作负载身份池中的所有身份授予角色,也可以根据身份的特性向特定外部身份授予角色。

下表介绍了授予角色的常见场景:

场景 格式
单一身份 principal://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/subject/subject-name
群组中的所有身份 principalSet://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/group/group-name
具有使用特性映射定义的特性的所有身份 principalSet://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/attribute.attribute-name/attribute-value
池中的所有身份 principalSet://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/*

后续步骤