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

服务账户的 IAM 角色

Pod’s containers can use an Amazon SDK or the Amazon CLI to make API requests to Amazon services using Amazon Identity and Access Management (IAM) permissions. Applications must sign their Amazon API requests with Amazon credentials. IAM roles for service accounts provide the ability to manage credentials for your applications, similar to the way that Amazon EC2 instance profiles provide credentials to Amazon EC2 instances. Instead of creating and distributing your Amazon credentials to the containers or using the Amazon EC2 instance’s role, you associate an IAM role with a [.noloc]`Kubernetes 服务帐号中的应用程序,并将您的Pods配置为使用该服务帐号。您不能将 IAM 角色用于包含 在 Amazon Outposts 上创建本地 Amazon EKS 集群以实现高可用性Amazon Outposts 上的 Amazon EKS 的本地集群的服务账户。

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

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

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

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

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

  1. 为集群创建 IAM OIDC 提供商为集群创建 IAM OIDC 提供者 – 您只需为集群完成一次此操作。

    注意

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

server cant find oidc.eks.region.amazonaws.com: NXDOMAIN

要完成此步骤,您可以在 VPC 外部运行该命令,例如在 Amazon CloudShell 中或在连接到互联网的计算机上。您也可在 VPC 中创建水平分割条件解析器(例如 Route 53 Resolver),以便为 OIDC 颁发者 URL 使用不同的解析器,而不对其使用 VPC DNS。有关 CoreDNS 中条件转发的示例,请参阅 GitHub 上的 Amazon EKS 功能请求为 Kubernetes 服务账户分配 IAM 角色将 IAM 角色分配给 Kubernetes 服务账户 – 针对您希望应用程序拥有的每组唯一权限完成此步骤。配置 Pods 以使用 Kubernetes 服务账户将容器组(pod)配置为使用 Kubernetes 服务账户 – 为需要访问 Amazon 服务的每个Pod完成此过程。将 IRSA 与 Amazon SDK 结合使用将 IRSA 与 Amazon SDK 结合使用 – 确认工作负载使用支持版本的 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 服务交互,包括 Amazon S3 和 DynamoDB。

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