ZooKeeper---(10)ZooKeeper权限管理机制
发布日期:2021-06-30 11:05:28 浏览次数:2 分类:技术文章

本文共 2535 字,大约阅读时间需要 8 分钟。

本文转载自:

一、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[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到Nodezoo_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.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。

转载地址:https://it4all.blog.csdn.net/article/details/79316504 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:ZooKeeper---(11)ZooKeeper与Paxos算法分析
下一篇:ZooKeeper---(9)ZooKeeper配置参数说明

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月06日 03时58分46秒