1. 程式人生 > >zookeeper權限acl與四字命令

zookeeper權限acl與四字命令

zookeeper 分布式 集群 四字命令 acl權限

權限acl介紹,acl的構成與id

acl是Access control lists 的縮寫,也就是權限控制列表:

  • 針對節點可以設置相關讀寫等權限,目的是為了保障數據安全性
  • 權限permissions可以指定不同的權限範圍以及角色

acl的構成:

  • zk的acl通過 [scheme:id:permissions] 來構成權限列表:
    • scheme:代表采用的某種權限機制
    • id:代表允許訪問的用戶
    • permissions:權限組合字符串

acl的構成-scheme,scheme有以下幾種類型:

  • world:world下只有一個id,即只有一個用戶,也就是anyone,那麽組合的寫法就是 world:anyone:[permissions]
  • ip:當設置為ip指定的ip地址,此時限制ip進行訪問,比如ip:192.168.77.130:[permissions]
  • auth:代表認證登錄,需要註冊用戶獲取權限後才可以登錄訪問,形式為 auth:userpassword:[permissions]
  • digest:需要對密碼加密才能訪問,組合形式為:digest:username:BASE64(SHA1(password)):[permissions]
    • auth與digest的區別就是,前者使用明文密碼進行登錄,後者使用密文密碼進行登錄。setAcl /path auth:lee:lee:cdrwa 與 setAcl /path digest:lee:BASE64(SHA1(password)):cdrwa是等價的,在通過 addauth digest lee:lee 後都能操作指定節點的權限。在實際情況中,digest要更為常用一些。
  • super:代表超級管理員,擁有所有的權限

acl的構成-permissions:

  • 權限字符串縮寫 crdwa :
    • CREATE:創建子節點權限
    • READ:訪問節點/子節點權限
    • WRITE:設置節點數據權限
    • DELETE:刪除子節點權限
    • ADMIN:管理員權限

acl命令:

  • getAcl 獲取某個節點的acl權限信息
  • setAcl 設置某個節點的acl權限信息
  • addauth 輸入認證授權信息,註冊時輸入明文密碼(登錄),但是在zk的系統裏,密碼是以加密後的形式存在的

acl命令行world

使用 getAcl 命令獲取某個節點的acl權限信息,示例:

[root@study-01 ~]# zkCli.sh
[zk: localhost:2181(CONNECTED) 5] create /testDir/testAcl test-data  # 創建一個子節點
Created /testDir/testAcl
[zk: localhost:2181(CONNECTED) 6] getAcl /testDir/testAcl  # 獲取該節點的acl權限信息
‘world,‘anyone  # 默認為world
: cdrwa
[zk: localhost:2181(CONNECTED) 7]

使用 setAcl 命令設置某個節點的acl權限信息,示例:

[zk: localhost:2181(CONNECTED) 7] setAcl /testDir/testAcl world:anyone:crwa  # 設置該節點的acl權限
cZxid = 0x26
ctime = Mon Apr 23 17:28:30 CST 2018
mZxid = 0x26
mtime = Mon Apr 23 17:28:30 CST 2018
pZxid = 0x26
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 9
numChildren = 0
[zk: localhost:2181(CONNECTED) 8] getAcl /testDir/testAcl                  
‘world,‘anyone
: crwa   # 設置成功後,該節點就少了d權限
[zk: localhost:2181(CONNECTED) 9] create /testDir/testAcl/xyz xyz-data  # 創建子節點
Created /testDir/testAcl/xyz
[zk: localhost:2181(CONNECTED) 10] delete /testDir/testAcl/xyz  # 刪除該子節點
Authentication is not valid : /testDir/testAcl/xyz  # 由於沒有d權限,所以提示無法刪除
[zk: localhost:2181(CONNECTED) 11]

設置其他的權限也是如此,在此就不做演示了。


acl命令行auth

使用auth來設置權限的時候,需要在zk裏註冊一個用戶才可以。示例:

