sdtf08 发表于 2015-9-6 14:02:31

ZooKeeper权限管理机制

一、ZooKeeper权限管理机制介绍
  本节将简要介绍ZooKeeper ACL 权限管理的几种方式。ZooKeeper 的权限管理亦即ACL 控制功能,通过Server、Client 两端协调完成:

1.1 Server端
  一个ZooKeeper 的节点(znode)存储两部分内容:数据和状态,状态中包含ACL信息。创建一个znode 会产生一个ACL 列表。
  (1)列表中每个ACL 包括:
  ①权限:perms
  ②验证模式:scheme
  ③具体内容:Ids
  (2)ZooKeeper 提供了如下几种验证模式:
  ①Digest:Client端由用户名和密码验证,譬如user:pwd
  ②Host:Client端由主机名验证,譬如localhost
  ③Ip:Client端由IP地址验证,譬如172.2.0.0/24
  ④World:固定用户为anyone,为所有Client端开放权限
  (3)权限许可集合如下,注意的是,exists操作和getAcl操作并不受ACL许可控制,因此任何客户端可以查询节点的状态和节点的ACL。
  ①Create:允许对子节点Create 操作
  ②Read:允许对本节点GetChildren 和GetData 操作
  ③Write :允许对本节点SetData 操作
  ④Delete :允许对子节点Delete 操作
  ⑤Admin :允许对本节点setAcl 操作
  (4)Znode ACL 权限用一个int 型数字perms 表示,perms 的5 个二进制位分别表示:
  setacl、delete、create、write、read。

例如:
  ① adcwr=0x1f
  ② ----r=0x1
  ③ a-c-r=0x15
1.2 Client端
  Client 通过调用addAuthInfo()函数设置当前会话的Author信息(针对Digest 验证模式)。Server 收到Client 发送的操作请求(除exists、getAcl 之外),需要进行ACL 验证:对该请求携带的Author 明文信息加密,并与目标节点的ACL 信息进行比较,如果匹配则具有相
  应的权限,否则请求被Server 拒绝。

二、 ZooKeeper使用接口介绍(C API)
  基于上一节的内容,本节介绍Digest 验证模式下,通过用户名、密码的方式进行节点权限管理需要的相关接口。

2.1 设置节点权限
  Znode 存储ACL 的内容为密文,所以在setAcl 时必须将明文的用户名、密码(user:pwd)加密,结果为:
  EYJny+H3eleOv6O/G6jy9vuSCq8=(28 位),其加密方式为SHA1。使用方式如下:



//ACL参数设置
char szUserPwd[] = "user:pwd";
char szEncUserPwd;
char szDigestIds = {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);
2.2 用户验证方式
  在Client 连接ZooKeeper Server 之后,用如下的接口设置session 的用户信息:zoo_add_auth(zk, "digest", "user:pwd", 8, 0, 0);
  设置author 信息之后,该session 的每次操作都带有该author 标识。如果想用不同的author 信息操作,只需再调用一次zoo_add_auth ,Client 端以最后一次设置的信息为有效author 信息。

三、 ZooKeeper SuperDigest

3.1Client 对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。
页: [1]
查看完整版本: ZooKeeper权限管理机制