技术概览 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

技术概览

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

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

Amazon EKS 现在针对包含ProjectedServiceAccountTokenJSON Web 令牌,这样等外部系统(如 IAM)可以验证和接收 Kubernetes 发布的 OIDC 令牌。

IAM 角色配置

在 IAM 中,您创建一个 IAM 角色,其范围限定为集群的 OIDC 提供商、服务账户命名空间以及(可选)服务账户名称,然后附加您想要与服务账户关联的 IAM 策略。您可在下方的 StringEqualsStringLike 条件中添加多个条目,以将多个服务账户或命名空间用于角色。

  • 将角色范围限定为特定服务账户:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws-cn:iam::<ACCOUNT_ID>:oidc-provider/<OIDC_PROVIDER>" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "<OIDC_PROVIDER>:sub": "system:serviceaccount:<SERVICE_ACCOUNT_NAMESPACE>:<SERVICE_ACCOUNT_NAME>" } } } ] }
  • 将角色限定为整个命名空间(以使用命名空间为边界):

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws-cn:iam::<ACCOUNT_ID>:oidc-provider/<OIDC_PROVIDER>" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringLike": { "<OIDC_PROVIDER>:sub": "system:serviceaccount:<SERVICE_ACCOUNT_NAMESPACE>:*" } } } ] }

服务账户配置

在 Kubernetes 中,您通过添加服务账户,定义 IAM 角色与集群中的服务账户关联。eks.amazonaws.com/role-arn注释添加到服务帐户。

apiVersion: v1 kind: ServiceAccount metadata: annotations: eks.amazonaws.com/role-arn: arn:aws-cn:iam::<ACCOUNT_ID>:role/<IAM_ROLE_NAME>

Pod 配置

这些区域有:亚马逊 EKS 容器身份网络挂钩监视与具有此注释的服务账户关联的 Pod,并对其应用以下环境变量。

AWS_ROLE_ARN=arn:aws-cn:iam::<ACCOUNT_ID>:role/<IAM_ROLE_NAME> AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
注意

您的集群无需使用变异的 Webhook 来配置环境变量和令牌文件装载;您可以选择配置 Pod 以手动添加这些环境变量。

重要

如果您的 Amazon EKS 集群正在运行 Kubernetes 1.17 版或更早版本,您需要将以下环境变量添加到使用中国地区服务账户 IAM 角色的所有 Pod,无论是使用变异 Web 钩子还是手动配置环境变量。

AWS_DEFAULT_REGION=<region-code>

Amazon 开发工具包支持的版本首先在凭证链提供商中查找这些环境变量。角色凭证用于满足这些标准的 Pod。

注意

当窗格使用Amazon凭证来自与服务账户关联的 IAM 角色,Amazon CLI或其他开发工具包使用角色提供的凭证。窗格仍然可以访问提供给亚马逊 EKS 节点 IAM 角色,除非您限制对这些凭据的访问。有关更多信息,请参阅 限制对 IMDS 和 Amazon EC2 实例配置文件证书的访问权限

默认情况下,只有以 root 身份运行的容器才具有正确的文件系统权限来读取 Web 身份令牌文件。您可以通过使容器以 root 身份运行或通过为清单中的容器提供以下安全上下文,以提供这些权限。fsGroup ID 是任意的,您可以选择任何有效的组 ID。有关为 Pod 设置安全上下文的含义的更多信息,请参阅 Kubernetes 文档中的为 Pod 或容器配置安全上下文

注意

1.19 或更高版本的群集不需要提供此安全上下文。

apiVersion: apps/v1 kind: Deployment metadata: name: <my-app> spec: template: metadata: labels: app: <my-app> spec: serviceAccountName: <my-app> containers: - name: <my-app> image: <my-app>:latest securityContext: fsGroup: <1337> ...

这些区域有:kubelet请求并代表容器存储令牌。默认情况下,kubelet如果令牌早于其总 TTL 的 80%,或者令牌早于 24 小时,则会刷新令牌。您可以使用 POD 规范中的设置修改任何帐户(默认服务帐户除外)的过期时间。有关更多信息,请参阅 。服务帐户令牌数量投影在 Kubernetes 文档中。

跨账户 IAM 权限

您可以通过从其他账户的集群创建身份提供商或者使用链接的 AssumeRole 操作,配置跨账户 IAM 权限。在以下示例中,账户 A 拥有一个 Amazon EKS 集群,该集群支持服务账户的 IAM 角色。在该集群上运行的 Pods 需要代入账户 B 的 IAM 权限。

例 : 从其他账户的集群创建身份提供商

在此示例中,账户 A 将从其集群向账户 B 提供 OIDC 发布者 URL。账户 B 遵循为您的集群创建 IAM OIDC 提供商为您的服务账户创建 IAM 角色和策略中的说明,并使用来自账户 A 集群的 OIDC 发布者 URL。然后,集群管理员注释账户 A 的集群中的服务账户以使用来自账户 B 的角色。

apiVersion: v1 kind: ServiceAccount metadata: annotations: eks.amazonaws.com/role-arn: arn:aws-cn:iam::<ACCOUNT_B_ID>:role/<IAM_ROLE_NAME>

例 :使用链接 AssumeRole 操作

在本示例中,账户 B 将创建一个 IAM 策略,该策略具有授予账户 A 集群中 Pod 的权限。账户 B 将该策略附加到具有可信关系的 IAM 角色,允许AssumeRole帐户 A 的权限 (111111111111),如下所示。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws-cn:iam::111111111111:root" }, "Action": "sts:AssumeRole", "Condition": {} } ] }

账户 A 创建具有信任策略的角色,从使用集群的 OIDC 发布者 URL 创建的身份提供商获取凭证,如下所示。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws-cn:iam::111111111111:oidc-provider/oidc.eks.<region-code>.amazonaws.com/id/EXAMPLEC061A78C479E31025A21AC4CDE191335D05820BE5CE" }, "Action": "sts:AssumeRoleWithWebIdentity" } ] }

账户 A 将策略附加到具有以下权限的角色,以代入账户 B 创建的角色。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws-cn:iam::222222222222:role/account-b-role" } ] }

Pod 的应用程序代码使用两个配置文件代入账户 B 的角色:account_b_roleaccount_a_roleaccount_b_role 配置文件使用 account_a_role 配置文件作为其源。对于 Amazon CLI,该 ~/.aws/config 文件类似于下例所示。

[profile account_b_role] source_profile = account_a_role role_arn=arn:aws-cn:iam::222222222222:role/account-b-role [profile account_a_role] web_identity_token_file = /var/run/secrets/eks.amazonaws.com/serviceaccount/token role_arn=arn:aws-cn:iam::111111111111:role/account-a-role

要为其他 Amazon 开发工具包指定链接的配置文件,请参考其文档。