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