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

默认情况下,AWS EKS 上的任何 kubernetes pod 都可以承担底层节点的 IAM 角色。这意味着所有容器 immediately get access 都适用于 AmazonEKSWorkerNodePolicy 和 AmazonEC2ContainerRegistryReadOnly 等策略,我想避免这种情况。

我不想使用 iptables 从所有容器中完全阻止 AWS API,因为如果有正确的凭据,应该可以调用它。

使用 IAM roles for service accounts ,可以将某个 IAM 角色与 pod 的服务帐户相关联。但这会阻止 pod 承担底层节点的 IAM 角色吗?

stack overflow Is it possible to prevent a kubernetes pod on EKS from assuming the node's IAM role?
原文答案
author avatar

接受的答案

可以防止它(如果一起使用)的两个主要因素在 AWS 文档中进行了描述:

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

另一种选择是使用 kube2iam


答案:

作者头像

我认为这在 Official EKS Best Practices Guides > Security > Identity and Access Management (IAM) > Restrict access to the instance profile assigned to the worker node 中得到了最好的解释

引用它

pod仍然可以继承分配给worker节点的instance profile的权限

强烈建议您阻止访问实例元数据,以最大限度地减少违规的爆炸半径。

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

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

要阻止 pod 从 EKS 节点 ec2 实例配置文件(节点的 iam 角色)获取 IAM 凭证, Restrict access to instance profile 中提到了3 个备选方案

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

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