服务账户的 IAM 角色 - Amazon EKS

服务账户的 IAM 角色

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

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

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

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

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

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

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

  2. 配置服务账户的 AWS Security Token Service 端点 – 针对您希望应用程序拥有的每组唯一权限完成此步骤。

  3. 配置容器组(pod)以使用 Kubernetes 服务账户 – 为需要访问 AWS 服务 的每个容器组(pod)完成此步骤。

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

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

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

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