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