[zk: localhost:2181(CONNECTED) 11] addauth digest user1:123456   # 需要先添加一個用戶
[zk: localhost:2181(CONNECTED) 12] setAcl /testDir/testAcl auth:user1:123456:crwa  # 然後才可以拿著這個用戶去設置權限
cZxid = 0x26
ctime = Mon Apr 23 17:28:30 CST 2018
mZxid = 0x26
mtime = Mon Apr 23 17:28:30 CST 2018
pZxid = 0x28
cversion = 1
dataVersion = 0
aclVersion = 2
ephemeralOwner = 0x0
dataLength = 9
numChildren = 1
[zk: localhost:2181(CONNECTED) 14] getAcl /testDir/testAcl
‘digest,‘user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=  # 密碼是以密文的形式存儲的
: crwa
[zk: localhost:2181(CONNECTED) 15] 

如果設置了權限後,再次進行設置,就可以不用加上用戶名和密碼了。而且就算是使用其他用戶進行設置,也只會根據第一次設置的用戶來進行配置:

[zk: localhost:2181(CONNECTED) 16] setAcl /testDir/testAcl auth::crw
[zk: localhost:2181(CONNECTED) 16] setAcl /testDir/testAcl auth:test:test:crw
[zk: localhost:2181(CONNECTED) 14] getAcl /testDir/testAcl
‘digest,‘user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=  # 依舊是第一次設置的用戶
: crwa
[zk: localhost:2181(CONNECTED) 15] 

acl命令行digest

由於之前使用auth做實驗的時候已經登錄了用戶 ,所以在使用digest做實驗前,需要先退出一下客戶端,再重新連接,這樣之前登錄的用戶就會自動退出。退出用戶後才能使用digest設置權限,示例:

[zk: localhost:2181(CONNECTED) 5] create /names/testDigest digest-data  # 創建子節點
Created /names/testDigest
[zk: localhost:2181(CONNECTED) 6] addauth digest user1:123456  # 添加用戶
[zk: localhost:2181(CONNECTED) 8] getAcl /names/testDigest 
‘world,‘anyone
: cdrwa
[zk: localhost:2181(CONNECTED) 3] setAcl /names/testDigest digest:user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=:crwa   # 使用digest來設置權限
cZxid = 0x3a
ctime = Mon Apr 23 20:40:11 CST 2018
mZxid = 0x3a
mtime = Mon Apr 23 20:40:11 CST 2018
pZxid = 0x3a
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 11
numChildren = 0
[zk: localhost:2181(CONNECTED) 11] getAcl /names/testDigest
‘digest,‘user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=
: crwa
[zk: localhost:2181(CONNECTED) 12] 

可以看到,digest和auth除了一個使用明文一個使用密文之外,其他都是一致的,所以它倆的區別就只是密文和明文的區別。在線上環境中,一般使用digest比較多,因為密文安全一些。


acl命令行ip

這種方式和限制ip是一樣的,就是設置只允許某一個ip有權限操作。示例:

[zk: localhost:2181(CONNECTED) 1] create /names/testip ip-data   創建子節點
Created /names/testip
[zk: localhost:2181(CONNECTED) 2] getAcl /names/testip
‘world,‘anyone
: cdrwa
[zk: localhost:2181(CONNECTED) 4] setAcl /names/testip ip:192.168.190.129:cdrwa  # 使用ip來設置權限
cZxid = 0x46
ctime = Mon Apr 23 20:55:43 CST 2018
mZxid = 0x46
mtime = Mon Apr 23 20:55:43 CST 2018
pZxid = 0x46
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
[zk: localhost:2181(CONNECTED) 5] getAcl /names/testip
‘ip,‘192.168.190.129   # 只允許這個ip擁有該節點的cdrwa權限
: cdrwa
[zk: localhost:2181(CONNECTED) 6] get /names/testip
ip-data
cZxid = 0x46
ctime = Mon Apr 23 20:55:43 CST 2018
mZxid = 0x46
mtime = Mon Apr 23 20:55:43 CST 2018
pZxid = 0x46
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
[zk: localhost:2181(CONNECTED) 6] 

acl命令行super超級管理員

基本所有的系統都會擁有一個超級管理員用戶,zk也不例外。當我們給一些節點設置了權限,但是卻發現設置錯誤了,導致節點無法正常訪問,那麽這時候普通用戶是無法解決這種問題的,只能使用超級管理員用戶來重新設置權限或刪除節點。所以本節簡單演示一下,如何配置管理員用戶:

