是否可以阻止 EKS 上的 kubernetes pod 承担节点的 IAM 角色?

use*_*842 10 roles amazon-web-services amazon-iam kubernetes amazon-eks

默认情况下,AWS EKS 上的任何 kubernetes pod 都可以承担底层节点的 IAM 角色。这意味着所有容器都会立即访问AmazonEKSWorkerNodePolicy 和 AmazonEC2ContainerRegistryReadOnly 等策略,这是我想避免的。

我不想完全阻止所有容器使用 AWS API iptables,因为只要有正确的凭证,就应该可以调用它。

通过服务账户的 IAM 角色,可以将某个 IAM 角色与 pod 的服务账户关联起来。但这是否会阻止 pod 承担底层节点的 IAM 角色?

Nic*_*ick 6

AWS 文档中描述了可以阻止这种情况的两个主要因素(如果一起使用):

  • OP 已经指出了服务帐户的 IAM 角色。
  • 阻止对实例元数据服务的访问- 阻止 IMDS 可能会停止您拥有的某些正在运行的应用程序/服务,因此应事先进行适当的测试。

最重要的是,正如文档中指出的,这取决于 CNI,如果您使用 Calico,这是一篇关于 Calico 网络策略的问题和缓解措施的很好的文章。

另一种选择是使用kube2iam


ece*_*ulm 5

我认为官方 EKS 最佳实践指南> 安全性>身份和访问管理(IAM) >限制对分配给工作节点的实例配置文件的访问对此进行了最好的解释

引自其中

Pod 仍然可以继承分配给工作节点的实例配置文件的权限

强烈建议您阻止访问实例元数据,以最大程度地减少违规的影响范围。

无论您是否使用 IRSA(服务帐户的 IAM 角色),最好阻止 pod 对实例元数据的访问。

如果 Pod 实际上需要 IAM 凭证,那么您应该使用 IRSA(或其他方式获取 IAM 凭证),这样就可以符合最小权限原则。

要阻止 pod 从 EKS 节点 ec2 实例配置文件(节点的 iam 角色)获取 IAM 凭证,限制对实例配置文件的访问中提到了3 种替代方法

  • 修改启动模板以要求实例使用 IMDSv2(重点是v2)并将跃点计数设置为 1
  • iptables在节点中。
  • Kubernetes 网络策略NetworkPolicy
    • 创建一个NetworkPolicy适用于所有 pod 的阻止访问 169.254.169.254/32(元数据发现地址)
    • 将 a 添加NetworkPolicy到需要访问它的特定 pod。这仍然违反了最小权限原则,因为这些 pod 将获得节点 iam 角色的所有权限,这些权限已经很广泛了。

最好的选择(恕我直言)是在启动模板中要求 IMDSv2 和跳数/跳数限制 1 HttpEndpoint=enable,HttpTokens=required,HttpPutResponseHopLimit=1,pod 仍然能够向元数据发现端点发出请求,但它们永远不会得到响应,因为响应数据包将在节点和 Pod 之间的第一个路由器(虚拟)处丢弃。