Zookeeper的ACL許可權控制
技術標籤:ZookeeperACL許可權Zookeeperzkzookeeper許可權控制
目錄
一、概述
zookeeper類似linux檔案系統,客戶端可以建立資料節點、更新節點資料、刪除節點等,那麼我們如何做到節點的許可權控制呢?回想一下linux檔案的許可權檔案,由r(讀)、w(寫)、x(可執行)組成,同理,zookeeper中存在訪問控制列表,也可以實現類似的許可權控制。
acl 許可權控制,使用scheme:id:permission 來標識,主要涵蓋 3 個方面:
- 許可權模式(scheme):授權的策略;
- 授權物件(id):授權的物件;
- 許可權(permission):授予的許可權;
其特性如下:
- zooKeeper的許可權控制是基於每個znode節點的,需要對每個節點設定許可權;
- 每個znode支援設定多種許可權控制方案和多個許可權;
- 子節點不會繼承父節點的許可權,客戶端無權訪問某節點,但可能可以訪問它的子節點;
二、acl許可權各部分組成說明
- 許可權模式
許可權模式,即scheme,表示採用何種方式授權,是許可權控制的第一部分。
在zookeeper中,主要有一下四種許可權模式:
- world:只有一個使用者:anyone,代表登入到zookeeper伺服器的所有客戶端,預設也是基於world的;
- ip:對客戶端使用IP地址認證;
- auth:使用已新增認證的使用者認證;
- digest:使用“使用者名稱:密碼”方式認證;
- 授權的物件
授權物件,指的其實就是給誰授予許可權。
授權物件ID是指,許可權賦予的實體,例如:IP 地址或使用者。
- 授予的許可權
指的是授予指定的授權物件什麼許可權,如讀、寫、刪等許可權。
在zookeeper中,主要有下面五種許可權:
- create:簡稱c,可以建立子節點;
- delete:簡稱d,可以刪除子節點(僅下一級節點);
- read:簡稱r,可以讀取節點資料及顯示子節點列表;
- write:簡稱w,可以設定節點資料;
- admin:簡稱a,可以設定節點訪問控制列表許可權;
上面5種許可權簡寫為cdrwa,注意:這5種許可權中,delete是指對子節點的刪除許可權,其它4種許可權指對自身節點的操作許可權。
三、授權的相關命令
命令 | 使用方式 | 描述 |
setAcl | setAcl | 設定ACL許可權 |
getAcl | getAcl | 讀取ACL許可權 |
addauth | addauth | 新增認證使用者 |
四、world授權模式
語法格式:
setAcl <path> world:anyone:<acl>
案例:
[zk: localhost:2181(CONNECTED) 30] create /node1 "node1"
Created /node1
[zk: localhost:2181(CONNECTED) 31] getAcl /node1 #檢視/node1當前許可權
'world,'anyone #預設新建立的節點都是word授權模式,針對anyone所有登入進來的客戶端,都具有讀、寫、刪、改許可權
: cdrwa
[zk: localhost:2181(CONNECTED) 32] setAcl /node1 world:anyone:drwa #設定/node1許可權,去掉c建立子節點許可權
cZxid = 0x64
ctime = Mon Dec 21 14:21:08 CST 2020
mZxid = 0x64
mtime = Mon Dec 21 14:21:08 CST 2020
pZxid = 0x64
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: localhost:2181(CONNECTED) 33] getAcl /node1
'world,'anyone
: drwa
[zk: localhost:2181(CONNECTED) 34] create /node1/node11 "node11" #嘗試建立子節點,發現報錯,因為此時不具有create許可權
Authentication is not valid : /node1/node11
五、IP授權模式
語法格式:
setAcl <path> ip:<ip>:<acl>
案例:
終端一: 使用xshell登入192.168.179.133機器上的zkCli.sh客戶端。
[[email protected] bin]# ./zkCli.sh -server 192.168.179.133
Connecting to 192.168.179.133
[zk: 192.168.179.133(CONNECTED) 1] create /node2 "node2"
Created /node2
[zk: 192.168.179.133(CONNECTED) 2] setAcl /node2 ip:192.168.179.133:cdrwa
cZxid = 0x700000009
ctime = Tue Jan 19 10:45:24 CST 2021
mZxid = 0x700000009
mtime = Tue Jan 19 10:45:24 CST 2021
pZxid = 0x700000009
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: 192.168.179.133(CONNECTED) 3] getAcl /node2
'ip,'192.168.179.133
: cdrwa
如上可以看到,建立了一個/node2節點,並指定IP為192.168.179.133的機器具有/node2節點的cdrwa許可權,其他機器都沒有操作許可權,下面我們驗證一下。
終端二:使用xshell連線上192.168.179.128機器的zookeeper客戶端,檢視是否有許可權操作/node2節點。
[[email protected] bin]# ./zkCli.sh -server 192.168.179.129
Connecting to 192.168.179.129
[zk: 192.168.179.129(CONNECTED) 0] get /node2
Authentication is not valid : /node2
[zk: 192.168.179.129(CONNECTED) 1]
如上,可看到Authentication is not valid,說明192.168.179.129機器無法訪問/node2節點,以上就是IP授權模式,在生產環境中,使用限定IP的方式可以防止不明IP惡意攻擊我們的zookeeper叢集,可以限定只有叢集內的機器擁有許可權。
六、Auth授權模式
語法格式:
addauth digest <user>:<password> #新增認證使用者
setAcl <path> auth:<user>:<acl>
[zk: localhost:2181(CONNECTED) 40] create /node3 "node3"
Created /node3
[zk: localhost:2181(CONNECTED) 41] getAcl /node3
'world,'anyone
: cdrwa
[zk: localhost:2181(CONNECTED) 42] addauth digest admin:123456
[zk: localhost:2181(CONNECTED) 43] setAcl /node3 auth:admin:cdrwa
cZxid = 0x68
ctime = Mon Dec 21 14:32:41 CST 2020
mZxid = 0x68
mtime = Mon Dec 21 14:32:41 CST 2020
pZxid = 0x68
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: localhost:2181(CONNECTED) 44] getAcl /node3
'digest,'admin:0uek/hZ/V9fgiM35b0Z2226acMQ=
: cdrwa
啟動另外一個終端進行測試:
[zk: localhost:2181(CONNECTED) 4] get /node3
Authentication is not valid : /node3 #新增認證使用者後可以訪問
[zk: localhost:2181(CONNECTED) 5] addauth digest admin:123456
[zk: localhost:2181(CONNECTED) 6] get /node3
node3
cZxid = 0x68
ctime = Mon Dec 21 14:32:41 CST 2020
mZxid = 0x68
mtime = Mon Dec 21 14:32:41 CST 2020
pZxid = 0x68
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
可見,只有新增認證使用者後才能訪問auth授權的那些節點。
七、Digest授權模式
語法格式:
setAcl <path> digest:<user>:<password>:<acl>
注意:這裡的密碼是經過SHA1及BASE64處理的密文,在SHELL中可以通過以下命令計算。
echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64
這裡我們使用admin:123456進行測試,首先計算出密文:
[[email protected] ~]# echo -n admin:123456 | openssl dgst -binary -sha1 | openssl base64
0uek/hZ/V9fgiM35b0Z2226acMQ= #123456加密後的密文就是這個
案例:
[zk: localhost:2181(CONNECTED) 47] create /node4 "node4"
Created /node4
[zk: localhost:2181(CONNECTED) 48] getAcl /node4
'world,'anyone
: cdrwa
#使用是上面算好的密文密碼新增許可權
[zk: localhost:2181(CONNECTED) 49] setAcl /node4 digest:admin:0uek/hZ/V9fgiM35b0Z2226acMQ=:cdrwa
cZxid = 0x6a
ctime = Mon Dec 21 14:47:12 CST 2020
mZxid = 0x6a
mtime = Mon Dec 21 14:47:12 CST 2020
pZxid = 0x6a
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: localhost:2181(CONNECTED) 50] getAcl /node4
'digest,'admin:0uek/hZ/V9fgiM35b0Z2226acMQ=
: cdrwa
然後開啟另外一個終端:
[zk: localhost:2181(CONNECTED) 0] get /node4
Authentication is not valid : /node4
[zk: localhost:2181(CONNECTED) 1] addauth digest admin:123456 #新增認證使用者
[zk: localhost:2181(CONNECTED) 2] get /node4 #成功讀取資料
node4
cZxid = 0x6a
ctime = Mon Dec 21 14:47:12 CST 2020
mZxid = 0x6a
mtime = Mon Dec 21 14:47:12 CST 2020
pZxid = 0x6a
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
可見,只有添加了認證使用者才能進行許可權範圍內的操作。
八、多種模式授權
在zookeeper中,同一個節點可以同時使用多種模式進行授權。
[zk: localhost:2181(CONNECTED) 3] create /node5 "node5"
Created /node5
#使用多種授權模式,中間使用","進行分隔開
[zk: localhost:2181(CONNECTED) 4] setAcl /node5 auth:admin:cdrwa,digest:admin:0uek/hZ/V9fgiM35b0Z2226acMQ=:cdrwa
cZxid = 0x6d
ctime = Mon Dec 21 14:52:28 CST 2020
mZxid = 0x6d
mtime = Mon Dec 21 14:52:28 CST 2020
pZxid = 0x6d
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: localhost:2181(CONNECTED) 5] getAcl /node5 #可以看到多種授權模式可同時存在
'digest,'admin:0uek/hZ/V9fgiM35b0Z2226acMQ=
: cdrwa
'digest,'admin:0uek/hZ/V9fgiM35b0Z2226acMQ=
: cdrwa
九、總結
本篇文章詳解介紹了zookeeper中幾種常見的授權模式,並通過案例詳細說明了如何進行授權等,在實際工作中,根據具體的場合決定是否需要進行許可權控制。