一.具体原理
在Kubernetes中,API Server是与集群通信的核心组件之一。默认情况下,Kubernetes API Server会在端口8080上侦听请求,如果Kubernetes API Server在8080端口上启用了未授权访问,那么攻击者可以通过该端口访问API Server并获取敏感信息或执行攻击。这可能会影响任何使用未经身份验证的HTTP协议连接的版本,包括Kubernetes的早期版本和未经修补的漏洞版本。
二.利用条件
- 1) k8s版本小于1.16.0
2) 8080对公网开放
三.漏洞复现
在一般比较新的Kubernetes版本中,8080端口的HTTP服务是默认不启动的,我们可以通过命令“netstat-anpt|grep 8080"命令查看8080端口是否启动,如图1-1通过所示,但如果Kubernetes使用者在/etc/kubernetes/manifests/kube-apiserver.yaml中配置了“- -–insecure-port=8080”及“- -–insecure-bind-address=0.0.0.0”这两个配置项,如图1-2所示,那么攻击者只要网络可达就可以直接对K8S进行未授权攻击。
图1-1 查看8080端口是否启动
图1-2 8080端口错误配置
当我们在etc/kubernetes/manifests/kube-apiserver.yaml中错误配置了之后,我们再访问K8S的8080端口,就可以成功复现出了K8S未授权漏洞,如图1-3所示。
图1-3 API Server 8080端口未授权
四.利用过程
1)我们可以通过在本地或者攻击机上使用Kubectl命令获取相关K8S集群的信息,例如我们通过执行如下命令来获取Nodes节点信息,执行结果如图1-4所示。
kubectl -s http://xxx.xxx.xxx.xxx:8080 get nodes
图1-4 通过Kubectl命令来获取Nodes节点信息
2)同时也可以执行如下命令来直接查看当前K8S集群中所有Pod,执行结果如图1-5所示。
kubectl -s http://xxx.xxx.xxx.xxx:8080 get pods -A
图1-5 通过Kubectl命令来获取Pod信息
五.防御措施
如果您发现Kubernetes API Server的8080端口未授权访问,这可能意味着存在一个安全风险,可能会导致未经授权的用户或攻击者对集群进行操作。解决此问题的一种常见方法是通过以下步骤限制对API Server的访问:
1).使用网络策略:在Kubernetes中,可以使用网络策略(Network Policies)来限制进出集群的流量。通过定义适当的网络策略,可以指定哪些Pod可以访问API Server的8080端口,以及允许访问的源IP范围等。
2). 启用身份验证和授权:确保API Server启用了身份验证和授权功能。Kubernetes提供了多种身份验证和授权机制,例如基于证书的身份验证、RBAC(Role-Based Access Control)等。配置适当的身份验证和授权规则,以确保只有经过身份验证的用户可以访问API Server。
3). 使用TLS加密:启用API Server的TLS加密,以加密传输过程中的数据。使用有效的证书和密钥来保护API Server的通信。
4). 使用网络隔离:确保API Server不直接暴露在公共网络中。可以使用防火墙规则或网络安全组来限制对API Server端口的访问,只允许受信任的IP地址或特定网络访问该端口。
5). 更新默认配置:Kubernetes提供了一些默认配置文件,建议不要直接使用这些默认配置,而是根据安全最佳实践进行自定义配置。检查您的API Server配置文件,确保已经采取了适当的安全措施。