以 Kubernetes 为例,容器与容器之间的网络是极为特殊的。虽然大部分经典 IDC 内网的手法和技巧依然可以使用,但是容器技术所构建起来的是全新的内网环境,特别是当企业引入服务网格等云原生技术做服务治理时,整个内网和 IDC 内网的差别就非常大了;因此了解一下 Kubernetes 网络的默认设计是非常重要的,为了避免引入复杂的 Kubernetes 网络知识,我们以攻击者的视角来简述放在蓝军面前的 Kubernetes 网络。

图片

从上图可以很直观的看出,当我们获取 Kubernetes 集群内某个容器的 shell,默认情况下我们可以访问以下几个内网里的目标:

  1. 相同节点下的其它容器开放的端口

  2. 其他节点下的其它容器开放的端口

  3. 其它节点宿主机开放的端口

  4. 当前节点宿主机开放的端口

  5. Kubernetes Service 虚拟出来的服务端口

  6. 内网其它服务及端口,主要目标可以设定为 APISERVER、ETCD、Kubelet 等

不考虑对抗和安装门槛的话,使用 masscan 和 nmap 等工具在未实行服务网格的容器网络内进行服务发现和端口探测和在传统的 IDC 网络里区别不大;当然,因为 Kubernetes Service 虚拟出来的服务端口默认是不会像容器网络一样有一个虚拟的 veth 网络接口的,所以即使 Kubernetes Service 可以用 IP:PORT 的形式访问到,但是是没办法以 ICMP 协议做 Service 的 IP 发现(Kubernetes Service 的 IP 探测意义也不大)。

另如果 HIDS、NIDS 在解析扫描请求时,没有针对 Kubernetes 的 IPIP Tunnle 做进一步的解析,可能产生一定的漏报。

注:若 Kubernetes 集群使用了服务网格,其中最常见的就是 istio,此时服务网格下的内网和内网探测手法变化是比较大的。可以参考引用中:《腾讯蓝军: CIS2020 - Attack in a Service Mesh》;由于 ISTIO 大家接触较少,此处不再展开。

也因此多租户集群下的默认网络配置是我们需要重点关注的,云产品和开源产品使用容器做多租户集群下的隔离和资源限制的实现并不少见,著名的产品有如 Azure Serverless、Kubeless 等。

若在设计多租户集群下提供给用户代码执行权限即容器权限的产品时,还直接使用 Kubernetes 默认的网络设计是不合理的且非常危险。

很明显一点是,用户创建的容器可以直接访问内网和 Kubernetes 网络。在这个场景里,合理的网络设计应该和云服务器 VPS 的网络设计一致,用户与用户之间的内网网络不应该互相连通,用户网络和企业内网也应该进行一定程度的隔离,上图中所有对内的流量路径都应该被切断。把所有用户 POD 都放置在一个 Kubernetes namespace 下就更不应该了。

最后编辑: kuteng  文档更新时间: 2022-06-01 16:15   作者:kuteng