基于标签授予容器组(pod)对 AWS 资源的访问权限 - Amazon EKS

帮助改进此页面

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

基于标签授予容器组(pod)对 AWS 资源的访问权限

基于属性的访问权限控制(ABAC)通过将各种属性组合在一起的策略向用户授予权限。EKS 容器组身份将标签附加到每个容器组(pod)的临时凭证上,其中包含集群名称、命名空间、服务账户名称等属性。这些角色会话标签允许管理员根据匹配的标签访问 AWS 资源,从而使管理员能够创建可跨服务账户使用的单一角色。通过添加对角色会话标签的支持,您可以在集群之间和集群内的工作负载之间实施更严格的安全边界,同时重复使用相同的 IAM 角色和 IAM 策略。

带标签的示例策略

以下是一个 IAM 策略示例,该策略会在相应对象标有 EKS 集群名称时授予 s3:GetObject 权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectTagging" ], "Resource": "*", "Condition": { "StringEquals": { "s3:ExistingObjectTag/eks-cluster-name": "${aws:PrincipalTag/eks-cluster-name}" } } } ] }

启用或禁用会话标签

EKS 容器组身份会在代入角色时添加一组预定义的会话标签。这些会话标签允许管理员根据匹配的标签访问 AWS 资源,从而使管理员能够创建可跨资源使用的单一角色。

启用会话标签

会话标签将通过 EKS 容器组身份自动启用,您无需执行任何操作。默认情况下,EKS 容器组身份会将一组预定义标签附加到会话。要在策略中引用这些标签,请使用语法 ${aws:PrincipalTag/,后跟标签键。例如 ${aws:PrincipalTag/kubernetes-namespace}

  • eks-cluster-arn

  • eks-cluster-name

  • kubernetes-namespace

  • kubernetes-service-account

  • kubernetes-pod-name

  • kubernetes-pod-uid

禁用会话标签

AWS 会将内联会话策略、托管策略 ARN 和会话标签压缩为具有单独限制的打包二进制格式。如果您收到 PackedPolicyTooLarge 错误消息,表明打包二进制格式超出了大小限制,则可通过禁用由 EKS 容器组身份添加的会话标签来减小大小。要禁用这些会话标签,请执行以下步骤:

  1. 打开 Amazon EKS 控制台

  2. 在左侧导航窗格中,选择集群,然后选择要修改的集群名称。

  3. 选择访问选项卡。

  4. 容器组身份关联中,在关联 ID 中选择要修改的关联 ID,然后选择编辑

  5. 会话标签下,选择禁用会话标签

  6. 选择保存更改

跨账户标签

EKS 容器组身份添加的所有会话标签都是可传递的;将标签键和值传递到任何 AssumeRole 操作,以便您的工作负载用于将角色切换到其他账户。您可以在其他账户的策略中使用这些标签,来限制跨账户场景中的访问。有关更多信息,请参阅《IAM 用户指南》中的使用会话标签链接角色

自定义标签

EKS 容器组身份无法在其执行的 AssumeRole 操作中添加其它自定义标签。但是,应用于 IAM 角色的标签始终可通过相同格式引用:${aws:PrincipalTag/ 后跟键,例如 ${aws:PrincipalTag/MyCustomTag}

注意

如果发生冲突,通过 sts:AssumeRole 请求添加到会话中的标签优先。例如,假设:

  • EKS 代入客户角色时,Amazon EKS 向会话添加键 eks-cluster-name 和值 my-cluster

  • 您向 IAM 角色添加了一个值为 my-own-clustereks-cluster-name 标签。

在这种情况下,前者优先,eks-cluster-name 标签的值为 my-cluster