一、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。使用方式如下:

ZooKeeper---(10)ZooKeeper权限管理机制_权限管理


//ACL参数设置
char szUserPwd[] = "user:pwd";
char szEncUserPwd[32];
char szDigestIds[64] = {0};
//EncryptSHA1()为SHA1加密函数
EncryptSHA1(szUserPwd, strlen((char*) szUserPwd), szEncUserPwd,sizeof(szEncUserPwd));
snprintf(szDigestIds,sizeof(szDigestIds),"user:%s", szEncUserPwd);
struct ACL stMyACL[]={{0x1f,{"digest",szDigestIds}},{0x01, {"world","anyone"}}};
struct ACL_vector vecMyACL = {2, stMyACL};
//设置ACL到Node
zoo_set_acl(zk, pszPath, -1, &vecMyACL);


ZooKeeper---(10)ZooKeeper权限管理机制_权限管理

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。