這里用的是用戶名密碼的方式,需用別的方式請參考下面地址
附大佬鏈接:(有三種解決方法)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