一、ZooKeeper权限管理机制介绍
本节将简要介绍ZooKeeper ACL 权限管理的几种方式。ZooKeeper 的权限管理亦即ACL 控制功能,通过Server、Client 两端协调完成:
1.1 Server端
数据和状态,状态中包含ACL信息。创建一个znode 会产生一个ACL 列表。
ACL 包括:
①权限:perms
②验证模式:scheme
③具体内容:Ids
几种验证模式:
①Digest:Client端由用户名和密码验证,譬如user:pwd
②Host:Client端由主机名验证,譬如localhost
③Ip:Client端由IP地址验证,譬如172.2.0.0/24
④World:固定用户为anyone,为所有Client端开放权限
exists操作和getAcl操作并不受ACL许可控制,因此任何客户端可以查询节点的状态和节点的ACL。
子节点Create 操作
②Read:允许对本节点GetChildren 和GetData 操作
③Write :允许对本节点SetData 操作
④Delete :允许对子节点Delete 操作
⑤Admin :允许对本节点setAcl
(4)Znode ACL 权限用一个int 型数字perms 表示,perms 的5 个二进制位分别表示:
acl、delete、create、write、read。
例如:
① adcwr= 0x1f
② ----r= 0x1
③ a-c-r= 0x15
1.2 Client端
addAuthInfo()函数设置当前会话的Author信息(针对Digest 验证模式)。Server 收到Client 发送的操作请求(除exists、getAcl 之外),需要进行ACL 验证:对该请求携带的Author 明文信息加密,并与目标节点的ACL 信息进行比较,如果匹配则具有相
应的权限,否则请求被Server 拒绝。
二、 ZooKeeper使用接口介绍(C API)
Digest 验证模式下,通过用户名、密码的方式进行节点权限管理需要的相关接口。
2.1 设置节点权限
密文,所以在setAcl 时必须将明文的用户名、密码(user:pwd)加密,结果为:
EYJny+H3eleOv6O/G6jy9vuSCq8=(28 位),其加密方式为SHA1。使用方式如下:
2.2 用户验证方式
接口设置session 的用户信息:zoo_add_auth(zk, "digest", "user:pwd", 8, 0, 0);
最后一次设置的信息为有效author 信息。
三、 ZooKeeper SuperDigest
3.1 Client 对znode 操作验证ACL 的方式
(1)遍历znode的所有ACL:
①对于每一个ACL,首先操作类型与权限(perms)匹配。
②只有匹配权限成功才进行session 的auth 信息与ACL 的用户名、密码匹配
(2)如果两次匹配都成功,则允许操作;否则,返回权限不够error(rc=-102)
3.2 特殊情况
如果znode ACL List 中任何一个ACL 都没有setAcl 权限,那么就算superDigest 也修改不了它的权限;再假如这个znode 还不开放delete 权限,那么它的所有子节点都将不会被删除。唯一的办法是通过手动删除snapshot 和log 的方法,将ZK 回滚到一个以前的状态,然后重启,当然这会影响到该znode 以外其它节点的正常应用。
3.3 superDigest 设置的步骤
(1)启动ZK 的时候加入参数
"-Dzookeeper .DigestAuthenticationProvider.superDigest=super:D/InIHSb7yEEbrWz8b9l71RjZJU="(中间没有空格)。
(2) 在客户端使用的时候, zoo_add_auth(zh, "digest", "super:test", 10, 0, 0); " super:test" 为
"super:D/InIHSb7yEEbrWz8b9l71RjZJU="的明文表示,加密算法同setAcl。