zookeeper未授权漏洞复现及处理

一、漏洞详情

Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

Zookeeper的默认开放端口是2181。Zookeeper 安装部署之后默认情况下不需要任何身份验证,造成攻击者可以远程利用 Zookeeper,通过服务器收集敏感信息或者在 Zookeeper 集群内进行破坏(比如:kill命令)。攻击者能够执行所有只允许由管理员运行的命令。

二、使用Java解决zk的未授权访问漏洞

还是以digest为例:

//给密码加密

public String getDigestUserPswd(String idPassword) throws NoSuchAlgorithmException {

return DigestAuthenticationProvider.generateDigest(idPassword);

}

//获取ACL列表,这里只设置一个可访问用户,用户名为user,密码为pswd。如果你需要多个,继续add即可。

public List<ACL> getAclList() {

String idPassword = "user:pswd";

if (idPassword == null) {

logger.warn("no digest config,so use world scheme");

return ZooDefs.Ids.OPEN_ACL_UNSAFE;

}

List<ACL> aclList = new ArrayList<>();

try {

Id zkUser = new Id("digest", getDigestUserPswd(idPassword));

ACL acl = new ACL(ZooDefs.Perms.ALL, zkUser);

aclList.add(acl);

} catch (NoSuchAlgorithmException e) {

logger.error(e);

}

return aclList;

}

//给znode设置权限,只有aclList的用户可以访问

public void addDigestScheme(){

zk.setACL(znode, aclList, -1);

}

//创建znode的时候设置ACL

zk.create(znode,data,aclList,...)

//如何访问加密的znode

public void client(){

ZooKeeper zk = new ZooKeeper(xxx)

zk.addAuthInfo("digest","user:pswd".getBytes())

//然后zk就可以访问加密znode了

}

上面的代码仅说明了核心步骤。

我在这里遇到个大坑,就是idpasswod为空的情况,之前直接给返回空了,feature正常启动,但是服务没有成功的发布出去。重要的是构建环境把我在配置文件配置的user信息给删掉了(我不知道)才开始跑的,更坑的是它运行完后直接清除日志了,哪里错了都看不到。

最后哼哧哼哧的啃代码,终于定位到位置。

血泪教训:空指针情况需要正确处理,别TMD的随便返回空,运行没问题不代表功能没问题。

到这里,我们在create节点的时候可以为所有的znode设置访问权限,理论上可以保护我们的数据安全了。

漏洞扫描验证

上面我们在创建znode的时候进行了加密,这样总可以通过漏洞扫描了吧。

重点来了。

但是如果你使用漏洞扫描工具扫描的话,还是有未授权访问漏洞的,为啥呢?

不知道你有没有注意,zk服务端启动后,默认会启动这几个具有world和cdrwa权限的znode,"/" "/zookeeper" "/zookeeper/config"和"/zookeeper/quota"(根据zookeeper的版本不同可能存在不同,并且这几个节点虽然具有world和cdrwa权限,但是是无法删除的,不知道为什么,好在我们可以给它设置ACL列表。另外,官网对着几个节点也没有特别说明,估计和zk本身的一些配置相关吧,不删除最好)。就是这几个znode,会导致你的产品无法通过安全工具的漏洞扫描,你说坑不坑,解决办法也是很简单的,用我们前面说过的zk.setACL为这几个节点设置权限就OK了,千万别忘记根节点"/"了。

好了,到这里,才是真正的解决了这个未授权访问漏洞问题了。

还可以禁用2181端口试试。

相关推荐
RodrickOMG1 小时前
【大数据】Hadoop三节点集群搭建
大数据·hadoop·分布式
乄北城以北乀2 小时前
第1章 R语言中的并行处理入门
开发语言·分布式·r语言
颜淡慕潇2 小时前
【K8S问题系列 | 20 】K8S如何删除异常对象(Pod、Namespace、PV、PVC)
后端·云原生·容器·kubernetes
didiplus4 小时前
Kubernetes 镜像拉取策略全解析:如何根据需求选择最佳配置?
云原生·容器·kubernetes
上海运维Q先生6 小时前
面试题整理17----K8s中request和limit资源限制是如何实现的
服务器·云原生·kubernetes
天乐敲代码7 小时前
Etcd静态分布式集群搭建
数据库·分布式·etcd
会飞的土拨鼠呀8 小时前
Flannel是什么,如何安装Flannel
运维·云原生·kubernetes
光纤传感技术研究8 小时前
分布式光纤传感|分布式光纤测温|线型光纤感温火灾探测器DTS|DTS|DAS|BOTDA的行业16年的总结【2024年】
分布式·dts·光纤传感器·botda·光纤传感技术
dbcat官方8 小时前
1.微服务灰度发布(方案设计)
java·数据库·分布式·微服务·中间件·架构
明达技术10 小时前
分布式 IO 模块助力冲压机械臂产线实现智能控制
分布式