1. 程式人生 > 其它 >Zookeeper的ACL許可權控制

Zookeeper的ACL許可權控制

技術標籤:ZookeeperACL許可權Zookeeperzkzookeeper許可權控制

目錄

一、概述

二、acl許可權各部分組成說明

三、授權的相關命令

四、world授權模式

五、IP授權模式

六、Auth授權模式

七、Digest授權模式

八、多種模式授權

九、總結


一、概述

zookeeper類似linux檔案系統,客戶端可以建立資料節點、更新節點資料、刪除節點等,那麼我們如何做到節點的許可權控制呢?回想一下linux檔案的許可權檔案,由r(讀)、w(寫)、x(可執行)組成,同理,zookeeper中存在訪問控制列表,也可以實現類似的許可權控制。

acl 許可權控制,使用scheme:id:permission 來標識,主要涵蓋 3 個方面:

  • 許可權模式(scheme):授權的策略;
  • 授權物件(id):授權的物件;
  • 許可權(permission):授予的許可權;

其特性如下:

  • zooKeeper的許可權控制是基於每個znode節點的,需要對每個節點設定許可權;
  • 每個znode支援設定多種許可權控制方案和多個許可權;
  • 子節點不會繼承父節點的許可權,客戶端無權訪問某節點,但可能可以訪問它的子節點;

二、acl許可權各部分組成說明

  • 許可權模式

許可權模式,即scheme,表示採用何種方式授權,是許可權控制的第一部分。

在zookeeper中,主要有一下四種許可權模式:

  1. world:只有一個使用者:anyone,代表登入到zookeeper伺服器的所有客戶端,預設也是基於world的;
  2. ip:對客戶端使用IP地址認證;
  3. auth:使用已新增認證的使用者認證;
  4. 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中幾種常見的授權模式,並通過案例詳細說明了如何進行授權等,在實際工作中,根據具體的場合決定是否需要進行許可權控制。