1.修改 zkServer.sh 增加super管理員:

[root@study-01 ~]# cd /usr/local/zookeeper-3.4.11/bin/
[root@study-01 /usr/local/zookeeper-3.4.11/bin]# vim zkServer.sh  # 找到nohup那一行,加入以下內容
"-Dzookeeper.DigestAuthenticationProvider.superDigest=user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s="
[root@study-01 /usr/local/zookeeper-3.4.11/bin]# 

註:user1是用戶名,後面那一大串是加密後的密文密碼

如下圖:
技術分享圖片

2.修改完之後,需要重啟zookeeper服務才能生效 :

[root@study-01 /usr/local/zookeeper-3.4.11/bin]# ./zkServer.sh restart

使用超級管理員用戶:

[root@study-01 ~]# zkCli.sh
[zk: localhost:2181(CONNECTED) 9] ls /names/ip  # ls一個無權限的節點
Authentication is not valid : /names/ip   # 可以看到,權限不夠
[zk: localhost:2181(CONNECTED) 10] addauth digest user1:123456  # 登錄超級管理員用戶,這裏登錄用的是明文密碼
[zk: localhost:2181(CONNECTED) 11] ls /names/ip  # 然後再次ls
[]   # 這次就可以ls到了
[zk: localhost:2181(CONNECTED) 12] get /names/ip   # 也可以get信息
ip-data
cZxid = 0x51
ctime = Mon Apr 23 21:02:42 CST 2018
mZxid = 0x51
mtime = Mon Apr 23 21:02:42 CST 2018
pZxid = 0x51
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
[zk: localhost:2181(CONNECTED) 13] delete /names/testip  # 刪除節點也可以
[zk: localhost:2181(CONNECTED) 14] 

acl的常用使用場景

  1. 開發/測試環境分離,開發者無權操作測試庫的節點,只能讀取
  2. 生產環境上控制指定ip的服務可以訪問相關的節點,防止混亂

zk四字命令

zk四字命令 Four Letter Words:

  • zk可以通過它自身提供的簡寫命令來和服務器進行交互
  • 需要使用到nc命令,安裝命令:yum install nc
  • 命令格式:echo [commond] | nc [ip] [port]

官方文檔地址如下:

http://zookeeper.apache.org/doc/r3.4.11/zookeeperAdmin.html#sc_zkCommands

簡單介紹一些常用的zk四字命令:

1.[stat] 查看zk的狀態信息,以及是否mode。示例:

[root@study-01 ~]# echo stat |nc 192.168.190.129 2181
Zookeeper version: 3.4.11-37e277162d567b55a07d1755f0b31c32e93c01a0, built on 11/01/2017 18:06 GMT
Clients:
 /192.168.190.129:34268[0](queued=0,recved=1,sent=0)

Latency min/avg/max: 0/0/4
Received: 117
Sent: 116
Connections: 1
Outstanding: 0
Zxid: 0x58
Mode: standalone
Node count: 16
[root@study-01 ~]# 

2.[ruok] 查看當前zkserver是否啟動,已啟動的話就會返回imok。示例:

[root@study-01 ~]# echo ruok |nc 192.168.190.129 2181
imok
[root@study-01 ~]#

3.[dump] 列出未經處理的會話和臨時節點。示例:

[root@study-01 ~]# echo dump |nc 192.168.190.129 2181
SessionTracker dump:
Session Sets (0):
ephemeral nodes dump:
Sessions with Ephemerals (0):
[root@study-01 ~]# 

4.[conf] 查看服務器配置。示例:

[root@study-01 ~]# echo conf |nc 192.168.190.129 2181
clientPort=2181
dataDir=/usr/local/zookeeper-3.4.11/dataDir/version-2
dataLogDir=/usr/local/zookeeper-3.4.11/dataLogDir/version-2
tickTime=2000
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
serverId=0
[root@study-01 ~]# 

5.[cons] 展示連接到服務器的客戶端信息。示例:

