传统的文件系统中,ACL分为两个维度,一个是属组,一个是权限,子目录/文件默认继承父目录的ACL。而在Zookeeper中,znode的ACL是没有继承关系的,是独立控制的。
zookeeper支持的权限
- CREATE(c): 创建权限,可以在在当前node下创建child node
- DELETE(d): 删除权限,可以删除当前的node
- READ(r): 读权限,可以获取当前node的数据,可以list当前node所有的child nodes
- WRITE(w): 写权限,可以向当前node写数据
- ADMIN(a): 管理权限,可以设置当前node的permission
zookeeper ACL 的组成
Scheme:id:permission 比如: world:anyone:crdwa
- Scheme: cheme对应于采用哪种方案来进行权限管理
- Id: 权限被赋予的对象,比如ip或者某个用户
- Permission: 权限,上面的crdwa,表示五个权限组合
- 通过setAcl命令设置节点的权限
- 节点的ACL无继承关系
getAcl可以查看节点的Acl信息
ZooKeeper有如下几种内置的Schemes: world, auth, digest, ip .
world scheme
– Scheme:id:permission
– Id: 为固定的anyone,表示任何用户
– world:anyone:crdwa表示任何用户都具有crdwa权限
例子:
setAcl /zk-acl world:anyone:ca
getAcl /zk-acl
上述例子不设置读权限, 当调用getAcl会报 认证无效
auth scheme
- Scheme:id:permission ,比如: auth:username:password:crdwa
- 表示给认证通过的所有用户设置acl权限
- 同时可以添加多个用户
- 通过addauth 命令进行认证用户的添加
- addauth digest :
- Auth策略的本质就是digest
- 如果通过addauth创建多组用户和密码,当使用setAcl修改权限时,所有的用户和密码的权限都会跟着修改
- 通过addauth新创建的用户和密码组需要重新调用setAcl才会加入到权限组中去
例子:
addauth digest test1:123
addauth digest test2:123
create /authpath 123 auth:test1:123:crdwa
get /authpath
getAcl /authpath
digest
- Scheme:id:permission ,比如: digest:username:password:crdwa
- 指定某个用户及它的密码可以访问
- 此处的username:password必须经过SHA-1和BASE64编码
- BASE64(SHA1(username:password))
- 通过addauth命令进行认证用户的添加
- addauth digest :
例子:
create /digpath ddd
setAcl /digpath digest:test1:ubmgtiw94At8IplZnri3fHnZhsA=:cdrwa
getAcl /digpath
ip
- Scheme:id:permission ,比如: ip:127.0.0.1:crdwa
- 指定某个ip地址可以访问
super
在这种scheme情况下,对应的id拥有超级权限,可以做任何事情(cdrwa)
- 供运维人员维护节点使用
- 有权限操作任何节点
- 启动时,在命令参数中配置:
- -Dzookeeper.DigestAuthenticationProvider.superDigest = admin:015uTByzA4zSglcmseJsxTo7n3c=
- 打开zkCli.cmd(sh) 在命令行里增加配置.
- 用户名和密码也需要通过sha1和base64编码