数千个不安全的 Kubernetes 集群暴露在互联网上

最近在研究确定互联网上暴露的 Kubernetes 集群的安全态势,在研究过程中发现了超过 500,000 个不安全的 Kubernetes 实例。

3f6b88b98c03b1604c0404346392da0a.png

介绍

近些年,容器和微服务已成为应用程序开发趋势。管理此类基础设施是生产环境中的一项巨大挑战。Kubernetes(或 k8s)除了是一个描述“指挥官”的希腊词外,还是一个非常流行的容器编排平台。模块化设计使其具有出色的灵活性和可扩展性,几乎所有组件都可以单独调整以满足特定目标。然而,从安全角度来看,这种复杂性确实具有挑战性。

因此,RedHunt Labs 研究团队决定在互联网范围内进行研究,以探索和分析网络上不安全的 Kubernetes 集群。这篇博文描述了我们评估分散在互联网上的 Kubernetes 集群安全状况,详细介绍了我们的研究方法、发现和分析。

映射攻击面

工作架构

首先,让我们快速了解一下 Kubernetes 的工作架构。

49128f34d031219005e4089b194dbc31.png
Kubernetes 核心架构

Kubernetes集群由一组工作机器组成,称为运行容器化应用程序的节点。Pod是 Kubernetes 中的最小单元,承载一个或多个容器。控制平面/主节点管理集群中的工作节点和 Pod。

控制平面包括以下组件:

  • Kube APIServer:Kubernetes 的前端,它从客户端接收 RESTful 请求并将请求转换为容器、Pod 或节点上的操作。

  • etcd:一个键值数据库,用作所有集群数据的操作存储。

  • Kube Scheduler:新创建的 pod 的观察者。

  • Kube 控制器管理器:运行控制器。

每个节点上的一些组件维护正在运行的 pod 并为其提供运行时环境:

  • Kubelet:确保容器正常运行。

  • Kube Proxy:维护节点上的网络规则。

  • 容器运行时:运行在容器上的软件(例如 Docker)。

默认端口

Kubernetes 集群通常会监听一系列定义明确且独特的端口。以下是 Kubernetes 中使用的默认端口的概述,从安全角度来看这些可能会带来风险:

735abd86c4340528749a9114e87c89ae.png

此外,我们发现以下端口也很重要:

991932061777bf66b3ef7469031c6fe5.png

我们的方法论

最初的想法是涵盖 Kubernetes 实例的基本组件。然而,在我们的研究过程中,攻击面逐渐扩大。我们还在 Go 中创建了一个名为 KubeStalk 的扫描器,在考虑速度和准确性以覆盖整个 IPv4 空间的同时尊重我们的排除列表。我们选择尽可能保持扫描过程的非侵入性,这样就不会因为我们的研究而中断整个集群服务。

下面的流程图描述了该工具的架构概览:

a5a4873cdec68213cece507e404c6e7b.png

上述描述了扫描过程架构概览的流程图,扫描时间线跨越 59 小时,分布在互联网上的许多节点上。

我们的发现

我们将我们的发现分为两个主要部分。第一部分涵盖了 Kubernetes 的核心组件,第二部分涵盖了上面讨论的其他攻击面。

核心组件

在将近 3 天的时间跨度内,我们的扫描器发现了574,913 个错误配置的面向互联网的 Kubernetes 核心组件。其中,338,320 个是 Kube APIServer,232,103 个是 Kubelet API。etcd 对剩余的 4,490 个实例做出了贡献。

从地理上看,暴露最多的是美国,其次是德国、比利时、爱尔兰和新加坡。仅美国就占总风险的近 57%。

云提供商:

我们注意到大约 61% 的曝光托管在公共云中,其中谷歌云平台 (GCP) 的曝光次数最多,其次是亚马逊网络服务 (AWS)、腾讯云、微软 Azure 和 DigitalOcean Cloud。

受影响最大的版本——v1.21 和 v1.22

在分析结果时,我们发现 v1.21 和 v1.22 版本是不安全的 Kubernetes 集群中最常见的版本,占了一半以上的部署。这也说明 60% 的 Kubernetes 集群已经超过一年没有更新了。v1.21 于 2021 年 4 月发布,而 v1.22 于 2021 年 8 月发布。在撰写本文时,当前最新版本为 v1.25,占现有集群的比例不到 1%,总共只有 1,211 个实例。

通过进一步分析和统计,我们将来自官方 CVE 提要的 CVE 映射到公开集群上的版本。统计数据揭示了这样一个事实,即仍未进行适当的修补,并且大量部署仍面临大量已知漏洞的风险。这一观察结果也凸显了一个事实,即减少攻击面还有很长的路要走。

额外的攻击面——Kubernetes 管理组件

暴露了与 Kubernetes 相关的内容

除了常规的默认组件外,我们还发现开发人员使用其他软件来管理他们的 Kubernetes 基础设施,如果配置错误,这也会带来重大的安全风险。以下部分重点介绍我们在研究过程中发现的那些有风险的软件组件。下面的信息图描述了整体风险。

