配置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

注:zookeeper版本3.5以下的不支持設置網段的方式配置ACL,只有在3.5以上才支持
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM