Kubernetes 安全系列之 API Server 端口暴露

Kubernetes 安全系列之 API Server 端口暴露

案例

一个DevOps同事发现集群中的任何容器都可以无限制地查询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”

猜你喜欢

转载自blog.csdn.net/dongshi_89757/article/details/123413915