0c99d4fcaf65eb51ae8394caecd2280e.png
cAdvisor

cAdvisor是一种容器度量引擎,可为开发人员提供其资源使用情况和容器性能的概览。该软件公开了一个用于查看资源指标的 Web UI。它包括系统进程、CPU、内存、网络和文件系统使用统计信息。

7ceacda948661fbba4a4861d14e0078c.png

我们发现总共暴露了23,101 个未经身份验证的 cAdvisor 仪表板。

Kubernetes 操作视图

kube-ops-view是一个系统仪表板,它提供了多个已部署的 K8s 集群的概览。将鼠标悬停在 pod 上会提供有关它的其他信息,包括容器、部署区域等。

我们的工具 KubeStalk 发现了929 个暴露在互联网上的此类配置错误的门户实例。

Kubernetes 资源报告

kube-resource-report是另一个用于查看和下载集群和 pod 的资源请求与使用情况报告的仪表板。错误配置的门户提供了有关在该实例上运行的集群、节点、pod、应用程序、命名空间等的非常详细的信息。

在我们的扫描过程中,总共发现了 31 个此类仪表板实例。

Kubernetes 网络视图

kube-web-view是前端软件,旨在为开发人员提供 Kubernetes 实例(包括 CRD)的极其详细的概述。信息公开包括所有部署、作业、DaemonSet、pod、服务等的详细概述。考虑到通过仪表板公开的信息量,该软件的错误配置部署可能是灾难性的。

我们总共发现了11 个 IP,这些 IP 将未经身份验证的产品暴露在互联网上。

etcd查看器

etcd-viewer是一个允许用户导航和修改 etcd 分布式键值存储的门户界面。可公开访问的仪表板允许未经身份验证的用户直接查看和编辑etcd 存储数据库中的值。该软件的错误配置很容易导致整个集群的破坏。

我们的扫描仪发现了8 个 IP,暴露了该产品直接面向互联网,未经身份验证且任何人都可以公开访问。

发现受感染的集群

在验证结果的过程中,我们注意到有几个暴露的集群已经被攻破。

许多集群都在运行有意易受攻击的镜像,这些镜像被滥用于容器突破和访问主机。我们还发现了在受感染集群内部署恶意加密挖矿软件。许多受感染的实例在这些受感染的集群上都有已知的Hildegard 恶意软件的痕迹和 IoC 。

在受感染集群的一个实例上发现了以下归因于 TeamTNT(一个以前因 Kubernetes 妥协而闻名的臭名昭著的组织)的脚本。它在 VirusTotal 上的检测率为零。

该脚本最初使用 masscan 通过扫描开放端口来跨 IP 范围发现不安全的 Kubernetes 集群。然后它利用 zgrab 来探测为该路径提供服务的 HTTP 服务/v1.16/version。一旦发现不安全的集群,该脚本就会使用 Docker CLI 部署一个有意特权的容器。

Docker 容器通常在资源方面是有限的,但是--privilegedflag 赋予了容器所有的能力,解除了cgroups. 这基本上意味着容器具有宿主所具有的所有功能,并且可以访问普通容器不具有的所有系统资源。

执行链跟随下载其他组件、脚本和加密矿工,以充分利用系统资源。但是,我们无法估计受损实例的数量,因为这超出了本文研究的范围。

攻击者的视角

在本节中,我们将了解攻击者如何轻易地破坏不安全的 Kubernetes 集群。可以通过不安全的 API 服务器或 Kubelet 在正在运行的容器中获得代码执行 (RCE)。execAPI 和API都run允许在容器中运行任意命令。

一旦发现允许匿名访问其 API 的不安全集群,在被劫持的容器中启动恶意进程就更加隐蔽,因为它不需要拉取新镜像或运行新容器。

对于我们的案例,假设在端口 10250 上运行的 Kubelet 的 API 允许匿名访问。第一步是发现节点内运行的 pod。可以通过访问端点来检索容器内的 pod 列表/pods。

curl -sk 'https://<ip>:10250/pods' | jq -r '.items[] | "Pod: \(.metadata.name)\tNamespace: \(.metadata.namespace)\tContainer: \(.spec.containers[].name)"'

端点的输出为/pods我们提供了 pod 及其属性的列表,包括它们的命名空间和它们所属的容器。此信息足以通过 run 或 exec API 实现代码执行。

curl -sk -X POST 'https://<ip>:10250/run/<namespace>/<pod>/<container>' -d "cmd=id"

在我们的例子中,如果我们要在 Nginx 容器内的默认命名空间中定位 pod nginx-6c54bd5869-pfxmw,则此命令将采用以下形式:

curl -sk -X POST 'https://<ip>:10250/run/default/nginx-6c54bd5869-pfxmw/nginx' -d "cmd=id"

