1. 程式人生 > 實用技巧 >配置zookeeper的 ACL許可權

配置zookeeper的 ACL許可權

一、簡介

以下是從官網摘抄的,官網地址:https://zookeeper.apache.org/doc/r3.4.13/zookeeperProgrammers.html#sc_ZooKeeperAccessControl
ZooKeeper使用ACL來控制對其znode(ZooKeeper資料樹的資料節點)的訪問。ACL實現與UNIX檔案訪問許可權非常相似:它使用許可權位來允許/禁止針對節點及其所應用範圍的各種操作。與標準UNIX許可權不同,ZooKeeper節點不受使用者(檔案所有者),組和環境(其他)的三個標準範圍的限制。ZooKeeper沒有znode所有者的概念。而是,ACL指定一組ID和與這些ID關聯的許可權。

還請注意,ACL僅與特定的znode有關。特別是它不適用於兒童。例如,如果 / app僅可被ip:172.16.16.1讀取,並且 / app / status是世界可讀的,則任何人都可以讀取/ app / status;ACL不是遞迴的。

ZooKeeper支援可插入身份驗證方案。使用格式scheme:id來指定ID,其中scheme是ID對應的身份驗證方案。例如,ip:172.16.16.1是地址為172.16.16.1的主機的ID 。

當客戶端連線到ZooKeeper並對其進行身份驗證時,ZooKeeper會將與該客戶端相對應的所有ID與該客戶端連線相關聯。當客戶端嘗試訪問節點時,將根據znodes的ACL檢查這些ID。ACL由(scheme:expression,perms)對組成。表示式的格式特定於該方案。例如,該對(ip:19.22.0.0/16,READ) 為IP地址以19.22開頭的任何客戶端提供READ許可權。

二、支援的許可權型別

  • CREATE:可以建立一個子節點
  • READ:可以從節點獲取資料並列出其子節點。
  • WRITE:可以為節點設定資料
  • DELETE:可以刪除一個子節點
  • admin:可以設定許可權

三、內嵌的ACL Schemes

  • world:所有者可以訪問,預設許可權
  • auth: 不使用任何ID,代表任何經過身份驗證的使用者。
  • digest: 使用使用者名稱:密碼字串生成MD5雜湊,然後將其用作ACL ID身份。通過以明文形式傳送username:password來完成認證。在ACL中使用時,表示式將是username:base64 編碼的SHA1 密碼摘要
  • ip/域名: 使用客戶端主機IP作為ACL ID身份。
  • super: 超級許可權

四、許可權測試

設定的格式說明:ACL的格式由::三段組成。

1、預設許可權

[zk: 127.0.0.1(CONNECTED) 63] getAcl /
'world,'anyone  
: cdrwa  

其中cdrwa為CREATE,DELETE,READ,WRITE,ADMIN許可權的縮寫名稱
預設許可權代表所有的客戶端都可以正常訪問zookeeper,其中的schema為world(全世界),id只能為anyone

2、auth許可權
這種授權不針對任何特點ID,而是對所有已經新增認證的使用者。也就是說在進行設定ACL的時候,不用設定id值。
這種方式是以明文密碼的方式來進行配置ACL的
使用方式

addauth digest <user>:<password> 
setAcl <path> auth:<id>:<acl>

示例:

[zk: 127.0.0.1(CONNECTED) 75] create /test1 '123'  #建立測試znode
[zk: 127.0.0.1(CONNECTED) 75] addauth digest user:password
[zk: 127.0.0.1(CONNECTED) 79] setAcl /test1 auth:user:password:r #設定當前路徑的ACL許可權,預設的user:password可以不用寫,也就是 setAcl /test1 auth::r 這樣,如果新增多個addauth,那麼所有新增的使用者對於改路徑都有許可權
[zk: 127.0.0.1(CONNECTED) 80] getAcl /test1          # 檢視許可權,可以發現對於user:password 這個使用者只有r許可權,同時檢視許可權的時候,發現密碼已經經過加密處理了。        
'digest,'user:tpUq/4Pn5A64fVZyQ0gOJ8ZWqkY=
: r