[root@study-01 ~]# echo cons |nc 192.168.190.129 2181
 /127.0.0.1:41152[1](queued=0,recved=2,sent=2,sid=0x10001004ed60001,lop=PING,est=1524493375316,to=30000,lcxid=0x0,lzxid=0x59,lresp=19999999,llat=0,minlat=0,avglat=1,maxlat=2)
 /192.168.190.129:34277[0](queued=0,recved=1,sent=0)

[root@study-01 ~]# 

6.[envi] 查看環境變量。示例:

[root@study-01 ~]# echo envi |nc 192.168.190.129 2181
Environment:
zookeeper.version=3.4.11-37e277162d567b55a07d1755f0b31c32e93c01a0, built on 11/01/2017 18:06 GMT
host.name=localhost
java.version=1.8.0_161
java.vendor=Oracle Corporation
java.home=/usr/local/jdk1.8/jre
java.class.path=/usr/local/zookeeper-3.4.11/bin/../build/classes:/usr/local/zookeeper-3.4.11/bin/../build/lib/*.jar:/usr/local/zookeeper-3.4.11/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/zookeeper-3.4.11/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper-3.4.11/bin/../lib/netty-3.10.5.Final.jar:/usr/local/zookeeper-3.4.11/bin/../lib/log4j-1.2.16.jar:/usr/local/zookeeper-3.4.11/bin/../lib/jline-0.9.94.jar:/usr/local/zookeeper-3.4.11/bin/../lib/audience-annotations-0.5.0.jar:/usr/local/zookeeper-3.4.11/bin/../zookeeper-3.4.11.jar:/usr/local/zookeeper-3.4.11/bin/../src/java/lib/*.jar:/usr/local/zookeeper-3.4.11/bin/../conf:
java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
java.io.tmpdir=/tmp
java.compiler=<NA>
os.name=Linux
os.arch=amd64
os.version=3.10.0-327.el7.x86_64
user.name=root
user.home=/root
user.dir=/usr/local/zookeeper-3.4.11/bin
[root@study-01 ~]# 

7.[mntr] 監控zk健康信息。示例:

[root@study-01 ~]# echo mntr |nc 192.168.190.129 2181
zk_version  3.4.11-37e277162d567b55a07d1755f0b31c32e93c01a0, built on 11/01/2017 18:06 GMT
zk_avg_latency  0
zk_max_latency  4
zk_min_latency  0
zk_packets_received 169
zk_packets_sent 168
zk_num_alive_connections    2
zk_outstanding_requests 0
zk_server_state standalone
zk_znode_count  16
zk_watch_count  0
zk_ephemerals_count 0
zk_approximate_data_size    305
zk_open_file_descriptor_count   31
zk_max_file_descriptor_count    4096
[root@study-01 ~]# 

8.[wchs] 展示watch的信息。示例:

[root@study-01 ~]# echo wchs |nc 192.168.190.129 2181
1 connections watching 1 paths
Total watches:1
[root@study-01 ~]# 

9.[wchc] 展示session與watch信息。在3.4.10之後的版本中,wchc和wchp不再是白名單列表裏的命令,需要使用這兩個命令的話,得進行一個配置。示例:

[root@study-01 ~]# echo wchc |nc 192.168.190.129 2181
wchc is not executed because it is not in the whitelist.  # 可以看到,提示這是不在白名單列表裏的命令
[root@study-01 ~]# cd /usr/local/zookeeper-3.4.11/conf/
[root@study-01 /usr/local/zookeeper-3.4.11/conf]# vim zoo.cfg   # 在文件末尾添加如下內容
4lw.commands.whitelist=*
[root@study-01 /usr/local/zookeeper-3.4.11/conf]# cd 
[root@study-01 ~]# zkServer.sh restart  # 重啟zk服務
[root@study-01 ~]# echo wchc |nc 192.168.190.129 2181  # 這時就可以使用了
0x10001004ed60001
    /names

[root@study-01 ~]# 

10.[wchp] 展示watch與path信息。示例:

[root@study-01 ~]# echo wchp |nc 192.168.190.129 2181
/names
    0x10001004ed60001

[root@study-01 ~]# 

zookeeper權限acl與四字命令