服务账户的 IAM 角色 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

服务账户的 IAM 角色

Pod 的容器中的应用程序可以使用 Amazon 开发工具包或 Amazon CLI,以向使用 Amazon Identity and Access Management(IAM)权限的 Amazon Web Services 发出 API 请求。应用程序必须通过 Amazon 凭证签署 Amazon API 请求。服务账户的 IAM 角色可管理供应用程序使用的凭证,这与 Amazon EC2 实例配置文件为 Amazon EC2 实例提供凭证的方式相似。您可以将 IAM 角色与 Kubernetes 服务账户关联并配置 Pods 使用服务账户,而不是创建 Amazon 凭证并将其分配到容器或使用 Amazon EC2 实例的角色。您不能将 IAM 角色用于包含 Amazon Outposts 上的 Amazon EKS 的本地集群的服务账户。

服务账户的 IAM 角色提供下列优势:

  • 最低权限 – 您可以将 IAM 权限范围限定到服务账户,并且只有使用该服务账户的 Pods 可以访问这些权限。此功能还消除了对 kiamkube2iam 等第三方解决方案的需求。

  • 凭证隔离 – Pod's 的容器只能检索与该容器所使用服务账户关联的 IAM 角色的凭证。容器永远无法访问其他 Pods 中其他容器所使用的凭证。在使用服务账户的 IAM 角色时,Pod's 容器还具有分配给 Amazon EKS 节点 IAM 角色的权限,除非您阻止 Pod 访问 Amazon EC2 实例元数据服务(IMDS)。有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问

  • 可审核性 – 可通过 Amazon CloudTrail 进行访问和事件日志记录以帮助确保可追溯性审核。

通过完成下列步骤为服务账户启用 IAM 角色:

  1. 为集群创建 IAM OIDC 提供商 – 对于每个集群,您只需完成一次此步骤。

    注意

    如果您启用 EKS VPC 端点,则无法从该 VPC 内部访问 EKS OIDC 服务端点。因此,您在 VPC 中使用 eksctl 创建 OIDC 提供商等操作将不起作用,并且在尝试请求 https://oidc.eks.region.amazonaws.com 时将导致超时。错误消息示例如下:

    ** server can't find oidc.eks.region.amazonaws.com: NXDOMAIN

    要完成此步骤,您可以在 VPC 外部运行该命令,例如在 Amazon CloudShell 中或在连接到互联网的计算机上。

  2. 配置 Kubernetes 服务账户以分派 IAM 角色 – 针对您希望应用程序拥有的每组唯一权限完成此步骤。

  3. 配置 Pods 以使用 Kubernetes 服务账户 – 为需要访问 Amazon Web Services 的每个 Pod 完成此步骤。

  4. 使用支持的 Amazon 开发工具包:确认工作负载使用支持版本的 Amazon SDK,并且工作负载使用默认凭证链。

IAM、Kubernetes 以及 OpenID Connect(OIDC)背景信息

2014 年,Amazon Identity and Access Management 使用 OpenID Connect(OIDC)增加了对联合身份验证的支持。此功能允许您通过支持的身份提供商对 Amazon API 调用进行身份验证,并获得有效的 OIDC JSON Web 令牌(JWT)。您可以将此令牌传递到 Amazon STS AssumeRoleWithWebIdentity API 操作并接收 IAM 临时角色凭证。您可以使用这些凭证与任意 Amazon Web Service 交互,包括 Amazon S3 和 DynamoDB。

每个 JWT 令牌均由签名密钥对签名。密钥由 Amazon EKS 管理的 OIDC 提供商提供,私钥每 7 天轮换一次。Amazon EKS 会保留公钥直至其过期。如果您连接外部 OIDC 客户端,请注意您需要在公钥过期之前刷新签名密钥。了解如何获取签名密钥

Kubernetes 长期以来将服务账户用作其内部身份系统。Pods 可以使用自动装载的令牌(这是非 OIDC JWT,只有 Kubernetes API 服务器可以验证)进行 Kubernetes API 服务器的身份验证。这些旧服务账户令牌不会过期,轮换签名密钥是一个困难的过程。在 Kubernetes 版本 1.12 中,添加了对新 ProjectedServiceAccountToken 功能的支持。此功能是也包含服务账户身份的 OIDC JSON Web 令牌,并支持可配置的受众。

Amazon EKS 为包含 ProjectedServiceAccountToken JSON Web 令牌的签名密钥的每个集群托管公有 OIDC 发现端点,这样 IAM 等外部系统就可以验证和接收 Kubernetes 颁发的 OIDC 令牌。