1. 程式人生 > >Zookeeper(四)Acl許可權控制

Zookeeper(四)Acl許可權控制

傳統的檔案系統中,ACL分為兩個維度,一個是屬組,一個是許可權,子目錄/檔案預設繼承父目錄的ACL。而在Zookeeper中,node的ACL是沒 有繼承關係的,是獨立控制的。Zookeeper的ACL,可以從三個維度來理解:一是scheme; 二是user; 三是permission,通常表示為scheme:id:permissions, 下面從這三個方面分別來介紹:
(1)scheme: scheme對應於採用哪種方案來進行許可權管理,zookeeper實現了一個pluggable的ACL方案,可以通過擴充套件scheme,來擴充套件ACL的機制。zookeeper-3.4.4預設支援下面幾種scheme:
      * world: 它下面只有一個id, 叫anyone, world:anyone代表任何人,zookeeper中對所有人有許可權的結點就是屬於world:anyone的
      * auth: 它不需要id, 只要是通過authentication的user都有許可權(zookeeper支援通過kerberos來進行authencation, 也支援username/password形式的authentication)
      * digest: 它對應的id為username:BASE64(SHA1(password)),它需要先通過username:password形式的authentication
      * ip: 它對應的id為客戶機的IP地址,設定的時候可以設定一個ip段,比如ip:192.168.1.0/16, 表示匹配前16個bit的IP段
      * super: 在這種scheme情況下,對應的id擁有超級許可權,可以做任何事情(cdrwa)
       * sasl: sasl的對應的id,是一個通過sasl authentication使用者的id,zookeeper-3.4.4中的sasl authentication是通過kerberos來實現的,也就是說使用者只有通過了kerberos認證,才能訪問它有許可權的node.
(2)id: id與scheme是緊密相關的,具體的情況在上面介紹scheme的過程都已介紹,這裡不再贅述。
(3)permission: zookeeper目前支援下面一些許可權:
       CREATE(c): 建立許可權,可以建立當前node的子節點
       DELETE(d): 刪除許可權,可以刪除當前node的子節點
       READ(r): 讀許可權,可以獲取當前node的資料,可以list當前node所有的child nodes
       WRITE(w): 寫許可權,可以向當前node寫資料
       ADMIN(a): 管理許可權,可以設定當前node的permission

在這裡,介紹兩個設定許可權的方法
1.
setAcl /node digest:[username]:[Encrypted password]:[perms]
其中,[perm]是指cdrwa中一個或多個許可權
密碼需要是加密後的密文,perms就是設定的許可權cdrwa
一般來說,在java中,會使用以下方法來加密密碼:
org.apache.zookeeper.server.auth.DigestAuthenticationProvider.generateDigest(String idPassword),
檢視方法的原始碼:
/**
* @param idPassword like: superUser:111111
*/
static public String generateDigest(String idPassword)
        throws NoSuchAlgorithmException {
    String parts[] = idPassword.split(":", 2);
    byte digest[] = MessageDigest.getInstance("SHA1").digest(
            idPassword.getBytes());
    return parts[0] + ":" + base64Encode(digest);
}
從原始碼,可以理解密碼是如何加密的,先對(user:password)進行SHA1加密,得到密文再進行base64編碼得到最後的密文,
虛擬碼:
密碼密文=base64(SHA1(id:passwprd))

2.

先新增一個認證使用者,注意,這次是密碼明文的

addauth digest [username]:[password plain]
接著給節點設定許可權,[perm]是指cdrwa中一個或多個許可權
setAcl /node auth:[username]:[password plain]:[perm]


設定了許可權的節點,需要訪問,操作時,需要先進行使用者誰才行有許可權操作,即執行

addauth digest [username]:[password plain]

java原始碼可參照:點選開啟連結