Zookeeper的未授权访问漏洞解决

这里用的是用户名密码的方式,需用别的方式请参考下面地址
附大佬链接:(有三种解决方法)https://www.cnblogs.com/ilovena/p/9484522.html
首先介绍下znode的5种操作权限:

CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写)

注:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限

身份的认证有4种方式:

world:默认方式,相当于全世界都能访问

auth:代表已经认证通过的用户(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)

digest:即用户名:密码这种方式认证,这也是业务系统中最常用的

ip:使用Ip地址认证

本文以digest认证方式展开说明。我们在zk的客户端可以进行节点权限的查看和设置。

[root@master ~]# /usr/local/zookeeper-3.4.14/bin/zkCli.sh -server 192.168.35.6:2181     #登录到zookeeper
WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: 192.168.35.6:2181(CONNECTED) 0] 
[zk: 192.168.35.6:2181(CONNECTED) 0] create /zmc data        
Created /zmc
[zk: 192.168.35.6:2181(CONNECTED) 1] getAcl /zmc
'world,'anyone
: cdrwa
[zk: 192.168.35.6:2181(CONNECTED) 2] addauth digest user:password          #创建用户名和密码
[zk: 192.168.35.6:2181(CONNECTED) 3] setAcl /zmc auth:user:password:cdrwa  #给创建的目录授权用户名和密码
cZxid = 0x500000102
ctime = Wed Jun 10 18:04:18 CST 2020
mZxid = 0x500000102
mtime = Wed Jun 10 18:04:18 CST 2020
pZxid = 0x500000102
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
[zk: 192.168.35.6:2181(CONNECTED) 4] getAcl /zmc           
'digest,'user:tpUq/4Pn5A64fVZyQ0gOJ8ZWqkY=
: cdrwa

[zk: 192.168.35.6:2181(CONNECTED) 5] ls /zmc
[]
[zk: 192.168.35.6:2181(CONNECTED) 6] 

从上述操作可以看出,zk新创建的znode默认访问方式为world。我们通过addauth和setAcl给/test节点设置访问权限为digest,操作权限为cdrwa,用户名为user,密码为password。

当然,我们使用getAcl是无法获取可访问用户test的明文密码的(要是可以获取明文密码,不又是个漏洞嘛~~)。

另启zk客户端,执行ls /test,发现当前用户已经无法访问/test节点,提示信息为“Authentication is not valid”。解决方法就是addauth添加认证用户了,并且必须使用用户名和密码明文进行认证。

#登录到另一个zookeeper
[root@slave1 ~]# /usr/local/zookeeper-3.4.14/bin/zkCli.sh -server 192.168.35.6:2181
WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: 192.168.35.6:2181(CONNECTED) 0] ls /zmc        #没有授权,查看失败
Authentication is not valid : /zmc
[zk: 192.168.35.6:2181(CONNECTED) 1] addauth digest user:password      #授权成功
[zk: 192.168.35.6:2181(CONNECTED) 2] ls /zmc                           #查看成功
[]

[zk: 192.168.35.6:2181(CONNECTED) 3] getAcl /zmc
'digest,'user:tpUq/4Pn5A64fVZyQ0gOJ8ZWqkY=
: cdrwa
其他zookeeper集群也一样
[root@slave1 ~]# /usr/local/zookeeper-3.4.14/bin/zkCli.sh -server 192.168.35.7:2181
WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: 192.168.35.7:2181(CONNECTED) 0] ls /zmc         #没有授权,查看失败
Authentication is not valid : /zmc
[zk: 192.168.35.7:2181(CONNECTED) 1] addauth digest user:password      #授权成功
[zk: 192.168.35.7:2181(CONNECTED) 2] ls /zmc                           #查看成功
[]

[zk: 192.168.35.7:2181(CONNECTED) 3] getAcl /zmc
'digest,'user:tpUq/4Pn5A64fVZyQ0gOJ8ZWqkY=
: cdrwa

    注意:给/路径加授权,并没有给/路径底下的目录加授权,此时直接访问/路径底下的目录是可以直接查看成功的,例如现在zookeerper有/demo1,/demo2两个路径,给setAcl / auth:user:password:cdrwa,之后通过zk客户端连接zk,没授权的话不可以ls /路径,但是可以直接访问/demo1,/demo2,如果需要对/demo1加认证需要setAcl /demo1 auth:user:password:cdrwa。

去除授权的话  直接 setAcl 路径 world:anyone:cdrwa

参考:https://blog.csdn.net/weixin_45858439/article/details/106680860

posted @ 2020-08-14 08:38  人艰不拆_zmc  阅读(3364)  评论(0编辑  收藏  举报