默認情況下ZooKeeper允許匿名訪問,因此在安全漏洞掃描中暴漏未授權訪問漏洞。
一、參考資料
《ZooKeeper 筆記(5) ACL(Access Control List)訪問控制列表》
https://cloud.tencent.com/developer/article/1024452
《ZooKeeper access control using ACLs》
http://zookeeper.apache.org/doc/r3.4.6/zookeeperProgrammers.html#sc_ZooKeeperAccessControl
ZooKeeper的節點有5種操作權限:
CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、刪、改、查、管理權限,這5種權限簡寫為crwda(即:每個單詞的首字符縮寫)
注:這5種權限中,delete是指對子節點的刪除權限,其它4種權限指對自身節點的操作權限
ZooKeeper的身份的認證有4種方式:
world:默認方式,相當於全世界都能訪問
auth:代表已經認證通過的用戶(cli中可以通過addauth digest user:pwd 來添加當前上下文中的授權用戶)
digest:即用戶名:密碼這種方式認證,這也是業務系統中最常用的
ip:使用Ip地址認證
二、解決思路:
1、world方式直接排除。
2、auth和digest通過用戶名和密碼方式可以有效進行權限控制,因應用中使用duboo和zookeeper做結合,有網友說Dubbo並沒有實現認證的邏輯,實際測試發現確實無法進行注冊。
報出如下錯誤:
java.lang.IllegalStateException: Failed to register
cause: org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /dubbo/com.common.crud.IEntityDao
參考資料:
https://yq.aliyun.com/articles/284281?utm_content=m_37169
3、最后只剩下了IP限制方式,通過IP白名單對連接ZK的客戶端進行限制。
三、操作步驟:
因zookeeper不支持節點間權限的繼承,所以需要對關鍵節點進行權限控制。
目前只對“/”、“/dubbo”、“/zookeeper”進行限制。
<ZooKeeper_HOME>/bin/ ./zkCli.sh -server ip:port setAcl / ip:xx.xx.xx.152:cdrwa,ip:xx.xx.xx.151:cdrwa,ip:xx.xx.xx.156:cdrwa,ip:xx.xx.xx.155:cdrwa,ip:xx.xx.xx.150:cdrwa,ip:xx.xx.xx.149:cdrwa setAcl /dubbo ip:xx.xx.xx.152:cdrwa,ip:xx.xx.xx.151:cdrwa,ip:xx.xx.xx.156:cdrwa,ip:xx.xx.xx.155:cdrwa,ip:xx.xx.xx.150:cdrwa,ip:xx.xx.xx.149:cdrwa setAcl /zookeeper ip:xx.xx.xx.152:cdrwa,ip:xx.xx.xx.151:cdrwa,ip:xx.xx.xx.156:cdrwa,ip:xx.xx.xx.155:cdrwa,ip:xx.xx.xx.150:cdrwa,ip:xx.xx.xx.149:cdrwa