默认情况下,AWS EKS上的任何Kubernetes Pod都可以承担底层节点的IAM角色。这意味着所有容器immediately get access都指向AmazonEKSWorkerNodePolicy和AmazonEC2ContainerRegistryReadOnly等策略,这是我想要避免的。
我不想完全阻止使用iptables
的所有容器使用AWS API,因为如果有适当的凭据,应该可以调用它。
使用IAM roles for service accounts,可以将某个IAM角色与Pod的服务帐户相关联。但这是否会阻止Pod承担底层节点的IAM角色?
2条答案
按热度按时间dnph8jn41#
AWS文档中介绍了可能会阻止它的两个主要因素(如果同时使用):
最重要的是,正如文档中指出的,这取决于CNI,如果您使用Calico,这是一个关于Calico网络策略的问题和缓解的很好的write-up。
另一种选择是使用kube2iam。
bgibtngc2#
我认为这在Official EKS Best Practices Guides>Security>Identity and Access Management(IAM)>限制对分配给工作节点的示例配置文件的访问中得到了最好的解释
引用它的话
Pod仍然可以继承分配给Worker节点的示例配置文件的权限
强烈建议您阻止访问示例元数据,以最大限度地减少漏洞的爆炸半径。
无论您是否使用IRSA(服务帐户的IAM角色),最好阻止从Pod访问示例元数据。
如果Pod实际上需要IAM凭据,那么您应该使用IRSA(或其他获取IAM凭据的方法),这样您就可以符合最小特权原则。
要阻止Pod从EKS节点EC2示例配置文件(节点的IAM角色)获取IAM凭据,有限制访问示例配置文件中提到的3个替代方案:
修改启动模板,要求示例使用IMDSv2(强调v2),跳数设置为1
节点中的
iptables
。配置起来要麻烦得多
Amazon EC2>示例>配置示例>示例元数据和用户数据>检索示例元数据>限制示例元数据服务访问
Kubernetes网络策略
NetworkPolicy
创建一个
NetworkPolicy
,应用于所有拦截169.254.169.254/32(元数据发现地址)的示例将
NetworkPolicy
添加到需要访问它的特定Pod。这仍然违反了最小特权原则,因为这些Pod将获得节点IAM角色的所有权限,这些权限已经很宽。最佳选项(IMHO)是在启动模板
HttpEndpoint=enable,HttpTokens=required,HttpPutResponseHopLimit=1
中要求IMDSv2和跳数/跳数限制1,Pod仍然可以向元数据发现端点发出请求,但它们永远得不到响应,因为响应包将在节点和Pod之间的第一个路由器(虚拟)处丢弃。