一个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 <path> world:anyone:<acl>
修改节点/abc权限,从cdrwa改为drwa,创建子节点失败(正常创建节点时会打印Created,如上图)
IP 方案
<ip>:可以是具体IP也可以是IP/bit格式,即IP转换为二进制,匹配前bit位,如192.168.0.0/16匹配192.168.*.*
设置方式:setAcl <path> ip:<ip>:<acl>
每种权限模式也支持在节点创建时直接指定,这样就不是默认的world模式。
初始化设置方式:create node data ip:<ip>:<acl>
auth 方案
设置方式
addauth digest <user>:<password> #添加认证用户,可以是新用户或老用户,老用户密码表示鉴权,新用户密码组合表示添加及鉴权,一个用户名支持匹配多个密码,一个用户加一个密码组成一对认证信息
setAcl <path> auth:<user>:<acl>
最后getAcl查询到的密码为SHA62加密过的密码
一个用户支持多个密码
digest 方案
设置方式
setAcl <path> digest:<user>:<password>:<acl>
这里的密码是经过SHA1及BASE64处理的密文,这也是digest和auth两种权限模式的区别,auth为传入明文自动生成秘文,无需用户自己生成,直接设置即可。
在SHELL中可以通过以下命令计算:
echo -n <user>:<password> | 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