Apache ZooKeeper - ZK的ACL权限控制( Access Control List )
文章目錄
- 概述
- 權限模式(Scheme)
- 口令驗證
- 范圍驗證
- Super權限模式
- 授權對象(ID)
- 權限信息(Permission)
- ACL相關命令
- 跳過ACL檢測
- 實操ACL
- 生成授權ID
- 方式一 Code
- 方式二 shell命令
- 方式一 digest 密文授權
- 方式二 auth 明文授權
- 方式三 IP授權模式
- Super 超級管理員模式
- 特殊說明
概述
ACL全稱為Access Control List(訪問控制列表),用于控制資源的訪問權限,可以控制節點的讀寫操作,保證數據的安全性 。
ZooKeeper使用ACL來控制對其znode的防問。
Zookeeper ACL 權限設置分為 3 部分組成,分別是:權限模式(Scheme)、授權對象(ID)、權限信息(Permission)
基于scheme:id:permission的方式進行權限控制: scheme表示授權模式、id模式對應值、permission即具體的增刪改權限位。
權限模式(Scheme)
用來設置 ZooKeeper 服務器進行權限驗證的方式 。
| world | 開放模式,world表示全世界都可以訪問(這是默認設置) |
| ip | ip模式,限定客戶端IP防問 |
| auth | 用戶密碼認證模式,只有在會話中添加了認證才可以防問 |
| digest | 與auth類似,區別在于auth用明文密碼,而digest 用sha-1+base64加密后的密碼。在實際使用中digest 更常見。 |
口令驗證
用戶名密碼的方式
在 ZooKeeper 中這種驗證方式是 Digest 認證,而 Digest 這種認證方式首先在客戶端傳送“username:password”這種形式的權限表示符后,ZooKeeper 服務端會對密碼 部分使用 SHA-1 和 BASE64 算法進行加密,以保證安全性。
范圍驗證
范圍驗證就是說 ZooKeeper 可以針對一個 IP 或者一段 IP 地址授予某種權限。、
我們可以讓一個 IP 地址為“ip:192.168.11.123”的機器對服務器上的某個數據節點具有寫入的權限。或者也可以通過“ip:192.168.0.1/24”給一段 IP 地址的機器賦權。
Super權限模式
Super可以認為是一種特殊的 Digest 認證。具有 Super 權限的客戶端可以對 ZooKeeper 上的任意數據節點進行任意操作.
授權對象(ID)
授權對象就是說我們要把權限賦予誰,而對應于 4 種不同的權限模式來說,
如果我們
- 選擇采用 IP 方式,使用的授權對象可以是一個 IP 地址或 IP 地址段
- 使用 Digest 或 Super 方式,則對應于一個用戶名
- World 模式,是授權系統中所有的用戶
權限信息(Permission)
權限就是指我們可以在數據節點上執行的操作種類,如下所示:在 ZooKeeper 中已經定義好的權限有 5 種:
- 數據節點(c: create)創建權限,授予權限的對象可以在數據節點下創建子節點;
- 數據節點(w: wirte)更新權限,授予權限的對象可以更新該數據節點;
- 數據節點(r: read)讀取權限,授予權限的對象可以讀取該節點的內容以及子節點的列表信息;
- 數據節點(d: delete)刪除權限,授予權限的對象可以刪除該數據節點的子節點;
- 數據節點(a: admin)管理者權限,授予權限的對象可以對該數據節點體進行 ACL 權限設置。
ACL相關命令
| getAcl | getAcl path | 讀取ACL權限 |
| setAcl | setAcl path acl | 設置ACL權限 |
| addauth | addauth scheme auth | 添加認證用戶 |
跳過ACL檢測
可以通過系統參數zookeeper.skipACL=yes進行配置,默認是no,可以配置為true, 則配置過的ACL將不再進行權限檢測
zkServer.sh
修改后重啟zk .
任意節點均可訪問
實操ACL
生成授權ID
方式一 Code
public void generateSuperDigest() throws NoSuchAlgorithmException {String sId = DigestAuthenticationProvider.generateDigest("artisan:xgj");System.out.println(sId); }方式二 shell命令
echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64舉例
[root@localhost bin]# echo -n artisan:xgj | openssl dgst -binary -sha1 | openssl base64 Xe7+HMYId2eNV48821ZrcFwIqIE= [root@localhost bin]#方式一 digest 密文授權
創建Node的時候 設置acl
[zk: localhost:2181(CONNECTED) 10] create /artisan_node artisan_value digest:artisan:Xe7+HMYId2eNV48821ZrcFwIqIE=:cdrwa Created /artisan_node [zk: localhost:2181(CONNECTED) 11] get /artisan_node # 直接查看沒有訪問權限的 org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /artisan_node [zk: localhost:2181(CONNECTED) 12]或者創建node的時候不指定acl ,然后用setAcl 設置
setAcl /artisan_node digest:artisan:Xe7+HMYId2eNV48821ZrcFwIqIE=:cdrwa如何才能有訪問權限呢? 因為是給artisan這個用戶賦權的
【訪問前需要添加授權信息】addauth
[zk: localhost:2181(CONNECTED) 12] addauth digest artisan:xgj [zk: localhost:2181(CONNECTED) 13] get /artisan_node artisan_value [zk: localhost:2181(CONNECTED) 14]方式二 auth 明文授權
[zk: localhost:2181(CONNECTED) 14] addauth digest aaa:passwddd [zk: localhost:2181(CONNECTED) 15] create /artisanNNN nodeValue auth:aaa:passwddd:cdwra # 這是aaa用戶授權信息會被zk保存,可以認為當前的授權用戶為aaa Created /artisanNNN [zk: localhost:2181(CONNECTED) 16] get /artisanNNN nodeValue [zk: localhost:2181(CONNECTED) 17]方式三 IP授權模式
創建時設置ip的權限
create /node-ip data ip:192.168.11.123:cdwra或者創建完成以后 手工調用setAcl
setAcl /node-ip ip:192.168.11.123:cdwra登錄 109.130 ,然后訪問zk
多個指定IP可以通過逗號分隔, 如 setAcl /node-ip ip:IP1:rw,ip:IP2:a
Super 超級管理員模式
是一種特殊的Digest模式, 在Super模式下超級管理員用戶可以對Zookeeper上的節點進行任何的操作.
-Dzookeeper.DigestAuthenticationProvider.superDigest=super:<base64encoded(SHA1(password))在DigestAuthenticationProvider類中定義的
參考如下
重啟zk , 就進入了超級管理員模式
任意操作咯
特殊說明
權限僅對當前節點有效,不會讓子節點繼承。如限制了IP防問A節點,但不妨礙該IP防問A的子節點 /A/B
總結
以上是生活随笔為你收集整理的Apache ZooKeeper - ZK的ACL权限控制( Access Control List )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apache ZooKeeper -
- 下一篇: Apache ZooKeeper - Z