Zookeeper未授权访问漏洞解决

内容纲要

缘起

某现网项目扫描到Zookeeper未授权漏洞,这个漏洞之前在另外一个项目也出现过,不过解决是另外一个技术解决的,我只是听了一句,这次轮到我解决了。

解决

扫描方给出的解决方案就是通过setAcl指令解决这个问题,考虑到最好是不修改原有程序来解决,因此开始看Zookeeper怎么修改最小的方式来进行权限设置。

Acl指令格式为:

<schema>:<id>:<acl>

schema可取值为:

  • world 默认方式,相当于全世界都能访问
  • auth 代表已经认证通过的用户(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)
  • digest 即用户名:密码这种方式认证,这也是业务系统中最常用的
  • host/ip 使用Ip地址认证

id: 标识身份,值依赖于schema做解析。
acl:就是权限:cdwra分别表示create, delete,write,read,admin

考虑到程序结构的单一性和非侵入性,因此我们直接使用IP来控制访问权限

使用zkCli访问zk之后,执行如下命令:

setAcl / ip:xxx.xxx.xxx.xxx:cdrwa,ip:xxx.xxx.xxx.xxx:cdrwa……

多个IP之间使用英文逗号分隔

注意 这里有个坑,也就是因为ZK的Acl命令只对单个节点生效,同时没有继承性,因此上面的指令只是对根目录进行了权限设置,如果需要通过扫描,还需要对/zookeeper /zookeeper/quota进行权限设置,当然最安全的情况是对所有的节点进行权限设置,但是那样就涉及到对代码的侵入了。

到此解决安全漏洞扫描问题。

扩展

想要整体比较安全,那就需要设置用户名密码方式访问:

setAcl /path digest:用户名:密码密文:权限

注:这里的加密规则是SHA1加密,然后base64编码。

同时在程序和配置文件中设置Dubbo的密码校验功能