zookeeper的acl权限控制

zookeeper的ACL简介

zookeeper类似文件系统,client可以创建节点,更新节点,删除节点,那么如何做到节点的权限的控制呢?
zookeeper的Access Control List(访问控制列表,简称ACL)可以做到这一点。
zookeeper的ACL权限控制使用"scheme🆔permission"来标识,主要涵盖如下三个方面:

  1. 权限模式(scheme): 指的是授权的策略。
  2. 授权的对象(id): 指的是授权的对象。
  3. 权限(permission): 指的是授权的权限。

zookeeper的ACL的特点如下:

  1. zookeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限;
  2. 每个znode支持设置多种权限控制方案和多个权限;
  3. 子节点不会继承父节点的权限,也就是说,客户端无权访问某个znode,并不代表无法访问它的子节点;
    例如:
setAcl /zqf ip:172.200.1.103:crwda
# 将节点权限设置为IP:172.200.1.103的客户端可以对节点进行增,删,改,查,管理权限。

权限模式(scheme)

所谓的权限模式指的是采用何种方式授权。
zookeeper支持以下几种权限模式:

  1. world: 只有一个用户,即"anyone",代表登录zookeeper的所有人,这也是默认的权限模式。
  2. ip: 对客户端使用IP地址认证。
  3. auth: 使用已添加认证的用户认证。
  4. digest: 使用"用户名:密码"方式进行认证。

授权的对象(id)

所谓的授权对象指的是给谁授予权限。授权对象ID是指权限赋予的实体,例如: IP地址或用户。

权限(permission)

zookeeper支持以下几种权限:

  1. create(简写"c"): 表示可以创建子节点。
  2. delete(简称"d"): 可以删除子节点。
  3. read(简称"r"): 可以读取节点数据及显示子节点列表。
  4. write(简称"w"): 可以修改节点数据。
  5. admin(简称"a"): 可以设置节点访问控制列表权限。

授权的相关命令

  1. getAcl: 读取ACL权限,使用语法:"getAcl [-s] path"。
  2. setAcl: 设置ACL权限,使用语法:"setAcl [-s] [-v version] [-R] path acl"。
  3. 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]
posted @ 2025-08-03 23:01  阿峰博客站  阅读(19)  评论(0)    收藏  举报