安全文章

攻防演练中容器集群的安全防护

2020-08-03 北京小佑科技有限公司

在业界,我们常说“未知攻,焉知防”。攻防永不止。在这个过程中,新的安全机制不断被设计并应用,新的攻击方法也不断被提出,对前者发起挑战。作为博弈的两端,攻击者和防御者都必须尽可能早、尽可能深地了解对方的可能手段,进而抢前动作、布局。

如今,随着容器技术的广泛使用,容器集群管理平台也应运而生。这些新的技术,带来了新的攻击面,因此越来越多的攻防博弈开始转到容器化的云端环境上。

例如,2018年黑客入侵了特斯拉在亚马逊上的Kubernetes容器集群。该集群存在未授权访问漏洞,黑客轻而易举的Kubernetes控制台权限;在一个Kubernetes pod中,黑客找到了能够访问特斯拉Amazon S3(简单存储服务)的访问凭证。利用该凭证可获取到Amazon S3 存储桶里面的敏感数据。导致数据泄露。此外黑客还使用CloudFlare(CDN)隐藏背后矿池服务器的真实IP地址,在特斯拉Kubernetes容器中进行挖矿。

本文主要探索了docker容器和几大集群管理平台的一些安全漏洞,这些容器和容器集群管理平台所存在的安全风险,也给攻防演练带来了极大的挑战。这里只是抛砖引玉,期待大家批评指正,与大家一起探讨、研究。

1.Docker与swarm

 

1.1.未授权访问

 

1.1.1.漏洞起因

为了实现集群管理,Docker Daemon作为守护进程,运行在后台,可以执行发送到管理接口上的Docker命令。启动Docker Daemon时,加入-H 0.0.0.0:2375,Docker Daemon就可以接收远端的Docker Client发送的指令。而此时docker rest api(默认端口2375)认证的缺陷,把2375端口作为非加密端口暴露出来,没有任何加密和认证过程,只要知道Docker主机的IP,任何人都可以匹配到这个端口,进而触发安全漏洞。若Docker存在未授权访问漏洞,访问http://host:2375/containers/json时,会返回服务器当前运行的container列表,和在docker CLI上执行docker ps的效果一样,其他操作比如创建/删除container,拉取image等操作也都可以通过API调用完成

 

1.1.2.漏洞影响

docker -H IP:2375 指令

举例:docker -H ip:2375 ps -a

图片1.png

看到上面的信息后,我们就知道,可以管理该主机上的docker 容器了,启动、停止、创建、下载镜像、删除上容器,宿主机提权。

也可以直接调用docker remote api获取容器列表

例子:http://IP:2375/containers/json

图片2.png

1.1.3.漏洞修复

1. 建议在使用Docker时将2375端口监听在内网IP地址,避免直接暴露在互联网中。

2. 公网中使用TLS的docker remote api(使用2376端口)。

3. 修改Docker Remote API服务的默认启动参数,即修改默认启动端口为自定义端口,

避开2375端口:定位到DOCKER_OPTS中的 tcp://0.0.0.0:2375,将0.0.0.0修改为127.0.0.1(即只允许本地主机访问)或将默认端口 2375 改为自定义端口。

4. 务必对接口地址进行鉴权,如白名单访问机制,可通过防火墙设置仅允许指定的ip来访问docker接口。  

参考连接:https://docs.docker.com/engine/security/https/

2.Shipyard和Portainer

2.1.弱口令

 

2.1.1.漏洞起因

Shipyard 是一个基于 Web 的 Docker 管理工具,支持多 host,可以把多个 Docker host 上的 containers统一管理;可以查看 images,甚至 build images;并提供 RESTful API 等等。Shipyard 要管理和控制Docker host 的话需要先修改 Docker host 上的默认配置使其支持远程管理。

 

Portainer是Docker的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。

 

Shipyard的默认登录http://

 

Portainer的默认登录地址:http://

 

以上docker管理工具的若使用默认密码或密码过于简单,可被黑客破解利用。

 

2.1.2.漏洞影响

以上docker管理工具的若使用默认密码或密码过于简单,可被黑客破解利用。

使用弱口令暴力登录web管理界面。例如

图片3.png

使用默认密码和账号登录:默认用户名: admin,默认密码: tryportainer。

图片4.png

2.1.3.漏洞修复

1.使用复杂密码,并定期更换密码

2.配置防火墙,禁止敏感端口对外开放

