ZooKeeper的ACL权限控制, 可以控制节点的读写操作, 保证数据的安全性,ZookeeperACL权限设置分为3部分组成, 分别是:权限模式(Scheme ) 、授权对象I(ID) 、权限信息(Permission ) 。最终组成一条例如“scheme:id:permission"格式的ACL请求信息。
一、ACL组成
ZookeeperACL权限设置分为3部分组成, 分别是:权限模式(Scheme ) 、授权对象I(ID) 、权限信息(Permission ) 。最终组成一条例如“scheme:id:permission"格式的ACL请求信息。下面我们具体看一下这3部分代表什么意思:
(1)权限模式(scheme):授权的策略。
(2)权限对象(id):授权的对象。
(3)权限(permission):授予的权限。
1.1 权限模式(Scheme)
权限模式(scheme):授权的策略
模式 |
描述 |
world |
这种模式方法的授权对象只有一个anyone,代表登录到服务器的所有客户端都能对该节点执行某种权限 |
ip |
对连接的客户端使用IP地址认证方式进行认证 |
auth |
使用以添加认证的用户进行认证 |
digest |
使用 用户:密码方式验证 |
1.2 权限类型(permission)
权限(permission):授予的权限:
类型 |
ACL简写 |
描述 |
read |
r |
读取节点及显示子节点列表的权限 |
write |
w |
设置节点数据的权限 |
create |
c |
创建子节点的权限 |
delete |
d |
删除子节点的权限 |
admin |
a |
设置该节点ACL权限的权限 |
1.3 授权的命令
授权的命令如下:
命令 |
用法 |
描述 |
getAcl |
getAcl path |
读取节点的ACL |
setAcl |
setAcl path acl |
设置节点的ACL |
create |
create path data acl |
创建节点时设置acl |
addAuth |
addAuth scheme auth |
添加认证用户,类似于登录操作 |
1.4 ZK ACL的特性
(1)ZooKeeper的权限控制是基于znode节点的,需要对每个节点设置权限。
(2)每个znode支持设置多种权限控制方案和多个权限。
(3)子节点不会继承父节点的权限。客户端无法访问某个节点,但是可以访问他的子节点。
二、ACL实操
接下来我们具体看看一些小栗子,以此来对于ACL有一个更深的理解。
2.1 生成授权ID
生成授权ID(账号:密码)有两种方式,一种就是通过代码提供的生成类,一种就是通过Shell命令。
(1)代码生成ID:
public void generate() throws NoSuchAlgorithmException {
String sId = DigestAuthenticationProvider.generateDigest("angel:123456");
System.out.println(sId);
}
(2)在xshell中生成:
echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64
示例:
echo -n angel:123456 | openssl dgst -binary -sha1 | openssl base64
返回的结果是:
5qPtfHTjrZrZ4DGSxBY8+G6AhiM=
2.2设置ACL的两种方式
(1)节点创建的同时设置ACL:
create [-s] [-e] [-c] path [data] [acl]
例子:
create /test1 'hello' digest:angel:5qPtfHTjrZrZ4DGSxBY8+G6AhiM=:cdrwa
(2)用setAcl 设置:
setAcl /test1 digest:angel:5qPtfHTjrZrZ4DGSxBY8+G6AhiM=:cdrwa
2.2 授权访问
添加授权信息后,不能直接访问,直接访问将报如下异常:
访问前需要添加授权信息:
$ addauth digest angel:123456
2.3 auth明文授权
另一种授权模式: auth 明文授权。
使用之前需要先:
addauth digest username:password
注册用户信息,后续可以直接用明文授权。举例说明:
addauth digest wuqian:123456
create /test2 'hello2' auth:wuqian:123456:cdwra
get /test2
2.4 IP授权模式
方式1:setAcl /test3 ip:192.168.0.106:cdwra
方式2:create /test data ip:192.168.0.106:cdwra
多个指定IP可以通过逗号分隔,如 setAcl /test ip:IP1:rw,ip:IP2:a
2.5 关闭ACL
可以通过系统参数zookeeper.skipACL=yes进行配置,默认是no,可以配置为true, 则配置过的ACL将不再进行权限检测。
编辑配置启动文件 vim bin/zkServer.sh,然后添加启动参数-D:
重启zkServer,然后在使用zkCli进行访问get /test1这时候就可以进行访问了。
2.6 super超级管理员模式
这是一种特殊的Digest模式, 在Super模式下超级管理员用户可以对Zookeeper上的节点进行任何的操作,需要在启动了上通过JVM 系统参数开启:
格式如下:
-Dzookeeper.DigestAuthenticationProvider.superDigest=super:<base64encoded(SHA1(password))
具体操作:
(1)生成base64加密的SHA1加密的密码:
echo -n admin:123456 | openssl dgst -binary -sha1 | openssl base64
输出结果是:0uek/hZ/V9fgiM35b0Z2226acMQ=
(2)修改vim bin/zkServer.sh文件,添加JVM的系统参数:
-Dzookeeper.DigestAuthenticationProvider.superDigest=admin:0uek/hZ/V9fgiM35b0Z2226acMQ=
重启zkServer,然后zkCli重新进入: