zookeeper ACL 權限控制

閱讀本文大約需要5分鐘

版本說明:

zookeeper:3.4.6

一、概述

zooKeeper使用acl(Access Control List)來控制對其znode(zooKeeper數據樹的數據節點)的訪問。 不過,zookeeper的acl並不像HDFS系統的acl一樣,可以遞歸控制權限。zookeeper的acl不是遞歸的,僅適用於特定的znode。比如/app這個znode,設置一些權限,只能某用戶可以訪問,但是/app/status的權限是與/app沒有關係的,默認是world:anyone:cdrwa。

總的來說。zookeeper的acl特點可以分為以下幾點:

  • zooKeeper的權限控制是基於每個znode節點的,需要對每個節點設置權限。
  • 每個znode支持設置多種權限控制方案和多個權限。多種權限控制方案以逗號分隔,例如:setAcl /hiveserver2 sasl:hive:cdrwa,world:anyone:r。
  • 子節點不會繼承父節點的權限,客戶端無權訪問某節點,但可能可以訪問它的子節點。

二、權限類型

當客戶端連接到zooKeeper並對其自身進行身份驗證,當客戶端嘗試訪問znode節點時,將檢查znode的acl。 acl由(scheme:expression:permission)對組成,表達式的格式特定於scheme。例如,該對(ip:19.22.0.0/16:r)為任何IP地址以19.22開頭的客戶端提供READ權限。

zookeeper默認所有節點都是world:anyone:cdrwa,即所有人都擁有這五個權限,按順序分別為:

  • Create:允許對子節點Create操作
  • Delete:允許對子節點Delete操作
  • Read:允許對本節點GetChildren和GetData操作,有對本節點進行刪除操作的權限
  • Write:允許對本節點SetData操作
  • Admin:允許對本節點setAcl操作

三、訪問控制列表方案(ACL Schemes)

zookeeper的ACL Schemes有以下幾種:

  • world:只有一個id即anyone,為所有Client端開放權限。
  • auth:不需要任何id,只要是通過auth的用戶都有權限。
  • digest:Client端使用用戶和密碼的方式驗證,採用username:BASE64(SHA1(password))的字符串作為節點ACL的id(如:digest:lyz:apNZxQYP6HbBQ9hRAibCkmPKGss=)。
  • ip:使用客戶端的IP地址作為ACL的id,可以設置為一個ip段(如:ip:192.168.0.1/8)。Client端由IP地址驗證,譬如172.2.0.0/24。
  • sasl:設置為用戶的uid,通過sasl Authentication用戶的id,在zk3.4.4版本後sasl是通過Kerberos實現(即只有通過Kerberos認證的用戶才可以訪問權限的znode),使用sasl:uid:cdwra字符串作為節點ACL的id(如:sasl:lyz:cdwra)。

四、示例

acl的相關命令如下表所示:

zookeeper ACL 權限控制

通過以下命令進入zookeeper cli模式,默認連接localhost。

1. world 模式

zookeeper創建的節點默認的權限就是world:anyone:cdrwa,即所有人在client端都擁有cdrwa這五個權限。如下圖所示:

zookeeper ACL 權限控制

節點權限是world,也就是默認權限,為所有client端開放,這樣肯定是不安全的,我們先基於auth模式進行權限的控制。

2. auth 模式

為/test1節點增加auth權限認證方式。設置方式如下:

addauth digest : #添加認證用戶
setAcl <path> auth:<user>:
/<user>/<path>

客戶端示例:

zookeeper ACL 權限控制

小結:

  • 首先,需要創建用戶上下文 — addauth,密碼為明文密碼。
  • 其次設置權限 — setAcl
  • 查看節點權限的時候,密碼會自動轉為密文,該密文是採用user:BASE64(SHA1(password))的字符串。
  • 查看節點數據之前,必須確保擁有認證用戶的上下文,否則會報:Authentication is not valid : /test1。

3. digest 模式

設置方式如下:

setAcl <path> digest:::
/<path>

digest加密模式相對於auth來說要稍微麻煩一些,需要對明文密碼進行BASE64(SHA1(password))的處理。

如何對password進行加密,有兩種方法:

  • 第一種方法:這裡的密碼是經過SHA1及BASE64處理的密文,在shell中可以通過以下命令計算:
echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64
/<password>/<user>

生成lyz:create17對應的加密密文,如下圖所示:

