Zookeeper的ACL权限控制

目录

一、概述

二、acl权限各部分组成说明

三、授权的相关命令

四、world授权模式

五、IP授权模式

六、Auth授权模式

七、Digest授权模式

八、多种模式授权

九、总结


一、概述

zookeeper类似linux文件系统,客户端可以创建数据节点、更新节点数据、删除节点等,那么我们如何做到节点的权限控制呢?回想一下linux文件的权限文件,由r(读)、w(写)、x(可执行)组成,同理,zookeeper中存在访问控制列表,也可以实现类似的权限控制。

acl 权限控制,使用scheme:id:permission 来标识,主要涵盖 3 个方面:

  • 权限模式(scheme):授权的策略;
  • 授权对象(id):授权的对象;
  • 权限(permission):授予的权限;

其特性如下:

  • zooKeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限;
  • 每个znode支持设置多种权限控制方案和多个权限;
  • 子节点不会继承父节点的权限,客户端无权访问某节点,但可能可以访问它的子节点;

二、acl权限各部分组成说明

  • 权限模式

权限模式,即scheme,表示采用何种方式授权,是权限控制的第一部分。

在zookeeper中,主要有一下四种权限模式:

  1. world:只有一个用户:anyone,代表登录到zookeeper服务器的所有客户端,默认也是基于world的;
  2. ip:对客户端使用IP地址认证;
  3. auth:使用已添加认证的用户认证;
  4. digest:使用“用户名:密码”方式认证;
  • 授权的对象

授权对象,指的其实就是给谁授予权限。

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

  • 授予的权限

指的是授予指定的授权对象什么权限,如读、写、删等权限。

在zookeeper中,主要有下面五种权限:

  • create:简称c,可以创建子节点;
  • delete:简称d,可以删除子节点(仅下一级节点);
  • read:简称r,可以读取节点数据及显示子节点列表;
  • write:简称w,可以设置节点数据;
  • admin:简称a,可以设置节点访问控制列表权限;

上面5种权限简写为cdrwa,注意:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限。

三、授权的相关命令

命令

使用方式

描述

setAcl

setAcl

设置ACL权限

getAcl

getAcl

读取ACL权限

addauth

addauth

添加认证用户

四、world授权模式

语法格式:

setAcl <path> world:anyone:<acl>

案例:

[zk: localhost:2181(CONNECTED) 30] create /node1 "node1"
Created /node1
[zk: localhost:2181(CONNECTED) 31] getAcl /node1    #查看/node1当前权限
'world,'anyone  #默认新创建的节点都是word授权模式,针对anyone所有登录进来的客户端,都具有读、写、删、改权限
: cdrwa
[zk: localhost:2181(CONNECTED) 32] setAcl /node1 world:anyone:drwa  #设置/node1权限,去掉c创建子节点权限
cZxid = 0x64
ctime = Mon Dec 21 14:21:08 CST 2020
mZxid = 0x64
mtime = Mon Dec 21 14:21:08 CST 2020
pZxid = 0x64
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: localhost:2181(CONNECTED) 33] getAcl /node1
'world,'anyone
: drwa
[zk: localhost:2181(CONNECTED) 34] create /node1/node11 "node11"  #尝试创建子节点,发现报错,因为此时不具有create权限
Authentication is not valid : /node1/node11

五、IP授权模式

语法格式:

setAcl <path> ip:<ip>:<acl>

案例:

终端一: 使用xshell登录192.168.179.133机器上的zkCli.sh客户端。

[root@localhost bin]# ./zkCli.sh -server 192.168.179.133
Connecting to 192.168.179.133
[zk: 192.168.179.133(CONNECTED) 1] create /node2 "node2"
Created /node2
[zk: 192.168.179.133(CONNECTED) 2] setAcl /node2 ip:192.168.179.133:cdrwa
cZxid = 0x700000009
ctime = Tue Jan 19 10:45:24 CST 2021
mZxid = 0x700000009
mtime = Tue Jan 19 10:45:24 CST 2021
pZxid = 0x700000009
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: 192.168.179.133(CONNECTED) 3] getAcl /node2
'ip,'192.168.179.133
: cdrwa

如上可以看到,创建了一个/node2节点,并指定IP为192.168.179.133的机器具有/node2节点的cdrwa权限,其他机器都没有操作权限,下面我们验证一下。

终端二:使用xshell连接上192.168.179.128机器的zookeeper客户端,查看是否有权限操作/node2节点。

[root@zookeeper2 bin]# ./zkCli.sh -server 192.168.179.129
Connecting to 192.168.179.129
[zk: 192.168.179.129(CONNECTED) 0] get /node2
Authentication is not valid : /node2
[zk: 192.168.179.129(CONNECTED) 1] 

