案例
SRE同事发现集群中的任何容器都可以无限制地查询Kubernetes API Server。了解攻击者如何利用这种错误配置来窃取其他pod的密钥,甚至是整个Kubernetes集群中。一旦你了解了这种攻击的工作原理,就可以很容易地采取有效的防护方法。
背景
由于错误的配置, Kubernetes集群不受限制地暴露了一个API,导致了一个安全事件。我们将模拟攻击者如何在集群内发起攻击窃取其他pod的配置,包括密钥等信息。
假设,集群内已部署如下的 YAML 配置 :
尝试攻击
我们按照如下步骤还原攻击过程:
1).部署 相应的Deployment, 查看POD 状态
2).使用 kubectl exec
命令 获取 compromised-xxx-xxxx POD 内一个shell进程, 开始模拟攻击
3).在这个简化的场景中,让我们假设Pod已经运行在控制平面control plane的节点。执行route -n
命令获取节点IP地址。
4).对Kubernetes节点执行端口扫描,以检测它是否暴露了任何可疑的HTTP服务。在compromised-xxx-xxxx POD 内执行以下代码,以查看是否有任何HTTP服务器正在侦听Node的前10,000个端口。将NODE_IP替换为上一步中检索到的节点IP地址。
大概一分钟左右 扫描到 9090
端口正在监听
5).检测到HTTP端口后,继续使用curl查验在该端口上侦听的服务是否就是Kubernetes API。顺利的话,你应该可以访问到Kube API。
6).通过API查询/api/v1/namespaces/default/pods
来检索default
Namespace 下Pod的配置,并获取密钥,比如redis Pod的SECRET_PASSWORD值
如何拒绝攻击 ?
Solution: 从Kubernetes API服务器的配置文件中禁用 暴露端口的选项。
首先,登录到 K8s Control plane 节点,
接着, 查看 /etc/kubernetes/manifests/kube-apiserver.yaml
配置文件 , 找到定义暴露端口和绑定地址的选项,将它们从配置文件中删除
等待 KUBE APISERVER 重新加载配置后, 重复 之前的获取POD Secret 的攻击方式,看看这次会发生什么?
总结
通过这个案例, 我们了解到攻击者利用集群中的错误配置可以很容易地窃取集群中其他pod的密钥、配置等一些敏感信息,进而可能发起一系列更加危险的攻击行为。因此,在线上生产环境中, 作为安全人员,我们需要很注意Kube ApiServer 的配置,是否有暴露出不安全的端口 以导致了集群内信息被窃取或者泄露等安全事件。
=================
原文关注微信公众号: "云原生SRE"