zookeeper權限管理的6種方案的5種...

1. 權限控制ACL(Access Control List)

##1.1 權限特性

  1. ZooKeeper 的權限控制是基於每個 znode 節點的,需要對每個節點設置權限
  2. 每個 znode 支持設置多種權限控制方案和多個權限
  3. 子節點不會繼承父節點的權限,客戶端無權訪問某節點,但可能可以訪問它的子節點

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 這樣子添加認證權限就行了
發佈了16 篇原創文章 · 獲贊 28 · 訪問量 2916
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章