如上,可看到Authentication is not valid,说明192.168.179.129机器无法访问/node2节点,以上就是IP授权模式,在生产环境中,使用限定IP的方式可以防止不明IP恶意攻击我们的zookeeper集群,可以限定只有集群内的机器拥有权限。

六、Auth授权模式

语法格式:

addauth digest <user>:<password> #添加认证用户
setAcl <path> auth:<user>:<acl>
[zk: localhost:2181(CONNECTED) 40] create /node3 "node3"
Created /node3
[zk: localhost:2181(CONNECTED) 41] getAcl /node3
'world,'anyone
: cdrwa
[zk: localhost:2181(CONNECTED) 42] addauth digest admin:123456 
[zk: localhost:2181(CONNECTED) 43] setAcl /node3 auth:admin:cdrwa
cZxid = 0x68
ctime = Mon Dec 21 14:32:41 CST 2020
mZxid = 0x68
mtime = Mon Dec 21 14:32:41 CST 2020
pZxid = 0x68
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: localhost:2181(CONNECTED) 44] getAcl /node3
'digest,'admin:0uek/hZ/V9fgiM35b0Z2226acMQ=
: cdrwa

启动另外一个终端进行测试:

[zk: localhost:2181(CONNECTED) 4] get /node3
Authentication is not valid : /node3   #添加认证用户后可以访问
[zk: localhost:2181(CONNECTED) 5] addauth digest admin:123456
[zk: localhost:2181(CONNECTED) 6] get /node3                 
node3
cZxid = 0x68
ctime = Mon Dec 21 14:32:41 CST 2020
mZxid = 0x68
mtime = Mon Dec 21 14:32:41 CST 2020
pZxid = 0x68
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0

可见,只有添加认证用户后才能访问auth授权的那些节点。

七、Digest授权模式

语法格式:

setAcl <path> digest:<user>:<password>:<acl>

注意:这里的密码是经过SHA1及BASE64处理的密文,在SHELL中可以通过以下命令计算。

echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64

这里我们使用admin:123456进行测试,首先计算出密文:

[root@localhost ~]# echo -n admin:123456 | openssl dgst -binary -sha1 | openssl base64
0uek/hZ/V9fgiM35b0Z2226acMQ=      #123456加密后的密文就是这个

案例:

[zk: localhost:2181(CONNECTED) 47] create /node4 "node4"
Created /node4
[zk: localhost:2181(CONNECTED) 48] getAcl /node4
'world,'anyone
: cdrwa
#使用是上面算好的密文密码添加权限
[zk: localhost:2181(CONNECTED) 49] setAcl /node4 digest:admin:0uek/hZ/V9fgiM35b0Z2226acMQ=:cdrwa
cZxid = 0x6a
ctime = Mon Dec 21 14:47:12 CST 2020
mZxid = 0x6a
mtime = Mon Dec 21 14:47:12 CST 2020
pZxid = 0x6a
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: localhost:2181(CONNECTED) 50] getAcl /node4                                                
'digest,'admin:0uek/hZ/V9fgiM35b0Z2226acMQ=
: cdrwa

然后开启另外一个终端:

[zk: localhost:2181(CONNECTED) 0] get /node4
Authentication is not valid : /node4
[zk: localhost:2181(CONNECTED) 1] addauth digest admin:123456  #添加认证用户
[zk: localhost:2181(CONNECTED) 2] get /node4       #成功读取数据            
node4
cZxid = 0x6a
ctime = Mon Dec 21 14:47:12 CST 2020
mZxid = 0x6a
mtime = Mon Dec 21 14:47:12 CST 2020
pZxid = 0x6a
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0

可见,只有添加了认证用户才能进行权限范围内的操作。

八、多种模式授权

在zookeeper中,同一个节点可以同时使用多种模式进行授权。

[zk: localhost:2181(CONNECTED) 3] create /node5 "node5"
Created /node5
#使用多种授权模式,中间使用","进行分隔开
[zk: localhost:2181(CONNECTED) 4] setAcl /node5 auth:admin:cdrwa,digest:admin:0uek/hZ/V9fgiM35b0Z2226acMQ=:cdrwa 
cZxid = 0x6d
ctime = Mon Dec 21 14:52:28 CST 2020
mZxid = 0x6d
mtime = Mon Dec 21 14:52:28 CST 2020
pZxid = 0x6d
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: localhost:2181(CONNECTED) 5] getAcl /node5  #可以看到多种授权模式可同时存在
'digest,'admin:0uek/hZ/V9fgiM35b0Z2226acMQ=
: cdrwa
'digest,'admin:0uek/hZ/V9fgiM35b0Z2226acMQ=
: cdrwa

九、总结

本篇文章详解介绍了zookeeper中几种常见的授权模式,并通过案例详细说明了如何进行授权等,在实际工作中,根据具体的场合决定是否需要进行权限控制。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值