使用scheme、id、permission 来标识,主要涵盖 3 个方面:
权限模式(scheme):授权的策略
授权对象(id):授权的对象
权限(permission):授予的权限
Zookeeper的权限控制是基于znode节点的,需要对每个节点设置权限。
每个znode支持设置多种权限控制方案和多个权限。
子节点不会继承父节点的权限。客户端无法访问某个节点,但是可以访问他的子节点
方案 描述
world 只有一个用户:anyone,代表登录zokeeper所有人(默认)
ip 对客户端使用IP地址认证
auth 使用已添加认证的用户认证
digest 使用“用户名:密码”方式认证
create、delete、read、writer、admin也就是 增、删、改、查、管理权限,这5种权限简写为cdrwa,注意:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限。
权限 ACL简写 描述
create c 可以创建子节点
delete d 可以删除子节点(仅下一级节点)
read r 可以读取节点数据及显示子节点列表
write w 可以设置节点数据
admin a 可以设置节点访问控制列表权限
启动ZooKeeper集群,具体步骤可以参考ZooKeeper 安装与部署。
cd /usr/cstor/zookeeper
bin/zkClin.sh
create /node1 “node1”
getAcl /node1
这是创建节点时的默认acl ,表示任何连接到Zookeeper的客户端都能对该节点进行cdrwa操作。权限设置要使用模式 acl的模式为 scheme: id:permission 比如 world:anyone:cdwa。
world权限模式只有一种设置模式。就是 setAcl world:anyone:[r][w][c][d][a]
(1)、取消节点读取数据权限:
setAcl /node1 world:anyone:cdwa 取消节点读取数据权限
getAcl /node1 查看节点权限
get /node1 获取node1节点值
设置以后尝试读取/node1节点将是没有权限 Authentication is not valid。
(2)、取消节点设置数据的权限
setAcl /node1 world:anyone:cda 取消设置数据权限
getAcl /node1 查看节点权限
set /node1 "node111111" 修改node1节点值
(3)、取消节点创建子节点的权限
setAcl /node1 world:anyone:da 取消节点创建子节点权限
getAcl /node1 查看节点权限
create /node1/node2 "node2" 在node1节点下创建子节点node2并赋值 node2
(4)、取消删除子节点的权限
create /node8 "888"
create /node8/node9 "999"
setAcl /node8 world:anyone:a 取消删除子节点的权限
delete /node8/node9 删除node8节点下的子节点node9
(5)、取消ACL相关权限
create /node666 "666"
setAcl /node666 world:anyone: 取消node666 全部权限
getAcl /node666
setAcl /node666 world:anyone:rwcda
取消了a权限以后,getAcl setAcl命令都没有权限。
该模式使用的ACL方式是 ip:10.30.196.4:[r][w][c][d][a]
create /node20 "node20"
setAcl /node20 ip:10.30.196.4:rwcda
getAcl /node20
get /node20
设置只有ip为10.30.196.3的客户端连接才能进行rwdca操作,其他ip啥操作都做不了。因为图中设置ACL的客户端不是这个ip,所以设置了后,他就失去对该节点的权限了,所以getAcl命令会没有权限。
getAcl /node20
get /node20
我们用ip为10.30.196.4的客户端链接,有rwdca权限,所以能够执行getAcl操作和读读取节点数据。
这个要配合addauth命令。
第一步:先添加授权用户 addauth digest username:password
第二步:设置该节点只有登录了该授权用户的客户端连接才能进行操作。
addauth digest admin:123456
create /nodeAuth “nodeAuth”
setAcl /nodeAuth auth:admin:rwdca
getAcl /nodeAuth
把客户端quit退出重新连接后:
get /nodeAuth
失去了对该节点的权限。需要使用addauth命令添加授权才行。类似登录之后才能对该节点有权限。
addauth digest admin:123456
get /nodeAuth
digest授权模式基于账号密码的授权模式,与Auth模式类似,只是他设置权限之前不用使用addauth digest username:password进行权限用户添加。直接使用命令 setAcl path digest:username:password:acl 进行授权就行(只是这里的密码要使用加密后的密码,不能使用铭文密码)。
linux命令行输入
echo -n admin:123456 | openssl dgst -binary -sha1 | openssl base64
zkCli客户端输入
create /nodeDigest "nodeDigest"
setAcl /nodeDigest digest:admin:0uek/hZ/V9fgiM35b0Z2226acMQ=:rwdca
getAcl /nodeDigest
get /nodeDigest
addauth digest admin:123456
getAcl /nodeDigest
get /nodeDigest
同一个节点可以同时使用多种模式授权
create /nodeManyAcl "nodeManyAcl"
addauth digest admin:123456
setAcl /nodeManyAcl ip:10.30.196.3:rdca,auth:admin:rwdca,digest:admin:0uek/hZ/V9fgiM35b0Z2226acMQ=:rwdca
getAcl /nodeManyAcl