3.使用安全的镜像(私有镜像仓库

 

3.kubernetes

3.1.未授权访问

Kubernetes 的服务在正常启动后会开启两个端口:8080,6443。两个端口都是提供 Api Server 服务的,一个可以直接通过 Web 访问,另一个可以通过 kubectl 客户端进行调用。如果没有合理的配置验证和权限,那么攻击者就可以通过这两个接口去获取容器的权限,甚至通过创建自定义的容器去获取宿主机的权限。

 

3.1.2.漏洞影响

1.确定8080端口开放,浏览器访问http://IP:8080/

图片5.png

 

1.通过kubectl -s ip:8080 get pods,获取所有节点,访问kubectl -s http://IP:8080/ get pods --all-namespaces=true, 获取所有容器。

2.直接连接这个容器获取 Shell:kubectl -s ip:port  --namespace=default exec -it dockername bash。

3.控制容器之后,如果宿主机本身的内核有问题的话,可以利用脏牛漏洞进行提权,获取宿主机的权限。

4.我们也可以通过他的另外的接口,通过 kubectl 客户端进行任务的提交:kubectl -s  ip:port create -f yourfile。

5.提交成功后,我们用之前命令获取容器的 bash,然后向容器的 /mnt/etc/crontab 写入反弹 shell 的定时任务,因为创建容器时把宿主机的根目录挂载到了容器的/mnt 目录下,所以可以直接影响到宿主机的crontab。

 

3.1.3.漏洞修复

在使用 kubernetes 的时候我们一定要进行身份的校验,K8S 的 APi 其实有非常严格的认证和授权,最简单的是在 Authentication 增加静态的 password,或者 token,可以的话关闭 Web 端口的服务,保持最小化原则,避免安全风险的产生。

 

4.kubelet

4.1.端口暴露

 

4.1.1.漏洞起因

kubelet会在kubernetes集群中的每一个节点上运行一个实例,对容器进行生命周期的管理。

kubelet开放的端口有:4194、10248、10250和10255。

kubelet的10255端口提供了pod和node的信息。如果对外开放,攻击者利用公开api可以获取敏感信息。

kubelet的10250端口是kubelet server 与 apiserver 通信的端口,定期请求 apiserver 获取自己所应当处理的任务,通过该端口可以访问获取node资源以及状态。如果kubelet的10250端口对外暴露,可能存在远程命令执行漏洞。

 

4.1.2.漏洞影响

1.利用kubelet API的HTTPS端口(10250),访问http://IP:10250/pods获取环境变量、运行的容器信息、命名空间等敏感信息。

图片6.png


2.用curl直接连接kublet的10250端口:

curl --insecure -v -H "X-Stream-Protocol-Version: v2.channel.k8s.io" -H "X-Stream-Protocol-Version: channel.k8s.io" -X POST "https://*.*.*.*:10250/exec/bianbaolei/slave3-xvpt7r-0s8gc/slave3-xvpt7r?command=touch&command=/tmp/onlyellow&input=1&output=1&tty=1"

3.从返回结果中得到websocket地址,用wscat可以直接连接。

4.到目标容器查看,发现onlyellow文件被创建。

5.直接在浏览器中访问:http://IP:10255/logs/ ,观察网页现象,暴漏敏感信息。

图片7.png


4.1.3.漏洞修复

 

1.禁止公网直接访问10250 和10255端口。

2.使用Kubernetes Secrets进行访问控制

3.启用RBAC,启用k8s服务时使用参数--authorization-mode:kube-apiserver --authorization-mode=Example,RBAC --other-options --more-options

4.尽快升级到社区漏洞修复版本。

5.使用防火墙限制敏感ip访问,设置白名单。

6.如业务有接口外用的需求,务必对该接口地址进行鉴权

参考连接:https://kubernetes.io/docs/concepts/configuration/secret/

参考连接:https://kubernetes.io/docs/reference/access-authn-authz/rbac/

 

5.Mesos

 

5.1.未授权访问

 

5.1.1.漏洞起因

Apache Mesos是一个分布式系统的管理软件,可对集群资源进行分配管理。

mesos的服务在正常启动后会自动开启5050端口。可以直接通过 Web 访问,如果未做任何访问权限验证,那么攻击者就可以通过这个接口去获取敏感信息。

 

5.1.2.漏洞影响

浏览器访问:http://IP:5050/master/state.json,返回信息如下:

图片8.png


5.1.3.漏洞修复

1.Mesos启动时候加上--authenticate --credentials参数,让Mesos slave 连接到Master的时候加上认证。

 

2.不要将mesos的5050端口暴漏在公网上,仅允许本地访问。

 

3.设置防火墙,仅允许有限的已知用户可以访问端口。

 

5.2.弱口令

 

5.2.1.漏洞起因

mesos的web管理界面,默认登录http://

 

5.2.2.漏洞影响

使用弱口令暴力登录web管理界面。

图片9.png


5.2.3.漏洞修复

1.Mesos 的 API 参考 HTTP Endpoints。可以找到有用的一项是 /flags,可以查看系统的配置情况,包括是否开启权限认证。

2.Mesos 从 1.2版开始才有了 exec 进入容器的功能,并且没有文档,只能通过安装 Mesos 来使用命令行,首先通过apt-get -y install mesos命令完成安装之后执行以下命令:mesos execute --master=1.2.3.4:5050 --name=test --command='curl127.0.0.1/`hostname`' 来设置只能本地主机访问容器。进而增强安全性。

 

6.Marathon

 

6.1.未授权访问

 

6.1.1.漏洞起因

Marathon是一个生产级别的容器(Docker)编排平台,用于中间层的数据中心操作系统(DC/OS)和Apache Mesos。Apache Mesos是一个分布式系统的管理软件,可对集群资源进行分配管理。Marathon算是一个基于Mesos的私有PaaS,它实现了Mesos的Framework,Marathon通过HAProxy实现服务发现和负载平衡,并为部署环境提供提供REST API服务、授权和SSL、配置约束等功能。Marathon web管理界面默认开启8080端口,由于未做权限验证,存在匿名访问漏洞。

 

6.1.2.漏洞影响

浏览器直接访问http://IP:8080/ui/#/apps,直接进入marathon的管理界面:

图片10.png


我们可以通过在 exploit-db 发现已有对 DC/OS Marathon UI 攻击程序用cmd来执行,无需构造有后门的镜像:

图片11.png


6.1.3.漏洞修复

1.Marathon启动的时候加上 --http_credentials, 增加权限验证并且开启TLS保护。

2.配置防火墙,禁止敏感端口对外开放

3.使用相对安全的镜像。(例如私有镜像库)

4.容器以非 root 用户运行

 

6.2.弱口令

 

6.2.1.漏洞起因

marathon的默认管理界面是:https://IP:8080/,由于未授权验证可被利用使用basic方式进行验证用户登陆。

 

6.2.2.漏洞影响

使用暴力工具破解用户名密码可以直接登录。

图片12.png

6.2.3.漏洞修复

1.请确保已设置iptables或具有阻止流量的防火墙,以使只有受信任的主机才能访问您的DC / OS主服务器,因为它们是敏感服务。

2.使用复杂密码,并定期更换密码。

3.使用TLS加密将其移至端口443,以免明文传递凭据文本到应用程序的这一部分。

4.将群集设置在其自己的隔离网络中,并且仅允许管理员IP空间访问端口80。

 

7.检测工具

 

为了能够快速检测容器集群中的端口暴露、未授权访问及弱口令等安全问题。我们开发了一款漏洞验证工具,可用于日常巡检与攻防演练自查整改。

 

该工具暂命名为kube_scanner,与kube-hunter不同,kube-hunter虽然插件众多,但只支持检测Kubernetes的安全风险,不支持其他类型的集群管理平台。kube_scanner短小精悍,容器化部署,且支持国产化平台,支持多种类型的集群管理平台。尤其适用于快速批量验证多集群安全问题。

 

使用示例:

docker run -it -v /opt:/opt/result/ kube_scanner:v1.2 -domain 10.11.11.11/24 -port 1000-65535 -o /opt/result/result.xlsx

图片13.png

为防止被滥用,若有想使用朋友请使用单位邮箱发送邮件到sec@dosec.cn获取该工具,邮件中请注明公司以及用途。

 

小佑科技自主研发的容器安全防护平台可以对容器的整个生命周期的各个阶段进行自动的安全控制,横向对容器的镜像文件、容器本身及容器内的应用进行安全的实时检测、防御;纵向对容器各阶段依赖的运行环境进行细粒度安全检测及控制。


北京小佑科技有限公司是国内最早从事容器安全产品研发的公司,公司团队来自于国内专业安全公司及一线互联网公司的安全以及云计算方面的专家,公司为2019年BCS创客汇全国十强,推出了国内第一款容器安全产品,第一款免费镜像扫描器,第一份容器安全最佳实践,开源镜像仓库Harbor的唯一个国内安全厂商合作伙伴,第一份容器安全标准参与制定的唯一安全厂商等。