只用了两步就实现了代码执行。从这里开始,攻击者可以访问servicetoken获取运行时密钥,部署一个有意易受攻击的容器并通过突破它来提升特权,进一步在 pod 和容器之间横向移动并获得持久性。这篇博文https://www.cyberark.com/resources/threat-research-blog/attacking-kubernetes-clusters-through-your-network-plumbing-part-1详细介绍了初始访问后更详细的攻击路径。Peirates等工具有助于在初始访问后通过集群进行后期开发和横向移动。

开源工具发布

我们坚信回馈安全社区。因此,我们发布了与这一波一起使用的工具的社区版本。该工具将主机列表作为输入并生成 CSV 格式的输出文件。您可以从我们的 GitHub ( https://github.com/redhuntlabs/kubestalk )获取该工具并阅读更多相关信息。下面添加了一个 GIF 来演示该工具的功能和工作方式。

309ac174941f3c629ff6057e4f672f43.png

预防和缓解

在记录如何在互联网上保护 Kubernetes 集群方面付出了巨大的努力。Kubernetes 文档非常清楚地提到了安全性需要考虑的问题。CISA 和 NSA 已经发布了一份可靠的强化指南。OWASP Cheatseries 项目也有Kubernetes 安全性的权威指南。

简而言之,以下是确保集群安全的方法:

  • 授权审计:强制执行 RBAC 并定期审计云角色 (IAM)。

  • 网络控制审计:审查网络策略和服务网格。启用 mTLS。

  • 包含工作负载:利用 pod 安全策略和 OPA/Gatekeeper。

  • 应用常规强化:遵循 CIS 基准。

  • 集群升级:稳定版本发布后立即升级(注意 EOL)。

  • 镜像安全:定期扫描镜像以查找已知漏洞。

kubescape、kube-bench 和 kube-hunter 等开源工具使审计 Kubernetes 实例的过程变得简单。

影响

拥有不安全的 Kubernetes 集群的影响可能是毁灭性的。生产环境如果受到损害,可能会导致巨大的业务中断,从而导致财务损失和客户不信任。

结论

该研究为互联网上不安全的 Kubernetes 集群的安全态势提供了大量线索。很明显,像 Kubernetes 这样的复杂系统的安全概念仍然是半透明的。APT 组织已经走在了前面,破坏了这些不安全的实例,并利用它们为自己谋取利益。在构建应用程序时,需要让开发人员了解安全第一的开发。作为安全研究人员,我们继续努力通过Project Resonance的研发计划提高组织对此类潜在威胁的认识。

ebf971463e16c709001bfcee34f595c2.png

推荐

A Big Picture of Kubernetes

Kubernetes入门培训(内含PPT)


随手关注或者”在看“,诚挚感谢!

1. 数据来源依据可以是系统监控工具、性能测试工具等。 2. 数据库索引类型包括B-Tree索引、哈希索引、全文索引等。 3. group by在sql语句中的作用是将查询结果按照指定的列进行分组统计。 4. MHA是一个MySQL高可用性解决方案,实现了MySQL的自动故障转移、主从切换等功能。 5. Redis的版本选择应根据需求而定,一般生产环境使用较为稳定的LTS版本。 6. Rediscluster集群一般采用6个节点的三主三从架构,每个节点存储一份数据。 7. 磁盘IO是指磁盘进行读写操作的速率。 8. K8S生产中应选择稳定、兼容性好的版本进行部署。 9. Deployment用于管理Pod的副本数和更新策略,DaemonSet用于保证每个节点都有一个Pod在运行。 10. Service用于将一组Pod暴露为一个网络服务,提供负载均衡、服务发现等功能。 11. NodePort将Service暴露在每个节点上的指定端口,ClusterIP将Service暴露集群内部的虚拟IP上。 12. Service通过标签选择器匹配对应的Pod,并将请求转发到对应的Pod上。 13. kube_proxy有iptables模式和IPVS模式,iptables模式使用iptables实现请求转发,IPVS模式使用Linux内核的IPVS实现请求转发。 14. calico和flannel都是Kubernetes网络插件,calico支持多种网络协议,flannel使用VXLAN封装网络包。 15. iptables是Linux内核的防火墙,IPVS是一种高性能的负载均衡技术。 16. Zabbix可以通过Zabbix agent监控容器状态,也可以通过API接口获取容器状态信息。 17. Ansible可以维护数千台服务器,具体数量取决于硬件配置和网络环境。 18. Ansible模块自带的事实功能可以获取主机名、IP地址、操作系统信息等。 19. 举例一个playbook可以是用于部署web应用的playbook,通过安装依赖、下载代码、编译打包等步骤实现部署,功能是将应用发布到生产环境。 20. 调研某个应用可以通过查阅官方文档、参考开源社区的资料、进行实际测试等方式开展工作。 21. 如果客户应用系统打开,但是在后台能打开,可以检查网络连接、端口占用情况、防火墙设置等。 22. 如果客户应用打开比较慢,可以检查网络延迟、系统负载、应用配置等。 23. 数据库缓存优化可以使用Redis等缓存技术。 24. 提高数据库读写效率可以使用索引、分区、缓存等技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值