zookeeper ACL 權限控制

切記:生成的是lyz:create17對應的密文,如果將lyz換為其它,密文則不一樣。

  • 第二種方法:使用zookeeper提供的java類來生成密文:
export ZK_CLASSPATH=/etc/zookeeper/conf/:/usr/hdp/current/zookeeper-server/lib/*:/usr/hdp/current/zookeeper-server/*
java -cp $ZK_CLASSPATH org.apache.zookeeper.server.auth.DigestAuthenticationProvider lyz:create17

執行效果如下圖所示:

zookeeper ACL 權限控制

客戶端示例:

zookeeper ACL 權限控制

小結:

  • 首先,獲取密碼加密後的密文
  • 然後可直接setAcl設置權限,不用添加身份認證
  • 如果要訪問節點數據,必須確保擁有認證用戶的上下文,再訪問節點數據,否則會報:Authentication is not valid : /test2。

digest 與 auth 模式之間的不同:

  • auth採取明文認證的模式,在對節點設置權限之前,需要先設置認證用戶的上下文。訪問節點數據也是同理。
  • digest採取密文認證的模式,可以直接對節點設置權限。當訪問節點數據時,也需要提前設置認證用戶的上下文。

4. ip 認證模式

設置方式如下:

setAcl <path> ip:: 

/<path>

:可以是具體IP也可以是IP/bit格式,即IP轉換為二進制,匹配前bit位,如192.168.0.0/16匹配192.168.*.*

客戶端示例:

zookeeper ACL 權限控制

如上圖所示,對/test3節點設置10.6.6.71全部權限,10.6.6.72可讀權限。使用localhost訪問/test3,自然是不可行的。接下來在10.6.6.71與72節點上測試一下:

zookeeper ACL 權限控制

在10.6.6.72節點進入zkCli模式,執行以下命令:

/usr/hdp/3.0.1.0-187/zookeeper/bin/zkCli.sh -server 10.6.6.72
zookeeper ACL 權限控制

在10.6.6.73節點進入zkCli模式,訪問/test3數據,會報:Authentication is not valid : /test3。

5. sasl 模式

該模式屬於kerberos所特有的模式,需要依賴kerberos實現。只有通過Kerberos認證的用戶才可以訪問權限的znode。設置權限的方式,比如:setAcl /hiveserver2 sasl:hive:cdrwa。

五、設置超級管理員

假如你忘記了你認證用戶的密碼,或者基於其它什麼情況,導致某znode節點無法被操作,怎麼辦呢?其實我們可以為zookeeper設置超級管理員。

用戶:密碼還是以lyz:create17為例:

1.首先還是要獲取lyz:create17的密文,這裡就不贅述了,密文為:lyz:apNZxQYP6HbBQ9hRAibCkmPKGss=。

2.編輯/usr/hdp/3.0.1.0-187/zookeeper/bin/zkServer.sh,添加一些配置。

將"-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "-Dzookeeper.DigestAuthenticationProvider.superDigest=lyz:apNZxQYP6HbBQ9hRAibCkmPKGss="添加至文件的第135行,注意前後空格。具體如下圖所示:

zookeeper ACL 權限控制

3.保存文件,重啟該節點上的zookeeper服務。這樣,zookeeper的超級管理員就設置成功了。

4.執行命令進入zkCli模式:/usr/hdp/3.0.1.0-187/zookeeper/bin/zkCli.sh,再執行addauth digest lyz:create17認證身份,這樣就具備超級管理員角色,可以操作任意節點了。

六、總結

本篇文章主要介紹了zookeeper的acl操作,介紹了acl的權限類型,還有acl的Schemes。主要是對Schemes如何使用進行了示例說明。

zookeeper的acl不支持級聯操作,即子節點不會繼承父節點的權限。這樣就導致了修改節點權限比較麻煩,可能這種設計模式也有它的優點吧。如果有對這一方面瞭解的朋友,歡迎告知,謝謝。

更多acl知識,可參考zookeeper官網:https://zookeeper.apache.org/doc/r3.4.6/zookeeperProgrammers.html#sc_ZooKeeperAccessControl


--END--

碼字不易,如果您覺得文章寫得不錯,請關注作者~ 您的關注是我寫作的最大動力

友情提示:原文排版精美,可點擊分享鏈接查看。


分享到:


相關文章: