在日常生产中最常用使用zookeeper作为dubbo注册中心使用,但是经常在使用过程中,由于安全扫描,出现zookeeper未授权访问漏洞,需要对zookeeper节点添加权限,但是dubbo至今没有增加zookeeper权限控制功能,所以需要自己改造源码实现。
zookeeper是分布式服务架构,主要用来解决分布式应用中经常遇到的一些数据管理问题,比如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
zookeeper上节点最常用的5种操作权限:
Create、Read、Write、Delete、Admin也就是增、删、改、查、管理权限,简写crwda
(这五种权限中,delete是指对子节点删除权限,其他四种权限指本身节点权限)
身份验证有4中方式:

看到了授权需要的模式是secheme??perm形式,下面就说说secheme
方法一、auth设置权限
addauth digest zookeeper:zookeeper

setAcl /test auth:zookeeper:zookeeper:crwda

getAcl /test

get /test

方法二、digest设置权限 (这个里面有个大坑)

可以看出比较明显的:

使用sha1编码和base64编码之后设置digest方式保存起来

之后就可以使用addauth的方式访问啦

创建节点数据时:

读取Zookeeper数据时:

通常使用dubbo一般有四种方式,xml配置、API调用、properties加载、注解配置。使用zookeeper作为注册中心主要配置如下:




最近又把dubbo拾起来啦,以前用过dubbo,后来12年阿里巴巴不维护啦,后来随着springcloud的不断崛起,使用dubbo的人越来越少,但是在国内还是有好多dubbo的热爱着,也是因为这样,在2017年的时候阿里将dubbo奉献给Apache社区,后面估计会越来越好。
这个无论是之前阿里维护还是现在放到Apache社区,直到目前为止,dubbo都没做好这块,使用zookeeper加权限连接,其实挺简单的,下面大致讲以下怎么做。
这里做之前先说一下实现dubbo连接加权限的zookeeper有两种方式,这个取决于dubbo连接zookeeper是通过两种客户端连接的,分别是zkclient和curator,而且dubbo提前预留量注册中心变量设置用户名和密码,这里使用的zookeeper加权方式是digest方式,使用用户名和密码方式对zookeeper节点加权限。
这里需要注意的是,自从dubbo转到Apache下面之后,源码改动不少,其中在dubbo
2.6.0以后版本,dubbo将默认使用zkclient访问zookeeper改成了默认使用curator客户端访问。
而且在2.5.4版本之后将com.github.sgroschupf 下面的zkclient 0.1版本改成了
com.101tec 下面的zkclient 0.2版本啦。
这里无论是新版本还是旧版本,都需要将zkclient包替换成com.101tec
的0.5以上版本,因为只有0.5以上的版本才支持ACL加权控制。(本人建议使用0.8以上的版本)
如果你是2.5.4以前的版本(包括2.5.4版本,就是12年之后17年之前发布的最新版本)需要将

替换成

(这个之前版本比较麻烦,需要到源码中将所有的pom都需要修改)
如果你是使用2.5.4以后的版本比较简单,只需要将dubbo-parent中的
<zkclient_version>0.2</zkclient_version>
改成
<zkclient_version>0.8</zkclient_version>
这里简单的介绍也一下dubbo连接Zookeeper的实现原理,首先服务的提供者和消费者在RegistryProtocol利用注册中心暴露(export)和引用(refer)服务的时候会根据配置利用Dubbo的SPI机制获取具体注册中心注册器

这里的RegistryFactory是ZookeeperRegistryFactory看如下工厂代码


在这里创建zookeepr注册器ZookeeperRegistry。
ZookeeperTransporter是操作zookeepr的客户端的工厂类,用来创建zookeeper客户端,这里客户端并不是zookeeper源代码的自带的,而是采用第三方工具包,主要来简化对zookeeper的操作,例如用zookeeper做注册中心需要对zookeeper节点添加watcher做反向推送,但是每次回调后节点的watcher都会被删除,这些客户会自动维护了这些watcher,在自动添加到节点上去。

这里又要分版本对待,对dubbo添加zookeeper权限适应于2.2.0-2.5.6版本之间dubbo使用者,2.5.6之后版本添加了ZkClientWrapper类,对zkclient又做成守护线程形式,需要进一步改造,后面也会专门提高2.5.6之后怎么改造的。



到目前为止,源码就改动这么多,连接Zookeeper的用户名和密码通过dubbo配置注册中心的时候配置,通过spring加载代URL中。
然后下面就说说具体怎么配置怎么用。
从?2.2.0 版本开始缺省为 zkclient 实现,以提升 zookeeper 客户端的健状性,配置:
<dubbo:registry ... client="zkclient" username="admin" password="admin" />
或
dubbo.registry.client=zkclient
dubbo.registry.username=admin
dubbo.registry.password=admin
或
zookeeper://10.20.153.10:2181?client=zkclient&username=admin&password=admin


到此直接启动即可,dubbo就可自动对注册dubbo的group节点添加ACL权限。





到目前为止,源码就改动这么多,连接Zookeeper的用户名和密码通过dubbo配置注册中心的时候配置,通过spring加载代URL中。
然后下面就说说具体怎么配置怎么用。
从?2.2.0 版本开始缺省为 zkclient 实现,以提升 zookeeper 客户端的健状性,配置:
<dubbo:registry ... client="zkclient" username="admin" password="admin" />
或
dubbo.registry.client=zkclient
dubbo.registry.username=admin
dubbo.registry.password=admin
或
zookeeper://10.20.153.10:2181?client=zkclient&username=admin&password=admin


到此直接启动即可,dubbo就可自动对注册dubbo的group节点添加ACL权限。
改造curator是最简单的方式,因为dubbo使用curator已经考虑到zookeeper加ACL了,只是代码设置不生效罢了,只要稍微动一下即可。

从?2.6.0 版本开始缺省为 curator 实现,以提升 zookeeper 客户端的健状性,配置:
<dubbo:registry ... client="curator" username="admin" password="admin" />
或
dubbo.registry.client=curator
dubbo.registry.username=admin
dubbo.registry.password=admin
或
zookeeper://10.20.153.10:2181?client=curator&username=admin&password=admin


启动之后即可实现对zookeeper添加权限控制啦。
原文:https://www.cnblogs.com/shenggang/p/12144661.html