一个zookeeper节点中不仅包含了存储的数据,还有 ACL(Access Control List)。节点创建时,可以给它设置一个ACL,来决定谁可以对节点做哪些操作。
ACL 具有以下特点:
1. ZooKeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限
2. 每个znode支持设置多种权限控制方案和多个权限
3. 子节点不会继承父节点的权限,客户端无权访问某节点,但可能可以访问它的子节点
4. 所以任何一个客户端都可以通过exists 操作来获得任何znode的状态,从而得知znode是否真的存在。
ACL 相关命令
命令
语法
描述
getAcl
getAcl path
读取某个节点ACL权限
setAcl
setAcl path acllist
设置某个节点ACL权限
addauth
addauth scheme authinfo
添加认证用户
create
create [-s] [-e] path data acllist
创建节点时指明 ACL 权限
ACL Permissions
ACL 权限
ACL 简写
允许的操作
CREATE
c
创建子节点
DELETE
d
删除子节点 (仅下一级节点)
READ
r
获取节点的数据和它的子节点
WRITE
w
设置节点的数据
ADMIN
a
设置 ACL 权限
ACL Schemes
ZooKeeper内置了一些权限控制方案,可以用以下方案为每个节点设置权限:
方案
描述
world
只有一个用户:anyone,代表所有人(默认)
ip
使用IP地址认证
auth
使用已添加认证的用户认证
digest
使用“用户名:密码”方式认证
ACL是由鉴权方式(scheme)、该鉴权方式的ID(用户或ip地址)和一个权限(permession)的集合组成。例如,我们想通过一个ip地址为10.0.0.1的客户端访问一个节点。那么,我们需要为节点设置一个ACL,鉴权方式使用IP鉴权方式,鉴权方式的ID为10.0.0.1,只允许读权限。那么 ACL 的格式就是:ip:10.0.0.1:w
world 方案
默认情况下使用 world 方法,任何人有所有权限:
创建节点/abc,赋值20190825,默认具有world全部权限
修改(设置)权限:setAcl world:anyone:
修改节点/abc权限,从cdrwa改为drwa,创建子节点失败(正常创建节点时会打印Created,如上图)
IP 方案
:可以是具体IP也可以是IP/bit格式,即IP转换为二进制,匹配前bit位,如192.168.0.0/16匹配192.168.*.*
设置方式:setAcl ip::
每种权限模式也支持在节点创建时直接指定,这样就不是默认的world模式。
初始化设置方式:create node data ip::
auth 方案
设置方式
addauth digest :#添加认证用户,可以是新用户或老用户,老用户密码表示鉴权,新用户密码组合表示添加及鉴权,一个用户名支持匹配多个密码,一个用户加一个密码组成一对认证信息
setAcl auth::
最后getAcl查询到的密码为SHA62加密过的密码
一个用户支持多个密码
digest 方案
设置方式
setAcl digest:::这里的密码是经过SHA1及BASE64处理的密文,这也是digest和auth两种权限模式的区别,auth为传入明文自动生成秘文,无需用户自己生成,直接设置即可。
在SHELL中可以通过以下命令计算:
echo -n :| openssl dgst -binary -sha1 | openssl base64
先来算一个密文密码:
echo -n admin:admin | openssl dgst -binary -sha1 | openssl base64
x1nq8J5GOJVPY6zgzhtTtA9izLc=
注意了!使用 rmr 删除节点没有权限时,竟然可以使用 delete
待补充:删除目录,删除节点,创建不含value的节点,同一个节点既是目录又有数据,无法创建节点,无报错
原文链接:https://blog.csdn.net/feixiang2039/article/details/79810102