近日Kubernetes社区披露了使用LoadBalancer或External IPs进行中间人攻击的漏洞,在一个多租集群中攻击者可以通过创建和更新Service实例状态等字段来劫持集群中来自其他Pod的流量。
影响范围
当前所有版本的Kubernetes集群均在该漏洞影响范围内,该漏洞源自Kubernetes设计上的安全缺陷,明确的修复计划将在issue 97110中给出。
对于ACK集群用户,如果您的集群运行在多租户场景下,或者集群中运行的应用可能来自非受信的用户所部署,此时您可以通过在apiserver审计日志中搜寻Service的status对象的patch事件来发现可疑事件。具体操作,请参见查看详细日志记录。
漏洞描述
在多租集群中,攻击者可以通过下面两种方式完成对指定Service的流量劫持。
- 创建ClusterIP类型的Service,并设置服务实例spec中的externalIP字段来指定劫持该IP内的流量。
- 对于LoadBalancer类型的Service,攻击者可以通过设置Service实例中的spec.loadBalancerIP字段并且修改status.loadBalancer.ingress.ip达到流量劫持的目的。
防范措施
目前Kubernetes社区官方还没有提供针对该漏洞的修复方案,由于漏洞修复可能涉及原生模型较大的改动,预计在官方正式修复版本发布前还需一段较长的时间。建议您优先采用以下方案防范攻击:
- 对于external IPs的使用建议如下:
- 通过admission webhook的准入校验方式限制external IPs的使用,详情请参见Kubernetes官方给出的externalip-webhook源码和部署说明。
- 通过OPA Gatekeeper来限制external IPs的使用范围,具体操作,请参见组件介绍。ConstraintTemplate和Constraint的示例模板请参考externalip。
- 对于LoadBalancer类型的IP使用建议如下:
- 尽可能收敛对Service的status对象的patch权限。
- 可采用上述external IPs的使用建议,通过admission webhook或OPA Gatekeeper的方式来限制对LoadBalancer IP的使用。