切換一個zookeeper的終端進行測試;

[zk: localhost:2181(CONNECTED) 2] addauth digest user:password     # 切換到auth上下文環境
① 開始測試讀許可權
[zk: 127.0.0.1(CONNECTED) 81] ls /test1
[]
[zk: 127.0.0.1(CONNECTED) 82] get /test1
123

② 測試write許可權
[zk: localhost:2181(CONNECTED) 4] set /test1 '124'
Authentication is not valid : /test1  # 發現是沒有寫許可權的

③ 測試create許可權
[zk: localhost:2181(CONNECTED) 5] create /test1/test11 '123'
Authentication is not valid : /test1/test11

④ 測試delete許可權
[zk: localhost:2181(CONNECTED) 12] delete /test1   # 額,居然有delete許可權
[zk: localhost:2181(CONNECTED) 13]

⑤ 測試 admin許可權,這個許可權並不是代表管理員的許可權,僅僅只是是否有重新進行設定ACL的許可權
[zk: localhost:2181(CONNECTED) 20] setAcl /test1 auth:user:password:ra
Authentication is not valid : /test1

3、digest
以加密的密碼進行許可權認證
使用方法

setAcl <path> digest:<user>:<password(密文)>:<acl>

密碼的生成方式

echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64

eg:

(base) [root@localhost rsnmp]# echo -n testuser:12345 | openssl dgst -binary -sha1 | openssl base64
JAQXSDtqvFF3tJximvqJpWHdlBY=  # 這就是加密的密碼

或者

java -cp /zookeeper-3.4.13/zookeeper-3.4.13.jar:/zookeeper-3.4.13/lib/slf4j-api-1.7.25.jar \
  org.apache.zookeeper.server.auth.DigestAuthenticationProvider \
  root:root

測試

[zk: localhost:2181(CONNECTED) 11] create /test2 '123'
Created /test2
[zk: localhost:2181(CONNECTED) 12] setAcl /test2 digest:testuser:JAQXSDtqvFF3tJximvqJpWHdlBY=:r

4、ip認證
也就是白名單
用法

setAcl path ip:ip地址:許可權

eg:

[zk: localhost:2181(CONNECTED) 15] create /test3 '123'
Created /test3
[zk: localhost:2181(CONNECTED) 16] setAcl /test3 ip:127.0.0.1:cdrwa,ip:192.168.0.235:cdrwa
[zk: localhost:2181(CONNECTED) 17] getAcl /test3
'ip,'127.0.0.1
: cdrwa
'ip,'192.168.0.235
: cdrwa

5、super
超級管理員許可權,當在zookeeper裡面配置很多的許可權認證,也可能很多時候密碼什麼的都會忘記了,這時候可以設定super許可權,來管理
假設這個超管是:super:admin
生成加密密碼

(base) [root@localhost rsnmp]# echo -n super:admin | openssl dgst -binary -sha1 | openssl base64
xQJmxLMiHGwaqBvst5y6rkB6HQs=

配置zookeeper的zkServer.sh檔案

需要新增:

"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="  #注:super後面的是生成的加密密碼

重啟zookeeper

[zk: localhost:2181(CONNECTED) 20] ls /test
Authentication is not valid : /test
[zk: localhost:2181(CONNECTED) 21] addauth digest super:admin   #切換到超級管理員的上下文
[zk: localhost:2181(CONNECTED) 22] ls /test                  
[test2, test1]
[zk: localhost:2181(CONNECTED) 23] delete /test/test1
[zk: localhost:2181(CONNECTED) 24] set /test/test2 '555'

如果hadoop需要連線帶有ACL的zookeeper,需要配置相關的引數
借鑑:
https://blog.csdn.net/u010900754/article/details/78498291
https://www.jianshu.com/p/392248ab27f4
https://blog.csdn.net/qq_35440040/article/details/87911394 # hadoop配置zookeeper ACL