

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 服务账户的 IAM 角色
<a name="iam-roles-for-service-accounts"></a>

**提示**  
 [注册参加](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el)即将举办的 Amazon EKS 讲习会。

容器组（pod）的容器中的应用程序可以使用 Amazon SDK 或 Amazon CLI 以向使用 Amazon Identity and Access Management（IAM）权限的 Amazon 服务 发出 API 请求。应用程序必须通过 Amazon 凭证签署 Amazon API 请求。**服务账户的 IAM 角色（IRSA）**可用于管理供应用程序使用的凭证，这与 Amazon EC2 实例配置文件为 Amazon EC2 实例提供凭证的方式类似。您可以将 IAM 角色与 Kubernetes 服务账户关联并配置容器组（pod）来使用服务账户，而不是创建 Amazon 凭证并将其分配到容器或使用 Amazon EC2 实例的角色。您不能将服务账户的 IAM 角色用于 [Amazon Outposts 上的 Amazon EKS 本地集群](eks-outposts-local-cluster-overview.md)。

服务账户的 IAM 角色提供下列优势：
+  **最低权限** – 您可以将 IAM 权限范围限定到服务账户，并且只有使用该服务账户的容器组（pod）可以访问这些权限。此功能还消除了对 `kiam` 或 `kube2iam` 等第三方解决方案的需求。
+  **凭证隔离**：当对 [Amazon EC2 实例元数据服务（IMDS）](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)的访问受到限制时，容器组的容器只能检索与该容器所使用服务账户关联的 IAM 角色的凭证。容器永远无法访问其他容器组（pod）中其他容器所使用的凭证。如果 IMDS 不受限制，则容器组的容器还可以访问 [Amazon EKS 节点 IAM 角色](create-node-role.md)，并且容器可能能够访问同一节点上其他容器组 IAM 角色的凭证。有关更多信息，请参阅[限制对分配给 Worker 节点的实例配置文件的访问](https://docs.amazonaws.cn/eks/latest/best-practices/identity-and-access-management.html#_identities_and_credentials_for_eks_pods_recommendations)。

**注意**  
配置为 `hostNetwork: true` 的容器组将始终具有 IMDS 访问权限，但 Amazon SDK 和 CLI 在启用后将使用 IRSA 凭证。
+  **可审核性** – 可通过 Amazon CloudTrail 进行访问和事件日志记录以帮助确保可追溯性审核。

**重要**  
容器并非安全边界，使用服务账户的 IAM 角色也不会改变这一点。分配给同一个节点的容器组将共享一个内核，并可能共享其他资源，具体视您的容器组配置而定。虽然在不同节点上运行的容器组将在计算层被隔离，但有些节点应用程序在 Kubernetes API 中拥有超出单个实例范围的额外权限。一些示例包括 `kubelet`、`kube-proxy`、CSI 存储驱动程序或您自己的 Kubernetes 应用程序。

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

1.  [为集群创建 IAM OIDC 提供者](enable-iam-roles-for-service-accounts.md) – 您只需为集群完成一次此操作。
**注意**  
如果启用了 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 feature request](https://github.com/aws/containers-roadmap/issues/2038)。

1.  [将 IAM 角色分配给 Kubernetes 服务账户](associate-service-account-role.md) – 针对您希望应用程序拥有的每组唯一权限完成此步骤。

1.  [将容器组（pod）配置为使用 Kubernetes 服务账户](pod-configuration.md) – 为需要访问 Amazon 服务的每个 容器组（pod）完成此过程。

1.  [将 IRSA 与 Amazon SDK 结合使用](iam-roles-for-service-accounts-minimum-sdk.md) – 确认工作负载使用支持版本的 Amazon SDK，并且工作负载使用默认凭证链。

## IAM、Kubernetes 和 OpenID Connect（OIDC）背景信息
<a name="irsa-oidc-background"></a>

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 令牌](irsa-fetch-keys.md)。

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

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