1、概述
zookeeper
类似文件系统,client
可以创建结点、更新结点、删除结点,那么如何做到结点的权限控制呢?
zookeeper
的 access control list
访问控制列表可以做到这一点
acl
权限控制,使用scheme:id:permission
来标识,主要涵盖3个方面:
- 权限模式(
scheme
):授权的策略 - 授权对象(
id
):授权的对象 - 权限(
permission
):授予的权限
其特性如下:
-
zookeeper
的权限控制是基于每个znode
结点的,需要对每个结点设置权限 -
每个
znode
支持多种权限控制方案和多个权限 -
子结点不会继承父结点的权限,客户端无权访问某结点,但可能可以访问它的子结点:
例如:
setAcl /test2 ip:192.168.133.133:crwda # 将结点权限设置为Ip:192.168.133.133 的客户端可以对节点进行增删改查和管理权限
2、权限模式
采用何种方式授权:
方案 | 描述 |
---|---|
world | 只有一个用户:anyone ,代表登录zookeeper 所有人(默认) |
ip | 对客户端使用IP地址认证 |
auth | 使用已添加认证的用户认证 |
digest | 使用"用户名:密码"方式认证 |
8.3、授权对象
- 给谁授予权限;
- 授权对象
ID
是指,权限赋予的实体,例如:IP
地址或用户。
8.4、授权的权限
-
授予什么权限?
-
create、delete、read、writer、admin
也就是 增、删、查、改、管理权限,这5种权限简写为 c d r w a,注意这五种权限中,有的权限并不是对结点自身操作的例如:delete是指对子结点的删除权限。可以试图删除父结点,但是子结点必须删除干净,所以
delete
的权限也是很有用的。
权限 | ACL简写 | 描述 |
---|---|---|
create | c | 可以创建子结点 |
delete | d | 可以删除子结点(仅下一级结点) |
read | r | 可以读取结点数据以及显示子结点列表 |
write | w | 可以设置结点数据 |
admin | a | 可以设置结点访问控制权限列表 |
8.5、授权的相关命令
命令 | 使用方式 | 描述 |
---|---|---|
getAcl | getAcl | 读取ACL权限 |
setAcl | setAcl | 设置ACL权限 |
addauth | addauth | 添加认证用户 |
8.6、案例
./zkServer.sh -server 192.168.133.133
可以远程登录
(1)world授权模式
getAcl /node
// 读取权限信息setAcl /node world:anyone:drwa
// 设置权限(禁用创建子结点的权限)
[zk: localhost:2181(CONNECTED) 1] create /node1 "node1"
Created /node1
[zk: localhost:2181(CONNECTED) 2] getAcl /node1
'world,'anyone #world方式对所有用户进行授权
: cdrwa #增、删、改、查、管理
[zk: localhost:2181(CONNECTED) 3] setAcl /node1 world:anyone:cdrwa
cZxid = 0x2
ctime = Fri Dec 13 22:25:24 CST 2019
mZxid = 0x2
mtime = Fri Dec 13 22:25:24 CST 2019
pZxid = 0x2
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
(2)ip授权模式
./zkServer.sh -server 192.168.133.133
可以远程登录
setAcl /hadoop ip:192.168.133.133:drwa
- 如果在两台不同的虚拟机中,另一台用远程连接的模式,进行上面这条命令,那么只会有一台被授权
- 需要两台虚拟机一起授权的话需要用逗号将授权列表隔开:
setAcl /hadoop ip:192.168.133.133:cdrwa,ip:192.168.133.132:cdrwa
(3)auth授权模式
addauth digest <user>:<password>
setAcl <path> auth:<user>:<acl>
create /hadoop "hadoop" # 初始化测试用的结点
addauth digest itcast:123456 # 添加认证用户
setAcl /hadoop auth:itcast:cdrwa # 设置认证用户
quit # 退出后再./zkCli.sh 进入
get /hadoop # 这个时候就没有权限了,需要再次认证
addauth digest itcast:123456 # 认证,密码错了的话 zookeeper 不会报错,但是不能认证
get /hadoop
(4)Digest授权模式
setAcl <path> digest:<user>:<password>:<acl>
这里的密码是经过SHA1
以及BASE64
处理的密文,在shell 中可以通过以下命令计算:
echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64
# 计算密码
echo -n itcast:12345 | openssl dgst -binary -sha1 | openssl base64
# 获取密码,设置权限列表
setAcl /hadoop digest:itcast:qUFSHxJjItUW/93UHFXFVGlvryY=:cdrwa
# 现在想要get /hadoop 需要登录了
addauth digest itcast:12345
get /hadoop
(5)多种授权模式
同一个节点可以同时使用多种模式授权,仅需逗号隔开:
[zk: localhost:2181(CONNECTED) 0] create /node5 "node5"
Created /node5
[zk: localhost:2181(CONNECTED) 1] addauth digest itcast:123456
#添加认证用户
[zk: localhost:2181(CONNECTED) 2] setAcl /node5
ip:192.168.60.129:cdra,auth:itcast:cdrwa,digest:itheima:qlzQzCLKhBROgh
kooLvb+Mlwv4A=:cdrwa
8.7、acl 超级管理员
zookeeper
的权限管理模式有一种叫做super
,该模式提供一个超管可以方便的访问任何权限的节点。
假设这个超管是supper:admin
,需要为超管生产密码的密文:
echo -n super:admin | openssl dgst -binary -sha1 | openssl base64
那么打开zookeeper
目录下/bin/zkServer.sh
服务器脚本文件,找到如下一行:
#nohup 快速查找,可以看到如下
nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"
这个就算脚本中启动zookeeper
的命令,默认只有以上两个配置项,我们需要添加一个超管的配置项:
"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="
修改后命令变成如下:
nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-
Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "-
Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBv
st5y6rkB6HQs="\
-cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT"
2>&1 < /dev/null &
# 重启后,现在随便对任意节点添加权限限制
setAcl /hadoop ip:192.168.1.1:cdrwa # 这个ip并非本机
# 现在当前用户没有权限了
getAcl /hadoop
# 登录超管
addauth digest super:admin
# 强行操作节点
get /hadoop