本文最后更新于 258 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com
zookeeper的acl权限控制实战案例
一.zookeeper的acl权限控制概述
1.zookeeper的ACL简介
zookeeper类似文件系统,client可以创建节点,更新节点,删除节点,那么如何做到节点的权限的控制呢?
zookeeper的Access Control List(访问控制列表,简称ACL)可以做到这一点。
zookeeper的ACL权限控制使用"scheme:id:permission"来标识,主要涵盖如下三个方面:
权限模式(scheme):
指的是授权的策略。
授权的对象(id):
指的是授权的对象。
权限(permission):
指的是授权的权限。
zookeeper的ACL的特点如下:
(1)zookeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限;
(2)每个znode支持设置多种权限控制方案和多个权限;
(3)子节点不会继承父节点的权限,也就是说,客户端无权访问某个znode,并不代表无法访问它的子节点;
例如:
setAcl /oldboy ip:172.200.1.103:crwda
说明如下:
将节点权限设置为IP:172.200.1.103的客户端可以对节点进行增,删,改,查,管理权限。
2.权限模式(scheme)
所谓的权限模式指的是采用何种方式授权。
zookeeper支持以下几种权限模式:
world:
只有一个用户,即"anyone",代表登录zookeeper的所有人,这也是默认的权限模式。
ip:
对客户端使用IP地址认证。
auth:
使用已添加认证的用户认证。
digest:
使用"用户名:密码"方式进行认证。
3.授权的对象(id)
所谓的授权对象指的是给谁授予权限。授权对象ID是指权限赋予的实体,例如: IP地址或用户。
4.权限(permission)
zookeeper支持以下几种权限:
create(简写"c"):
表示可以创建子节点。
delete(简称"d"):
可以删除子节点。
read(简称"r"):
可以读取节点数据及显示子节点列表。
write(简称"w"):
可以修改节点数据。
admin(简称"a"):
可以设置节点访问控制列表权限。
5.授权的相关命令
getAcl:
读取ACL权限,使用语法:"getAcl [-s] path"。
setAcl:
设置ACL权限,使用语法:"setAcl [-s] [-v version] [-R] path acl"。
addauth
添加认证用户,使用语法:"addauth scheme auth"。
二.world授权模式实战案例
1.创建测试数据
[zk: localhost:2181(CONNECTED) 208] ls /
[k8s0000000001, oldboy, zookeeper]
[zk: localhost:2181(CONNECTED) 209]
[zk: localhost:2181(CONNECTED) 209] create /hadoop "Hadoop"
Created /hadoop
[zk: localhost:2181(CONNECTED) 210]
[zk: localhost:2181(CONNECTED) 210] create /hadoop/hdfs "HDFS"
Created /hadoop/hdfs
[zk: localhost:2181(CONNECTED) 211]
[zk: localhost:2181(CONNECTED) 211] create /hadoop/yarn "YARN"
Created /hadoop/yarn
[zk: localhost:2181(CONNECTED) 212]
[zk: localhost:2181(CONNECTED) 212] create /hadoop/mapreduce "MapReduce"
Created /hadoop/mapreduce
[zk: localhost:2181(CONNECTED) 213]
[zk: localhost:2181(CONNECTED) 213] ls -R /hadoop
/hadoop
/hadoop/hdfs
/hadoop/mapreduce
/hadoop/yarn
[zk: localhost:2181(CONNECTED) 214]
2.使用"setAcl"指令移除"create"(简称"c")权限
[zk: localhost:2181(CONNECTED) 214] getAcl /hadoop
'world,'anyone
: cdrwa
[zk: localhost:2181(CONNECTED) 215]
[zk: localhost:2181(CONNECTED) 215] setAcl /hadoop world:anyone:drwa
[zk: localhost:2181(CONNECTED) 216]
[zk: localhost:2181(CONNECTED) 216] getAcl /hadoop
'world,'anyone
: drwa
[zk: localhost:2181(CONNECTED) 217]
[zk: localhost:2181(CONNECTED) 217] ls /hadoop
[hdfs, mapreduce, yarn]
[zk: localhost:2181(CONNECTED) 218]
[zk: localhost:2181(CONNECTED) 218] create /hadoop/hive "Hive" # Duang~很明显,此处我们没法创建子znode啦~
Insufficient permission : /hadoop/hive
[zk: localhost:2181(CONNECTED) 219]
3.使用"setAcl"指令移除"delete"(简称"d")权限
[zk: localhost:2181(CONNECTED) 219] ls /hadoop
[hdfs, mapreduce, yarn]
[zk: localhost:2181(CONNECTED) 220]
[zk: localhost:2181(CONNECTED) 220] getAcl /hadoop
'world,'anyone
: drwa
[zk: localhost:2181(CONNECTED) 221]
[zk: localhost:2181(CONNECTED) 221] setAcl /hadoop world:anyone:rwa
[zk: localhost:2181(CONNECTED) 222]
[zk: localhost:2181(CONNECTED) 222] getAcl /hadoop
'world,'anyone
: rwa
[zk: localhost:2181(CONNECTED) 223]
[zk: localhost:2181(CONNECTED) 223] delete /hadoop/hdfs # Duang~很明显,我们无法删除子znode啦~
Insufficient permission : /hadoop/hdfs
[zk: localhost:2181(CONNECTED) 224]
4.使用"setAcl"指令移除"read"(简称"r")权限
[zk: localhost:2181(CONNECTED) 224] getAcl /hadoop
'world,'anyone
: rwa
[zk: localhost:2181(CONNECTED) 225]
[zk: localhost:2181(CONNECTED) 225] get /hadoop # 注意哈,在移除read权限之前,我们是可以获取到对应znode的数据哟~
Hadoop
[zk: localhost:2181(CONNECTED) 226]
[zk: localhost:2181(CONNECTED) 226] setAcl /hadoop world:anyone:wa
[zk: localhost:2181(CONNECTED) 227]
[zk: localhost:2181(CONNECTED) 227] getAcl /hadoop
'world,'anyone
: wa
[zk: localhost:2181(CONNECTED) 228]
[zk: localhost:2181(CONNECTED) 228] get /hadoop # Duang~很明显,我们无法读取znode的数据啦~
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /hadoop
[zk: localhost:2181(CONNECTED) 229]
5.使用"setAcl"指令移除"write"(简称"w")权限
[zk: localhost:2181(CONNECTED) 235] getAcl /hadoop
'world,'anyone
: wa
[zk: localhost:2181(CONNECTED) 236]
[zk: localhost:2181(CONNECTED) 236] set /hadoop "Hadoop2021" # 注意哈,在移除当前znode的w权限之前,我们是可以修改该znode的数据哟~
[zk: localhost:2181(CONNECTED) 237]
[zk: localhost:2181(CONNECTED) 237] setAcl /hadoop world:anyone:a # 此处我移除了"w"权限,仅保留了"a"权限
[zk: localhost:2181(CONNECTED) 238]
[zk: localhost:2181(CONNECTED) 238] getAcl /hadoop
'world,'anyone
: a
[zk: localhost:2181(CONNECTED) 239]
[zk: localhost:2181(CONNECTED) 239] set /hadoop "Hadoop" # Duang~由于我们移除了"w"权限,因此无法修改znode的数据啦~
Insufficient permission : /hadoop
[zk: localhost:2181(CONNECTED) 240]
6.使用"setAcl"指令移除"admin"(简称"a")权限(生产环境中要慎用,一旦znode被移除了"a"权限,则我们将无法为其重新分配任何权限啦!)
[zk: localhost:2181(CONNECTED) 240] getAcl /hadoop # 在移除管理权限之前,我们是可以获取znode的权限信息的!
'world,'anyone
: a
[zk: localhost:2181(CONNECTED) 241]
[zk: localhost:2181(CONNECTED) 241] setAcl /hadoop world:anyone:
[zk: localhost:2181(CONNECTED) 242]
[zk: localhost:2181(CONNECTED) 242] getAcl /hadoop # 当我们移除了"a"权限后,既无法查看znode的权限,也无法为znode重新分配权限!
Insufficient permission : /hadoop
[zk: localhost:2181(CONNECTED) 243]
[zk: localhost:2181(CONNECTED) 243] setAcl /hadoop world:anyone:cdrwa # Duang~我们无法为znode重新分配权限了,因为该"znode"并没有"a"权限!
Insufficient permission : /hadoop
[zk: localhost:2181(CONNECTED) 244]
7.当znode被移除"admin"(简称"a")权限,若想要重新分配权限解决方案
(1)修改zookeeper服务的配置文件,添加如下两行
[root@elk101.oldboyedu.com ~]# vim /oldboy/softwares/zookeeper/conf/zoo.cfg
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# tail -2 /oldboy/softwares/zookeeper/conf/zoo.cfg
# add by yinzhengjie for ACL
skipACL=yes
[root@elk101.oldboyedu.com ~]#
(2)重启zookeeper服务
[root@elk101.oldboyedu.com ~]# zkServer.sh stop
/oldboy/softwares/jdk/bin/java
ZooKeeper JMX enabled by default
Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# zkServer.sh start
/oldboy/softwares/jdk/bin/java
ZooKeeper JMX enabled by default
Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# zkServer.sh status
/oldboy/softwares/jdk/bin/java
ZooKeeper JMX enabled by default
Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: standalone
[root@elk101.oldboyedu.com ~]#
(3)重新分配权限
[root@elk101.oldboyedu.com ~]# zkCli.sh
...
[zk: localhost:2181(CONNECTED) 1] ls /
[hadoop, k8s0000000001, oldboy, zookeeper]
[zk: localhost:2181(CONNECTED) 2]
[zk: localhost:2181(CONNECTED) 2] get /hadoop
Hadoop2021
[zk: localhost:2181(CONNECTED) 3]
[zk: localhost:2181(CONNECTED) 3] getAcl /hadoop # 由于我们启动zookeeper跳过了权限认证,因此此处是可以查看znode的权限哟~
'world,'anyone
:
[zk: localhost:2181(CONNECTED) 4]
[zk: localhost:2181(CONNECTED) 4] setAcl /hadoop world:anyone:cdrwa # 既然跳过了权限认证,那自然我们就可以为当前的znode重新分配权限啦~
[zk: localhost:2181(CONNECTED) 5]
[zk: localhost:2181(CONNECTED) 5] getAcl /hadoop # Duang~当前的znode又重新恢复到所有权限都拥有啦~
'world,'anyone
: cdrwa
[zk: localhost:2181(CONNECTED) 6]
温馨提示:
当重新分配权限后,记得再次重启服务哟~否则当前zookeeper集群始终会跳过权限认证哟~
三.ip授权模式实战案例
1.设置zookeeper服务的监听地址
(1)修改zookeeper监听的IP地址
[root@elk101.oldboyedu.com ~]# vim /oldboy/softwares/zookeeper/conf/zoo.cfg
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# tail -1 /oldboy/softwares/zookeeper/conf/zoo.cfg
clientPortAddress=172.200.1.101
[root@elk101.oldboyedu.com ~]#
(2)重启zookeeper服务
[root@elk101.oldboyedu.com ~]# zkServer.sh stop
/oldboy/softwares/jdk/bin/java
ZooKeeper JMX enabled by default
Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# zkServer.sh start
/oldboy/softwares/jdk/bin/java
ZooKeeper JMX enabled by default
Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# zkServer.sh status
/oldboy/softwares/jdk/bin/java
ZooKeeper JMX enabled by default
Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: 172.200.1.101. Client SSL: false.
Mode: standalone
[root@elk101.oldboyedu.com ~]#
(3)禁用防火墙,若不禁用防火墙,则该服务将无法访问哟~
[root@elk101.oldboyedu.com ~]# systemctl stop firewalld
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@elk101.oldboyedu.com ~]#
温馨提示:
若不修改zookeeper监听的地址,则默认监听的是"[::]:2181"。
2.设置仅"172.200.1.102"这个节点来访问zookeeper的某个znode
(1)在"172.200.1.101"节点设置"/hadoop"的znode仅对"172.200.1.102"这个IP地址有"cdrwa"权限。
[root@elk101.oldboyedu.com ~]# ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
172.200.1.101
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# 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服务端哟~)
[root@kafka102.yinzhengjie.com ~]# ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
172.200.1.102
[root@kafka102.yinzhengjie.com ~]#
[root@kafka102.yinzhengjie.com ~]# 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]
3.设置仅"172.200.1.101"和"172.200.1.102"这两个节点来访问zookeeper的某个znode
(1)在"172.200.1.102"这个节点来连接zookeeper服务端
[root@kafka102.yinzhengjie.com ~]# 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"权限。
[root@elk101.oldboyedu.com ~]# ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# 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]
4.设置仅"192.168.1.0/24"网段可以来访问zookeeper的某个znode
[root@elk101.oldboyedu.com ~]# 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"权限。
[root@elk101.oldboyedu.com ~]# ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
172.200.1.101
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# 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服务端哟~)
[root@kafka102.yinzhengjie.com ~]# ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
172.200.1.102
[root@kafka102.yinzhengjie.com ~]#
[root@kafka102.yinzhengjie.com ~]# 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授权模式实战案例
1.使用sha1加密算法及base64编码来计算一个密码的密文
[root@elk101.oldboyedu.com ~]# echo -n admin:oldboyedu | openssl dgst -binary -sha1 | openssl base64
Tmbbt77KcTd1bAgjQaI+GqI0hjM=
[root@elk101.oldboyedu.com ~]#
2.添加授权信息
[root@elk101.oldboyedu.com ~]# 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.案例展示
(1)在"172.200.1.101"节点设置"/hadoop"的znode仅对"172.200.1.102"这个IP地址有"cdrwa"权限。
[root@elk101.oldboyedu.com ~]# ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
172.200.1.101
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# 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服务端
略,验证步骤参考之前的案例即可。
3.课堂笔记简记2
(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超级管理员
1.使用sha1加密算法及base64编码来计算一个密码的密文
zookeeper的权限管理模式有一种叫做"super",该模式提供一个超级管理员可以方便的访问任何权限的节点。
假设这个管理用户名和密码是"admin:yinzhengjie",需要先为超管生成密码的密文,操作如下所示:
[root@elk101.oldboyedu.com ~]# echo -n admin:oldboyedu | openssl dgst -binary -sha1 | openssl base64
Tmbbt77KcTd1bAgjQaI+GqI0hjM=
[root@elk101.oldboyedu.com ~]#
2.修改zookeeper服务端的环境变量,并添加超级用户
(1)修改"zkEnv.sh"配置文件,如下所示(注意哈,下面的以"#"开头的行,是原来的配置,我们要做的是复制改行并添加超级用户)
[root@elk101.oldboyedu.com ~]# 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)重启集群,使得配置文件生效。
[root@elk101.oldboyedu.com ~]# zkServer.sh restart
/oldboy/softwares/jdk/bin/java
ZooKeeper JMX enabled by default
Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
/oldboy/softwares/jdk/bin/java
ZooKeeper JMX enabled by default
Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
/oldboy/softwares/jdk/bin/java
ZooKeeper JMX enabled by default
Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# zkServer.sh status
/oldboy/softwares/jdk/bin/java
ZooKeeper JMX enabled by default
Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: 172.200.1.101. Client SSL: false.
Mode: standalone
[root@elk101.oldboyedu.com ~]#
3.编写测试案例
[root@elk101.oldboyedu.com ~]# ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
172.200.1.101
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# 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]