文章目錄
1. 權限控制ACL(Access Control List)
##1.1 權限特性
- ZooKeeper 的權限控制是基於每個 znode 節點的,需要對每個節點設置權限
- 每個 znode 支持設置多種權限控制方案和多個權限
- 子節點不會繼承父節點的權限,客戶端無權訪問某節點,但可能可以訪問它的子節點
1.2 權限類型
權限 | ACL簡寫 | 描述 |
---|---|---|
CREATE | c | 創建子節點 you can create a child node |
DELETE | d | 刪除子節點you can delete a child node(除了/ 都可以刪) |
READ | r | 讀取節點數據及顯示子節點列表 you can get data from a node and list its children. |
WRITE | w | 設置節點數據 you can set data for a node |
ADMIN | a | 設置節點訪問控制列表權限 you can set permissions |
##1.3 訪問控制列表方案(ACL Schemes)
ZooKeeper 內置了一些權限控制方案,可以用以下方案爲每個節點設置權限:
方案 | 描述 |
---|---|
world | anyone,所有人擁有所有權限(默認) |
ip | 用 IP 地址認證,可以用網段表示範圍。 |
auth | 用“用戶名:密碼”方式認證 |
digest | 用“用戶名:密碼”+ 摘要 方式認證 |
super | 超級管理員 |
x509 | X.509是密碼學裏公鑰證書的格式標準 |
權限相關命令
命令 | 使用方式 | 描述 |
---|---|---|
getAcl | getAcl [-s] path | 讀取 ACL 權限 |
setAcl | setAcl [-s] [-v version] [-R] path acl | 設置 ACL 權限 |
addauth | addauth scheme auth | 添加認證用戶 |
setAcl
-
-s:設置權限並返回stat
-
-v:對某數據版本進行權限設置版本錯誤,則失敗)
-
-R:遞歸對所有的子節點都設置權限,包括本身
2.方案選擇
2.1 world方案(默認)
getAcl /
#默認爲world方案如下:
'world,'anyone
: cdrwa #任何人都擁有所有權限
設置方式:
# 格式 setAcl <path> world:anyone:<acl>
# cdrwa是權限選項 -> 在上面1.2裏找對應
setAcl /node world:anyone:cdrwa
2.2 IP方案
# 格式setAcl <path> ip:<ip>:<acl>
# ip:可以是具體ip
# 也可以是ip/bit的網段格式,如10.25.0.0/16匹配10.25.*.* (衆所周知。。。)
setAcl /node ip:10.25.205.0/8:cdrwas
# 沒權限的會拋出NoAuthException異常
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /linux
# delete 會刪除成功
delete /node2 #因爲設置DELETE權限僅對下一級子節點有效。不包含此節點
2.3 auth方案
# 添加認證用戶(相當於登錄帳號密碼)
addauth digest <user>:<password>
# 設置能訪問的用戶
setAcl <path> auth:<user>:<password>:<acl>
addauth digest aegon:aegon
setAcl /node auth:aegon:aegon:cdrwa
#已經添加認證用戶,可以直接讀取數據,斷開會話重連需要重新addauth添加認證用戶
2.4 digest方案
/daɪˈdʒest,dɪˈdʒest/ 摘要
# 語法跟auth方案類似,差別是path後面的auth/digest
setAcl <path> digest:<user>:<password>:<acl>
# 密碼是用SHA1和BASE64處理以後的密文,在shell裏面可以這樣計算:
echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64
# 在java中可以這樣
DigestAuthenticationProvider.generateDigest("<user>:<password>");
echo -n aegon:muhua | openssl dgst -binary -sha1 | openssl base64
#密文:9qSHRAbzGLvVdO9dZ6IVRNfY+yk=
setAcl /node digest:aegon:9qSHRAbzGLvVdO9dZ6IVRNfY+yk=:cdrwa
# 認證方式同auth
2.5 super超級用戶方案
2.5.1 首先要確定超級管理員的帳號密碼
假設是 super:man 同2.4的digest方案中一樣的方式獲取hash值
格式:"-Dzookeeper.DigestAuthenticationProvider.superDigest=帳號:密碼"
"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:S4H5m176R1dad6bEBL3wcwJhF44="
2.5.2 然後修改啓動參數就行了
# 打開zkServer.sh找到如下信息,3.5.6在158行
nohup "$JAVA" $ZOO_DATADIR_AUTOCREATE "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" \
"-Dzookeeper.log.file=${ZOO_LOG_FILE}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
-XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p' \
-cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &
# 然後添加一條上面的配置(啓動參數)
nohup "$JAVA" $ZOO_DATADIR_AUTOCREATE "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" \
"-Dzookeeper.log.file=${ZOO_LOG_FILE}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:S4H5m176R1dad6bEBL3wcwJhF44=" \
-XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p' \
-cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &
# addauth digest super:man 這樣子添加認證權限就行了