今天在漏洞扫描的时候蹦出来一个zookeeper的漏洞问题,即使是非zookeeper的节点,或者是非集群内部节点,也可以通过nc扫描2181端口,获取极多的zk信息。关于漏洞的详细描述参考apache zookeeper官方概述:CVE-2018-8012: Apache ZooKeeper Quorum Peer mutual authentication
漏洞演示:
这是一个CDP集群,里面有三个物理节点,每个节点各自有一个zk实例,注意看IP。
另开一台非集群节点的连接,使用echo conf | nc 10.168.1.28 2181
命令:
可以看到非常多的配置和集群信息,除了conf,还有ruok、stat等命令:
如此多敏感信息暴露在互联网上肯定是很不安全的,解决方式主要有四种:修改默认端口(简单易实现)、配置zookeeper认证用户或修改权限、打补丁(不推荐)、开启防火墙。
1.修改默认端口 :把client的2181修改为其他的端口即可,不过如果是范围扫描,还是会被发现
2.修改认证:这种方法比较折衷,不过我看的方法都是使用setAcl path
,最开始我也是使用这种方法,我们一步一步看一下:
首先:使用有zk实例的节点,使用./zkCli.sh -server:ip
进入server,查看权限:
world anyone是最广的权限,相当于Java的public,谁都能访问;cdrwa是具体的权限,相当于Linux的rwx
然后:使用setAcl -R / ip:Acl ,给集群ip开白名单
setAcl -R / ip:10.168.1.28:cdrwa,ip:10.168.1.29:cdrwa,ip:10.168.1.30:cdrwa
再查看权限:
似乎没问题了?再用集群外的节点监听一下:
好家伙,看的更仔细了???
我搞了半天,百思不得其解,探索了两个小时,然后试探性了查看单个路径的节点:
然后检查了一会儿,除了两个zk目录下面的文件,其他文件都是没问题了,然后到官网和GitHub,发现这个是一个bug…zk服务端启动后,默认会启动这几个具有world和cdrwa权限的znode,“/” “/zookeeper” “/zookeeper/config"和”/zookeeper/quota"(根据zookeeper的版本不同可能存在不同,并且这几个节点虽然具有world和cdrwa权限,但是是无法删除的。GitHub还出了个补丁…
GitHub issue
除了这种针对匿名用户的,也有使用用户做认证的,不过我还在尝试中。
3.打补丁:不知道上面那个链接的补丁有没有效果,我是用的第四种,开启防火墙策略。
4.开启防火墙:这是比较保守的方法,需要设置繁多的策略,开放端口…允许IP,但是是最有效的,个人比较推荐。