Workload Identity


对于在 Google Kubernetes Engine (GKE) 上运行的工作负载,建议使用 Workload Identity 以安全且可管理的方式访问 Google Cloud 服务。

如需详细了解如何在 GKE 中启用和使用 Workload Identity,请参阅使用 Workload Identity

您可以使用舰队 Workload Identity舰队(包括 Anthos 集群)中注册的集群提供 Workload Identity 联合支持。

术语

本文档介绍了 Kubernetes 服务帐号Identity and Access Management (IAM) 服务帐号的区别。

Kubernetes 服务帐号
Kubernetes 资源,用于为 GKE pod 中运行的进程提供身份。
IAM 服务帐号
允许应用对 Google Cloud API 进行授权调用的 Google Cloud 资源。

什么是 Workload Identity?

在 GKE 上运行的应用可能需要访问 Google Cloud API,例如 Compute Engine API、BigQuery Storage API 或 Machine Learning API。

Workload Identity 允许 GKE 集群中的 Kubernetes 服务帐号充当 IAM 服务帐号。访问 Google Cloud API 时,使用已配置 Kubernetes 服务帐号的 Pod 会自动作为 IAM 服务帐号进行身份验证。通过工作负载身份,您可以为集群中的每个应用分配不同的精细身份和授权。

Workload Identity 的工作原理

对集群启用 Workload Identity 时,GKE 会自动为集群的 Google Cloud 项目创建固定的 Workload Identity 池。Workload Identity 池允许 IAM 了解和信任 Kubernetes 服务帐号凭据。Workload Identity 池的格式如下:

PROJECT_ID.svc.id.goog

GKE 将此池用于项目中使用 Workload Identity 的所有集群。

将命名空间中的 Kubernetes 服务帐号配置为使用 Workload Identity 时,IAM 使用以下成员名称对凭据进行身份验证:

serviceAccount:PROJECT_ID.svc.id.goog[KUBERNETES_NAMESPACE/KUBERNETES_SERVICE_ACCOUNT]

在此成员名称中:

  • PROJECT_ID:您的 Google Cloud 项目 ID。
  • KUBERNETES_NAMESPACE:Kubernetes 服务帐号的命名空间。
  • KUBERNETES_SERVICE_ACCOUNT:发出请求的 Kubernetes 服务帐号的名称。

配置 Workload Identity 的过程包括使用 IAM 政策绑定功能将 Kubernetes 服务帐号成员名称绑定到具有工作负载所需的权限的 IAM 服务帐号。来自使用此 Kubernetes 服务帐号的工作负载的任何 Google Cloud API 调用都将作为绑定的 IAM 服务帐号进行身份验证。

身份相同性

IAM 用于通过 Workload Identity 验证 Kubernetes 服务帐号的成员名称使用以下变量:

  • Kubernetes 服务帐号名称。
  • Kubernetes 服务帐号的命名空间。
  • Google Cloud 项目 ID。

如果您的项目具有多个与 Kubernetes 服务帐号具有相同名称和命名空间的集群,则所有帐号都会解析为同一成员名称。此通用身份让您可以向 Workload Identity 池(而不是单个集群)授予对 Google Cloud 资源的访问权限。

例如,请考虑下面的图表。集群 A、B 和 C 属于同一 Google Cloud 项目,因此属于同一 Workload Identity 池。集群 A 和集群 B 的 backend 命名空间中的应用在访问 Google Cloud 资源时可以作为 back IAM 服务帐号进行身份验证。IAM 不区分发出调用的集群。

说明工作负载身份池中身份相同性的示意图
通过 Workload Identity 访问 Google Cloud API 的身份相同性

此身份相同性还意味着您必须能够信任特定 Workload Identity 池中的每个集群。例如,如果上述示例中的集群 C 归不受信任的团队所有,则它们可以创建 backend 命名空间,并使用 back IAM 服务帐号访问 Google Cloud API,就像集群 A 和集群 B 那样。

为了避免不受信任的访问,请将集群放在不同的项目中,以确保它们获得不同的 Workload Identity 池,或者确保命名空间名称彼此不同,以避免使用共同的成员名称。

了解 GKE 元数据服务器

启用了 Workload Identity 的 GKE 中的每个节点都会将其元数据存储在 GKE 元数据服务器上。GKE 元数据服务器是 Kubernetes 工作负载所需的 Compute Engine 元数据服务器端点的子集。

GKE 元数据服务器作为 DaemonSet 运行,在每个 Linux 节点上运行一个 Pod,或者在集群中的每个 Windows 节点上运行一个原生 Windows 服务。元数据服务器会拦截对 http://metadata.google.internal (169.254.169.254:80) 的 HTTP 请求。例如,GET /computeMetadata/v1/instance/service-accounts/default/token 请求将会检索 Pod 已配置为进行模拟的 IAM 服务帐号的令牌。指向 GKE 元数据服务器的流量绝不会离开托管 Pod 的虚拟机实例。

下表介绍了 GKE 元数据服务器可用的 Compute Engine 元数据服务器端点的子集。如需查看 Compute Engine 元数据服务器中可用的端点的完整列表,请参阅默认虚拟机元数据值

实例元数据

实例元数据存储在以下目录下。如需查看 Compute Engine 实例元数据条目的完整列表,请参阅虚拟机实例元数据

http://metadata.google.internal/computeMetadata/v1/instance/

条目 说明
hostname

节点的主机名。

id

节点的唯一 ID。

service-accounts/

与节点关联的服务帐号的目录。对于每个服务帐号,系统会提供以下信息:

  • aliases
  • email:服务帐号电子邮件地址。
  • identity:节点独有的 JSON Web 令牌 (JWT)。 您必须在请求中包含 audience 参数。例如 ?audience=http://www.example.com
  • scopes:分配给服务帐号的访问权限范围。
  • token:用于对工作负载进行身份验证的 OAuth 2.0 访问令牌。

实例特性

实例元数据存储在以下目录下。如需查看 Compute Engine 实例特性条目的完整列表,请参阅实例特性

http://metadata.google.internal/computeMetadata/v1/instance/attributes/

条目 说明
cluster-location

集群的 Compute Engine 可用区或区域。

cluster-name

GKE 集群的名称。

cluster-uid

GKE 集群的 UID。

项目元数据

集群项目元数据存储在以下目录下。如需查看 Compute Engine 项目元数据条目的完整列表,请参阅项目元数据

http://metadata.google.internal/computeMetadata/v1/project/

条目 说明
project-id

您的 Google Cloud 项目 ID。

numeric-project-id

您的 Google Cloud 项目编号。

Workload Identity 的替代方案

您可以使用 Workload Identity 的以下替代方案之一从 GKE 访问 Google Cloud API。

  • 导出服务帐号密钥并将其存储为 Kubernetes Secret。Google 服务帐号密钥不会过期,并且需要手动轮替。如果有未被发现的安全漏洞,则导出服务帐号密钥可能会导致安全漏洞范围扩大。如果导出的密钥被盗,攻击者可以使用该密钥以服务帐号的身份进行身份验证,直到您发现并手动撤消密钥。

  • 使用节点的 Compute Engine 默认服务帐号。您可以使用项目中的任何 IAM 服务帐号身份运行节点池。如果您在创建节点池期间未指定服务帐号,则 GKE 会使用项目的 Compute Engine 默认服务帐号。Compute Engine 服务帐号由该节点上部署的所有工作负载共享。这会导致权限过度预配,从而违反最小权限原则,不适合多租户集群。

后续步骤