zookeeper的acl权限控制
zookeeper的ACL简介
zookeeper类似文件系统,client可以创建节点,更新节点,删除节点,那么如何做到节点的权限的控制呢?
zookeeper的Access Control List(访问控制列表,简称ACL)可以做到这一点。
zookeeper的ACL权限控制使用"scheme🆔permission"来标识,主要涵盖如下三个方面:
- 权限模式(scheme): 指的是授权的策略。
- 授权的对象(id): 指的是授权的对象。
- 权限(permission): 指的是授权的权限。
zookeeper的ACL的特点如下:
- zookeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限;
- 每个znode支持设置多种权限控制方案和多个权限;
- 子节点不会继承父节点的权限,也就是说,客户端无权访问某个znode,并不代表无法访问它的子节点;
例如:
setAcl /zqf ip:172.200.1.103:crwda
# 将节点权限设置为IP:172.200.1.103的客户端可以对节点进行增,删,改,查,管理权限。
权限模式(scheme)
所谓的权限模式指的是采用何种方式授权。
zookeeper支持以下几种权限模式:
- world: 只有一个用户,即"anyone",代表登录zookeeper的所有人,这也是默认的权限模式。
- ip: 对客户端使用IP地址认证。
- auth: 使用已添加认证的用户认证。
- digest: 使用"用户名:密码"方式进行认证。
授权的对象(id)
所谓的授权对象指的是给谁授予权限。授权对象ID是指权限赋予的实体,例如: IP地址或用户。
权限(permission)
zookeeper支持以下几种权限:
- create(简写"c"): 表示可以创建子节点。
- delete(简称"d"): 可以删除子节点。
- read(简称"r"): 可以读取节点数据及显示子节点列表。
- write(简称"w"): 可以修改节点数据。
- admin(简称"a"): 可以设置节点访问控制列表权限。
授权的相关命令
- getAcl: 读取ACL权限,使用语法:"getAcl [-s] path"。
- setAcl: 设置ACL权限,使用语法:"setAcl [-s] [-v version] [-R] path acl"。
- addauth: 添加认证用户,使用语法:"addauth scheme auth"。
world授权模式实战案例
创建测试数据
[zk: 100.100.137.75:2181(CONNECTED) 2] create /hadoop "Hadoop"
Created /hadoop
[zk: 100.100.137.75:2181(CONNECTED) 4] create /hadoop/hdfs "HDFS"
Created /hadoop/hdfs
[zk: 100.100.137.75:2181(CONNECTED) 5] create /hadoop/yarn "YARN"
Created /hadoop/yarn
[zk: 100.100.137.75:2181(CONNECTED) 6] create /hadoop/mapreduce "MapReduce"
Created /hadoop/mapreduce
[zk: 100.100.137.75:2181(CONNECTED) 7] ls -R /hadoop
/hadoop
/hadoop/hdfs
/hadoop/mapreduce
/hadoop/yarn
使用"setAcl"指令移除"create"(简称"c")权限
[zk: 100.100.137.75:2181(CONNECTED) 14] getAcl /hadoop
'world,'anyone
: cdrwa
[zk: 100.100.137.75:2181(CONNECTED) 15] setAcl /hadoop world:anyone:drwa
[zk: 100.100.137.75:2181(CONNECTED) 16] getAcl /hadoop
'world,'anyone
: drwa
[zk: 100.100.137.75:2181(CONNECTED) 17] ls /hadoop
[hdfs, mapreduce, yarn]
[zk: 100.100.137.75:2181(CONNECTED) 18] create /hadoop/hive "Hive" # 很明显,此处我们没法创建子znode
Insufficient permission : /hadoop/hive
使用"setAcl"指令移除"delete"(简称"d")权限
[zk: 100.100.137.75:2181(CONNECTED) 19] ls /hadoop
[hdfs, mapreduce, yarn]
[zk: 100.100.137.75:2181(CONNECTED) 20] getAcl /hadoop
'world,'anyone
: drwa
[zk: 100.100.137.75:2181(CONNECTED) 21] setAcl /hadoop world:anyone:rwa
[zk: 100.100.137.75:2181(CONNECTED) 22] getAcl /hadoop
'world,'anyone
: rwa
[zk: 100.100.137.75:2181(CONNECTED) 23] delete /hadoop/hdfs #很明显,我们无法删除子znode
Insufficient permission : /hadoop/hdfs
使用"setAcl"指令移除"read"(简称"r")权限
[zk: 100.100.137.75:2181(CONNECTED) 24] getAcl /hadoop
'world,'anyone
: rwa
[zk: 100.100.137.75:2181(CONNECTED) 25] get /hadoop
Hadoop
[zk: 100.100.137.75:2181(CONNECTED) 26] setAcl /hadoop world:anyone:wa
[zk: 100.100.137.75:2181(CONNECTED) 27] get /hadoop # 很明显,我们无法读取znode的数据
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /hadoop
使用"setAcl"指令移除"write"(简称"w")权限
[zk: 100.100.137.75:2181(CONNECTED) 29] getAcl /hadoop
'world,'anyone
: wa
[zk: 100.100.137.75:2181(CONNECTED) 30] set /hadoop "Hadoop2021" #注意哈,在移除当前znode的w权限之前,我们是可以修改该znode的数据
[zk: 100.100.137.75:2181(CONNECTED) 31] setAcl /hadoop world:anyone:a
[zk: 100.100.137.75:2181(CONNECTED) 32] getAcl /hadoop
'world,'anyone
: a
[zk: 100.100.137.75:2181(CONNECTED) 33] set /hadoop "Hadoop" #由于我们移除了"w"权限,因此无法修改znode的数据
Insufficient permission : /hadoop
使用"setAcl"指令移除"admin"(简称"a")权限
(生产环境中要慎用,一旦znode被移除了"a"权限,则我们将无法为其重新分配任何权限!)
[zk: 100.100.137.75:2181(CONNECTED) 34] getAcl /hadoop # 在移除管理权限之前,我们是可以获取znode的权限信息的!
'world,'anyone
: a
[zk: 100.100.137.75:2181(CONNECTED) 35] setAcl /hadoop world:anyone: # 当我们移除了"a"权限后,既无法查看znode的权限,也无法为znode重新分配权限!
[zk: 100.100.137.75:2181(CONNECTED) 36] getAcl /hadoop
Insufficient permission : /hadoop
[zk: 100.100.137.75:2181(CONNECTED) 37] setAcl /hadoop world:anyone:cdrwa # 我们无法为znode重新分配权限了,因为该"znode"并没有"a"权限!
Insufficient permission : /hadoop
当znode被移除"admin"(简称"a")权限,若想要重新分配权限解决方案
# 如果是集群模式则所有节点都要修改
# 1. 修改zookeeper服务的配置文件,添加如下两行
vim /usr/local/zookeeper/conf/zoo.cfg
# add by yinzhengjie for ACL
skipACL=yes
# 2. 重启zookeeper服务
zkServer.sh restart
zkServer.sh status
# 3. 重新分配权限
[zk: 100.100.137.75:2181(CONNECTED) 5] ls /
[hadoop, zookeeper]
[zk: 100.100.137.75:2181(CONNECTED) 6] get /hadoop
Hadoop2021
[zk: 100.100.137.75:2181(CONNECTED) 7] getAcl /hadoop #由于我们启动zookeeper跳过了权限认证,因此此处是可以查看znode的权限
'world,'anyone
:
[zk: 100.100.137.75:2181(CONNECTED) 8] setAcl /hadoop world:anyone:cdrwa # 既然跳过了权限认证,那自然我们就可以为当前的znode重新分配权限了
[zk: 100.100.137.75:2181(CONNECTED) 9] getAcl /hadoop #当前的znode又重新恢复到所有权限了
'world,'anyone
: cdrwa
# 当重新分配权限后,记得再次重启服务,否则当前zookeeper集群始终会跳过权限认证。
ip授权模式实战案例
设置zookeeper服务的监听地址
# 如果是集群模式则所有节点都需要修改
# 1. 修改zookeeper监听的IP地址
vim /usr/local/zookeeper/conf/zoo.cfg
clientPortAddress=100.100.137.75
# 2. 重启zookeeper服务
zkServer.sh restart
zkServer.sh status
设置仅"172.200.1.102"这个节点来访问zookeeper的某个znode
# 1. 在"172.200.1.101"节点设置"/hadoop"的znode仅对"172.200.1.102"这个IP地址有"cdrwa"权限。
ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
172.200.1.101
zkCli.sh -server 172.200.1.101 # 基于zookeeper服务监听的IP地址进行登录!
...
[zk: localhost:2181(CONNECTED) 3] getAcl /hadoop
'world,'anyone
: cdrwa
[zk: localhost:2181(CONNECTED) 4]
[zk: localhost:2181(CONNECTED) 4] setAcl /hadoop ip:172.200.1.102:cdrwa # 注意哈,授权的对象是给"172.200.1.102"这个IP地址的哟~
[zk: localhost:2181(CONNECTED) 5]
[zk: localhost:2181(CONNECTED) 5] getAcl /hadoop # Duang~很明显,权限是立即生效的!当前节点无权限访问
Insufficient permission : /hadoop
[zk: localhost:2181(CONNECTED) 6]
[zk: 172.200.1.101(CONNECTED) 6] ls /hadoop
Insufficient permission : /hadoop
[zk: 172.200.1.101(CONNECTED) 7]
# 2. 在"172.200.1.102"这个节点来连接zookeeper服务端(该节点需要安装zookeeper的环境,但可以不启用zookeeper服务,因为其要使用到"zkCli.sh"工具来连接zookeeper服务端哟~)
ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
172.200.1.102
zkCli.sh -server 172.200.1.101 # 基于zookeeper服务监听的IP地址进行登录!
...
[zk: 172.200.1.101(CONNECTED) 5] ls /
[hadoop, k8s0000000001, oldboy, zookeeper]
[zk: 172.200.1.101(CONNECTED) 6]
[zk: 172.200.1.101(CONNECTED) 6] ls /hadoop
[hdfs, mapreduce, yarn]
[zk: 172.200.1.101(CONNECTED) 7]
[zk: 172.200.1.101(CONNECTED) 7] getAcl /hadoop # 当前节点是可以查看当前znode的权限,并且可以对该节点进行相应的"cdrwa"权限哟~
'ip,'172.200.1.102
: cdrwa
[zk: 172.200.1.101(CONNECTED) 8]
[zk: 172.200.1.101(CONNECTED) 8] ls /hadoop
[hdfs, mapreduce, yarn]
[zk: 172.200.1.101(CONNECTED) 9]
[zk: 172.200.1.101(CONNECTED) 9] get /hadoop/hdfs
HDFS
[zk: 172.200.1.101(CONNECTED) 10]
设置仅"172.200.1.101"和"172.200.1.102"这两个节点来访问zookeeper的某个znode
# 1. 在"172.200.1.102"这个节点来连接zookeeper服务端
zkCli.sh -server 172.200.1.101 # 基于zookeeper服务监听的IP地址进行登录!
...
[zk: 172.200.1.101(CONNECTED) 11] getAcl /hadoop # 注意观察修改之前的权限信息
'ip,'172.200.1.102
: cdrwa
[zk: 172.200.1.101(CONNECTED) 12]
[zk: 172.200.1.101(CONNECTED) 12] setAcl /hadoop ip:172.200.1.102:cdrwa,ip:172.200.1.101:cdr
[zk: 172.200.1.101(CONNECTED) 13]
[zk: 172.200.1.101(CONNECTED) 13] getAcl /hadoop # 注意观察修改后的权限信息
'ip,'172.200.1.102
: cdrwa
'ip,'172.200.1.101
: cdr
[zk: 172.200.1.101(CONNECTED) 14]
# 2. 在"172.200.1.101"节点设置"/hadoop"的znode仅对"172.200.1.102"这个IP地址有"cdrwa"权限。
ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
zkCli.sh -server 172.200.1.101 # 基于zookeeper服务监听的IP地址进行登录!
...
[zk: 172.200.1.101(CONNECTED) 5] getAcl /hadoop # 在此之前,当前的会话是无法对zookeeper进行访问的!
Insufficient permission : /hadoop
[zk: 172.200.1.101(CONNECTED) 6]
[zk: 172.200.1.101(CONNECTED) 6] ls /hadoop
Insufficient permission : /hadoop
[zk: 172.200.1.101(CONNECTED) 7]
[zk: 172.200.1.101(CONNECTED) 7]
[zk: 172.200.1.101(CONNECTED) 7] ls /hadoop # 当我们修改权限后,当前的节点立即就有权限访问啦~
[hdfs, mapreduce, yarn]
[zk: 172.200.1.101(CONNECTED) 8]
[zk: 172.200.1.101(CONNECTED) 8] getAcl /hadoop
'ip,'172.200.1.102
: cdrwa
'ip,'172.200.1.101
: cdr
[zk: 172.200.1.101(CONNECTED) 9]
[zk: 172.200.1.101(CONNECTED) 9] create /hadoop/hive "Hive" # Duang~我们是有"c"权限的,说明可以创建子节点。
Created /hadoop/hive
[zk: 172.200.1.101(CONNECTED) 10]
[zk: 172.200.1.101(CONNECTED) 10] ls /hadoop
[hdfs, hive, mapreduce, yarn]
[zk: 172.200.1.101(CONNECTED) 11]
[zk: 172.200.1.101(CONNECTED) 11] delete /hadoop/hive # Duang~我们有"d"权限的,说明可以删除子节点。
[zk: 172.200.1.101(CONNECTED) 12]
[zk: 172.200.1.101(CONNECTED) 12] ls /hadoop
[hdfs, mapreduce, yarn]
[zk: 172.200.1.101(CONNECTED) 13]
[zk: 172.200.1.101(CONNECTED) 13] get /hadoop
Hadoop2021
[zk: 172.200.1.101(CONNECTED) 14]
[zk: 172.200.1.101(CONNECTED) 14] set /hadoop "HADOOP" # Duang~可惜呀,我们没有"w"权限,因此无法对当前节点进行修改哟~
Insufficient permission : /hadoop
[zk: 172.200.1.101(CONNECTED) 15]
[zk: 172.200.1.101(CONNECTED) 15] get /hadoop/hdfs # 但是我们可以修改子节点的数据,因为子节点我们是有"w"权限的!
HDFS
[zk: 172.200.1.101(CONNECTED) 16]
[zk: 172.200.1.101(CONNECTED) 16] set /hadoop/hdfs "HDFS2021"
[zk: 172.200.1.101(CONNECTED) 17]
[zk: 172.200.1.101(CONNECTED) 17] get /hadoop/hdfs
HDFS2021
[zk: 172.200.1.101(CONNECTED) 18]
[zk: 172.200.1.101(CONNECTED) 18] getAcl /hadoop/hdfs
'world,'anyone
: cdrwa
[zk: 172.200.1.101(CONNECTED) 19]
设置仅"192.168.1.0/24"网段可以来访问zookeeper的某个znode
zkCli.sh -server 172.200.1.101 # 基于zookeeper服务监听的IP地址进行登录!
...
[zk: 172.200.1.101(CONNECTED) 20] getAcl /hadoop
'ip,'172.200.1.102
: cdrwa
'ip,'172.200.1.101
: cdr
[zk: 172.200.1.101(CONNECTED) 21]
[zk: 172.200.1.101(CONNECTED) 21] setAcl /hadoop ip:172.200.1.102:cdrwa,ip:172.200.1.101:cdr,ip:192.168.1.0/24:r # 我们可以设置多个IP地址对某个znode有访问权限
[zk: 172.200.1.101(CONNECTED) 22]
[zk: 172.200.1.101(CONNECTED) 22] getAcl /hadoop
'ip,'172.200.1.102
: cdrwa
'ip,'172.200.1.101
: cdr
'ip,'192.168.1.0/24
: r
[zk: 172.200.1.101(CONNECTED) 23]
[zk: 172.200.1.101(CONNECTED) 23] setAcl /hadoop ip:192.168.1.0/24:r # 注意哈,当我们修改权限仅允许某个网段来访问当前"znode",因此无法获取相应的信息哟~
[zk: 172.200.1.101(CONNECTED) 24]
[zk: 172.200.1.101(CONNECTED) 24] getAcl /hadoop
Insufficient permission : /hadoop
[zk: 172.200.1.101(CONNECTED) 25]
[zk: 172.200.1.101(CONNECTED) 25] ls /hadoop
Insufficient permission : /hadoop
[zk: 172.200.1.101(CONNECTED) 26]
[zk: 172.200.1.101(CONNECTED) 26] ls /
[hadoop, k8s0000000001, oldboy, zookeeper]
[zk: 172.200.1.101(CONNECTED) 27]
auth授权模式实战案例
# 1. 在"172.200.1.101"节点设置"/hadoop"的znode仅对"172.200.1.102"这个IP地址有"cdrwa"权限。
ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
172.200.1.101
zkCli.sh -server 172.200.1.101 # 基于zookeeper服务监听的IP地址进行登录!
...
[zk: 172.200.1.101(CONNECTED) 38] getAcl /oldboy
'world,'anyone
: cdrwa
[zk: 172.200.1.101(CONNECTED) 39]
[zk: 172.200.1.101(CONNECTED) 39] addauth digest jason:oldboyedu # 添加认证用户。
[zk: 172.200.1.101(CONNECTED) 40]
[zk: 172.200.1.101(CONNECTED) 40] setAcl /oldboy auth:jason:cdrwa # 为当前已添加的认证用户设置相应的权限。
[zk: 172.200.1.101(CONNECTED) 41]
[zk: 172.200.1.101(CONNECTED) 41] getAcl /oldboy
'digest,'jason:AQxcOjJ8wnIpr7ApxrI/HYYK/aM=
: cdrwa
[zk: 172.200.1.101(CONNECTED) 42]
[zk: 172.200.1.101(CONNECTED) 42] ls /oldboy # 注意哈,当前节点是有权限访问的哟~因为上面我们已经使用"addauth"添加过认证啦!
[]
[zk: 172.200.1.101(CONNECTED) 43]
[zk: 172.200.1.101(CONNECTED) 43] get /oldboy
OLDBOY
[zk: 172.200.1.101(CONNECTED) 44]
# 2. 在"172.200.1.102"这个节点来连接zookeeper服务端(该节点需要安装zookeeper的环境,但可以不启用zookeeper服务,因为其要使用到"zkCli.sh"工具来连接zookeeper服务端哟~)
ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
172.200.1.102
zkCli.sh -server 172.200.1.101 # 基于zookeeper服务监听的IP地址进行登录!
...
[zk: 172.200.1.101(CONNECTED) 0] ls /
[hadoop, k8s0000000001, oldboy, zookeeper]
[zk: 172.200.1.101(CONNECTED) 1]
[zk: 172.200.1.101(CONNECTED) 1] ls /oldboy # 由于没有添加认证,因此无法正常访问"/oldboy"这个znode。
Insufficient permission : /oldboy
[zk: 172.200.1.101(CONNECTED) 2]
[zk: 172.200.1.101(CONNECTED) 2] get /oldboy
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /oldboy
[zk: 172.200.1.101(CONNECTED) 3]
[zk: 172.200.1.101(CONNECTED) 3] addauth digest jason:123456 # 我们模拟来添加一个认证信息,用户名为jason,但密码我输入一个错误的密码,会发现无法正常访问znode哟~
[zk: 172.200.1.101(CONNECTED) 4]
[zk: 172.200.1.101(CONNECTED) 4] ls /oldboy
Insufficient permission : /oldboy
[zk: 172.200.1.101(CONNECTED) 5]
[zk: 172.200.1.101(CONNECTED) 5] get /oldboy
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /oldboy
[zk: 172.200.1.101(CONNECTED) 6]
[zk: 172.200.1.101(CONNECTED) 6] addauth digest jason:yinzhengjie # 接下来我们输入一个正确的用户名密码,不难发现数据是可以正常访问的!
[zk: 172.200.1.101(CONNECTED) 7]
[zk: 172.200.1.101(CONNECTED) 7] get /oldboy
OLDBOY
[zk: 172.200.1.101(CONNECTED) 8]
[zk: 172.200.1.101(CONNECTED) 8] ls /oldboy
[]
[zk: 172.200.1.101(CONNECTED) 9]
digest授权模式实战案例
使用sha1加密算法及base64编码来计算一个密码的密文
echo -n admin:oldboyedu | openssl dgst -binary -sha1 | openssl base64
Tmbbt77KcTd1bAgjQaI+GqI0hjM=
添加授权信息
zkCli.sh -server 172.200.1.101 # 基于zookeeper服务监听的IP地址进行登录!
...
[zk: 172.200.1.101(CONNECTED) 2] create /kafka "Kafka"
Created /kafka
[zk: 172.200.1.101(CONNECTED) 3]
[zk: 172.200.1.101(CONNECTED) 3] get /kafka
Kafka
[zk: 172.200.1.101(CONNECTED) 4]
[zk: 172.200.1.101(CONNECTED) 4] getAcl /kafka
'world,'anyone
: cdrwa
[zk: 172.200.1.101(CONNECTED) 5]
[zk: 172.200.1.101(CONNECTED) 5] setAcl /kafka digest:admin:Tmbbt77KcTd1bAgjQaI+GqI0hjM=:cdrwa # 注意哈,设置密码需要使用密文,即我们上面使用sha1进行加密并用base64进行编码的密文哟~
[zk: 172.200.1.101(CONNECTED) 6]
[zk: 172.200.1.101(CONNECTED) 6] getAcl /kafka # 加密后,立即生效,当前若没有提供认证,则无法访问该znode。
Insufficient permission : /kafka
[zk: 172.200.1.101(CONNECTED) 7]
[zk: 172.200.1.101(CONNECTED) 7] get /kafka
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /kafka
[zk: 172.200.1.101(CONNECTED) 8]
[zk: 172.200.1.101(CONNECTED) 8]
[zk: 172.200.1.101(CONNECTED) 8] addauth digest admin:oldboyedu # 添加认证信息的时候,密码要使用明文哟~
[zk: 172.200.1.101(CONNECTED) 9]
[zk: 172.200.1.101(CONNECTED) 9] get /kafka # 当密码添加成功后,就可以正常访问啦~
Kafka
[zk: 172.200.1.101(CONNECTED) 10]
[zk: 172.200.1.101(CONNECTED) 10] getAcl /kafka
'digest,'jason:AQxcOjJ8wnIpr7ApxrI/HYYK/aM=
: cdrwa
[zk: 172.200.1.101(CONNECTED) 11]
多种授权模式实战案例
# 1. 在"172.200.1.101"节点设置"/hadoop"的znode仅对"172.200.1.102"这个IP地址有"cdrwa"权限。
ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
172.200.1.101
zkCli.sh -server 172.200.1.101
...
[zk: 172.200.1.101(CONNECTED) 17] create /hive "Hive"
Created /hive
[zk: 172.200.1.101(CONNECTED) 18]
[zk: 172.200.1.101(CONNECTED) 18] getAcl /hive
'world,'anyone
: cdrwa
[zk: 172.200.1.101(CONNECTED) 19]
[zk: 172.200.1.101(CONNECTED) 19] addauth digest jason:yinzhengjie
[zk: 172.200.1.101(CONNECTED) 20]
[zk: 172.200.1.101(CONNECTED) 20] setAcl /hive ip:172.200.1.102:cdr,auth:jason:rwa,digest:jason:AQxcOjJ8wnIpr7ApxrI/HYYK/aM=:cdrwa
[zk: 172.200.1.101(CONNECTED) 21]
[zk: 172.200.1.101(CONNECTED) 21] getAcl /hive
'ip,'172.200.1.102
: cdr
'digest,'jason:AQxcOjJ8wnIpr7ApxrI/HYYK/aM=
: rwa
'digest,'jason:MJ0KzmL5kgrbPl02S/uK+CJo634=
: rwa
'digest,'jason:AQxcOjJ8wnIpr7ApxrI/HYYK/aM=
: cdrwa
[zk: 172.200.1.101(CONNECTED) 22]
# 2. 在"172.200.1.102"这个节点来连接zookeeper服务端
略,验证步骤参考之前的案例即可。
1. 获取sha1加密的密码
echo -n admin:oldboyedu | openssl dgst -binary -sha1 | openssl base64
Tmbbt77KcTd1bAgjQaI+GqI0hjM=
2. 添加认证
addauth digest jason:oldboyedu
addauth digest root:oldboyedu
3. 配置权限
create /linux
setAcl /linux ip:10.0.0.0/24:cdr,auth:jason:rwa,digest:root:FoNgIPgdUI0shcilw0GSsHE6GNM=:cdrwa
ACL超级管理员
使用sha1加密算法及base64编码来计算一个密码的密文
zookeeper的权限管理模式有一种叫做"super",该模式提供一个超级管理员可以方便的访问任何权限的节点。假设这个管理用户名和密码是"admin:yinzhengjie",需要先为超管生成密码的密文,操作如下所示:
echo -n admin:oldboyedu | openssl dgst -binary -sha1 | openssl base64
Tmbbt77KcTd1bAgjQaI+GqI0hjM=
修改zookeeper服务端的环境变量,并添加超级用户
1. 修改"zkEnv.sh"配置文件,如下所示(注意哈,下面的以"#"开头的行,是原来的配置,我们要做的是复制改行并添加超级用户)
vim /oldboy/softwares/zookeeper/bin/zkEnv.sh
...
# export SERVER_JVMFLAGS="-Xmx${ZK_SERVER_HEAP}m $SERVER_JVMFLAGS"
export SERVER_JVMFLAGS="-Dzookeeper.DigestAuthenticationProvider.superDigest=admin:Tmbbt77KcTd1bAgjQaI+GqI0hjM= -Xmx${ZK_SERVER_HEAP}m $SERVER_JVMFLAGS"
...
2. zookeeper集群所有节点重复上述操作。
略,推荐使用同步脚本进行数据的同步。
3. 重启集群,使得配置文件生效。
zkServer.sh restart
编写测试案例
ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
172.200.1.101
zkCli.sh -server 172.200.1.101:2181
...
[zk: 172.200.1.101:2181(CONNECTED) 1] ls /
[hadoop, hive, k8s0000000001, kafka, mysql, oldboy, zookeeper]
[zk: 172.200.1.101:2181(CONNECTED) 2]
[zk: 172.200.1.101:2181(CONNECTED) 2] create /kudu "KUDU DATABASE"
Created /kudu
[zk: 172.200.1.101:2181(CONNECTED) 3]
[zk: 172.200.1.101:2181(CONNECTED) 3] getAcl /kudu
'world,'anyone
: cdrwa
[zk: 172.200.1.101:2181(CONNECTED) 4]
[zk: 172.200.1.101:2181(CONNECTED) 4] setAcl /kudu ip:172.200.1.102:cdrwa
[zk: 172.200.1.101:2181(CONNECTED) 5]
[zk: 172.200.1.101:2181(CONNECTED) 5] getAcl /kudu
Insufficient permission : /kudu
[zk: 172.200.1.101:2181(CONNECTED) 6]
[zk: 172.200.1.101:2181(CONNECTED) 6] addauth digest admin:yinzhengjie # 直接使用超级用户登录,发现所有znode咱们都可以处理,有点类似于Linux的root用户,有点霸道!
[zk: 172.200.1.101:2181(CONNECTED) 7]
[zk: 172.200.1.101:2181(CONNECTED) 7] getAcl /kudu
'ip,'172.200.1.102
: cdrwa
[zk: 172.200.1.101:2181(CONNECTED) 8]
[zk: 172.200.1.101:2181(CONNECTED) 8] get /kudu
KUDU DATABASE
[zk: 172.200.1.101:2181(CONNECTED) 0]