一、簡介
以下是從官網摘抄的,官網地址: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