当前位置:   article > 正文

Zookeeper的高级特性介绍——监听器以及ACL权限控制_zk addauth digest super

zk addauth digest super

目录

1.监听器

1.1监听当前节点

1.2监听子节点

2.ACL权限控制

2.1 world授权模式

2.2 IP授权模式

2.3 auth授权模式

2.4 digest授权模式

2.5ACl超级管理员


前面我们讲解了zookeeper的节点的增删改查操作,接下来我们来看下zookeeper的一些高级特性:

1.监听器

十分重要,后面说操作zookeeper的API时再细说

1.1监听当前节点

get 节点路径  watch           注册一个监听,一次性的

stat  节点路径  watch   也是同样的效果

无法监听子节点的改变

先创建一个节点/cjian ,然后通过  get /cjian watch 命令给该节点注册一个监听:

  1. [zk: localhost:2181(CONNECTED) 8] create /cjian "123"
  2. Created /cjian
  3. [zk: localhost:2181(CONNECTED) 9] get /cjian watch
  4. 123
  5. cZxid = 0x26
  6. ctime = Thu Jan 28 14:31:06 CST 2021
  7. mZxid = 0x26
  8. mtime = Thu Jan 28 14:31:06 CST 2021
  9. pZxid = 0x26
  10. cversion = 0
  11. dataVersion = 0
  12. aclVersion = 0
  13. ephemeralOwner = 0x0
  14. dataLength = 3
  15. numChildren = 0

为了更好的演示效果,我们再开一个客户端,去修改下/cjian节点的值:

  1. [zk: localhost:2181(CONNECTED) 2] get /cjian
  2. 123
  3. cZxid = 0x26
  4. ctime = Thu Jan 28 14:31:06 CST 2021
  5. mZxid = 0x26
  6. mtime = Thu Jan 28 14:31:06 CST 2021
  7. pZxid = 0x26
  8. cversion = 0
  9. dataVersion = 0
  10. aclVersion = 0
  11. ephemeralOwner = 0x0
  12. dataLength = 3
  13. numChildren = 0
  14. [zk: localhost:2181(CONNECTED) 3] set /cjian "456"
  15. cZxid = 0x26
  16. ctime = Thu Jan 28 14:31:06 CST 2021
  17. mZxid = 0x27
  18. mtime = Thu Jan 28 14:33:33 CST 2021
  19. pZxid = 0x26
  20. cversion = 0
  21. dataVersion = 1
  22. aclVersion = 0
  23. ephemeralOwner = 0x0
  24. dataLength = 3
  25. numChildren = 0

另一个窗口的回应:

  1. [zk: localhost:2181(CONNECTED) 10]
  2. WATCHER::
  3. WatchedEvent state:SyncConnected type:NodeDataChanged path:/cjian

1.2监听子节点

ls 节点路径 watch            注册的监听器能够监听该节点下所有子节点的增加删除操作,无法监听修改

ls2  节点路径 watch

我们来给/cjian注册一下监听(A窗口)

  1. [zk: localhost:2181(CONNECTED) 11] ls /cjian watch
  2. []

然后在另一个客户端,创建子节点:

  1. [zk: localhost:2181(CONNECTED) 30] create /cjian/node1 "123"
  2. Created /cjian/node1

A窗口效果:

  1. [zk: localhost:2181(CONNECTED) 11] ls /cjian watch
  2. []
  3. [zk: localhost:2181(CONNECTED) 12]
  4. WATCHER::
  5. WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/cjian

2.ACL权限控制

zookeeper类似文件系统,客户端可以创建节点、更新节点、删除节点。那么如何做到节点的权限的控制呢?

ACL:全称 access control list,访问控制列表可以做到这一点

  • zookeeper的权限控制是基于每个znode节点的
  • 需要对每个节点设置权限,每个znode支持多种权限控制和多个权限
  • 子节点不会继承父节点的权限,客户端无权访问某个节点,但可能无权访问它的子节点。

权限模式:

方案描述
world只有一个用户:anyone,代表登陆zookeeper的所有人(默认)
ip对客户端使用IP地址的认证
auth使用已添加认证的用户
digest使用“用户名:密码”方式认证

授予的权限:

权限ACL简写描述
createc可以创建子节点
deleted可以删除子节点(仅下一级节点)
readr可以读取节点数据及显示子节点列表
writew可以设置节点数据
admina可以设置节点访问控制列表权限

授权的相关命令:

命令使用方式描述
getAclgetAcl [path]读取ACL权限
setAclsetAcl [path]设置ACL权限
addauthaddauth [scheme] [auth]添加认证用户
  1. [zk: localhost:2181(CONNECTED) 35] getAcl /cjian
  2. 'world,'anyone
  3. : cdrwa

 

2.1 world授权模式

我们重行创建/cjian 节点,并查看它的acl:

  1. [zk: localhost:2181(CONNECTED) 45] create /cjian "123"
  2. Created /cjian
  3. [zk: localhost:2181(CONNECTED) 46] getAcl /cjian
  4. 'world,'anyone
  5. : cdrwa

拿掉它的w权限:

  1. [zk: localhost:2181(CONNECTED) 47] setAcl /cjian world:anyone:cdra
  2. cZxid = 0x43
  3. ctime = Thu Jan 28 15:33:42 CST 2021
  4. mZxid = 0x43
  5. mtime = Thu Jan 28 15:33:42 CST 2021
  6. pZxid = 0x43
  7. cversion = 0
  8. dataVersion = 0
  9. aclVersion = 1
  10. ephemeralOwner = 0x0
  11. dataLength = 3
  12. numChildren = 0
  13. [zk: localhost:2181(CONNECTED) 48] getAcl /cjian
  14. 'world,'anyone
  15. : cdra

尝试修改:

  1. [zk: localhost:2181(CONNECTED) 49] set /cjian "456"
  2. Authentication is not valid : /cjian

如果我们将权限全部拿掉呢?

  1. [zk: localhost:2181(CONNECTED) 50] setAcl /cjian world:anyone:
  2. cZxid = 0x43
  3. ctime = Thu Jan 28 15:33:42 CST 2021
  4. mZxid = 0x43
  5. mtime = Thu Jan 28 15:33:42 CST 2021
  6. pZxid = 0x43
  7. cversion = 0
  8. dataVersion = 0
  9. aclVersion = 2
  10. ephemeralOwner = 0x0
  11. dataLength = 3
  12. numChildren = 0
  13. [zk: localhost:2181(CONNECTED) 51] getAcl /cjian
  14. 'world,'anyone
  15. :
  16. [zk: localhost:2181(CONNECTED) 52] get /cjian
  17. Authentication is not valid : /cjian
  18. [zk: localhost:2181(CONNECTED) 53] rmr /cjian
  19. Authentication is not valid : /cjian
  20. [zk: localhost:2181(CONNECTED) 54] set /cjian "11111"
  21. Authentication is not valid : /cjian
  22. [zk: localhost:2181(CONNECTED) 55] create /cjian/node1 "node1"
  23. Authentication is not valid : /cjian/node1
  24. [zk: localhost:2181(CONNECTED) 56] addauth digest super:superpw
  25. [zk: localhost:2181(CONNECTED) 57] getAcl /cjian
  26. 'world,'anyone
  27. :
  28. [zk: localhost:2181(CONNECTED) 58] delete /cjian
  29. [zk: localhost:2181(CONNECTED) 59] get /cjian
  30. Node does not exist: /cjian

如果没有权限了,可以通过  addauth digest super:superpw 切换到超级用户

2.2 IP授权模式

远程登录zookeeper的命令:./zkCli.sh -server ip

由于条件限制,没法真正的演示:

  1. [zk: localhost:2181(CONNECTED) 63] create /cjian "123"
  2. Created /cjian
  3. [zk: localhost:2181(CONNECTED) 64] getAcl /cjian
  4. 'world,'anyone
  5. : cdrwa
  6. [zk: localhost:2181(CONNECTED) 67] setAcl /cjian ip:127.0.0.1:cdrwa
  7. cZxid = 0x4b
  8. ctime = Thu Jan 28 15:46:27 CST 2021
  9. mZxid = 0x4b
  10. mtime = Thu Jan 28 15:46:27 CST 2021
  11. pZxid = 0x4b
  12. cversion = 0
  13. dataVersion = 0
  14. aclVersion = 2
  15. ephemeralOwner = 0x0
  16. dataLength = 3
  17. numChildren = 0
  18. [zk: localhost:2181(CONNECTED) 68] getAcl /cjian
  19. 'ip,'127.0.0.1
  20. : cdrwa
  21. [zk: localhost:2181(CONNECTED) 69] set /cjian "456"
  22. Authentication is not valid : /cjian

给某个节点赋予多个ip的acl权限:

  1. [zk: localhost:2181(CONNECTED) 82] getAcl /test
  2. 'ip,'127.0.0.1
  3. : cdrwa
  4. [zk: localhost:2181(CONNECTED) 83] setAcl /test ip:127.0.0.1:cdrwa,ip:127.0.0.2:cdrwa
  5. cZxid = 0x51
  6. ctime = Thu Jan 28 15:50:34 CST 2021
  7. mZxid = 0x51
  8. mtime = Thu Jan 28 15:50:34 CST 2021
  9. pZxid = 0x51
  10. cversion = 0
  11. dataVersion = 0
  12. aclVersion = 2
  13. ephemeralOwner = 0x0
  14. dataLength = 4
  15. numChildren = 0
  16. [zk: localhost:2181(CONNECTED) 84] getAcl /test
  17. 'ip,'127.0.0.1
  18. : cdrwa
  19. 'ip,'127.0.0.2
  20. : cdrwa
  21. [zk: localhost:2181(CONNECTED) 85]

2.3 auth授权模式

添加认证用户:addauth digest 用户名:密码

设置权限 setAcl 节点名称 auth:用户名:cdrwa

 客户端1:

  1. [zk: localhost:2181(CONNECTED) 104] create /test 123
  2. Created /test
  3. [zk: localhost:2181(CONNECTED) 105] getAcl /test
  4. 'world,'anyone
  5. : cdrwa
  6. [zk: localhost:2181(CONNECTED) 106] addauth digest cjian:111111
  7. [zk: localhost:2181(CONNECTED) 107] setAcl /test auth:cjian:cdrwa
  8. cZxid = 0x5e
  9. ctime = Thu Jan 28 16:48:36 CST 2021
  10. mZxid = 0x5e
  11. mtime = Thu Jan 28 16:48:36 CST 2021
  12. pZxid = 0x5e
  13. cversion = 0
  14. dataVersion = 0
  15. aclVersion = 1
  16. ephemeralOwner = 0x0
  17. dataLength = 3
  18. numChildren = 0
  19. [zk: localhost:2181(CONNECTED) 108] getAcl /test
  20. 'digest,'super:g9oN2HttPfn8MMWJZ2r45Np/LIA=
  21. : cdrwa
  22. 'digest,'cjian:ST25maIOy8WImjpR7Nf2/D2wFXQ=
  23. : cdrwa

有两个auth是因为之前我们执行了 addauth digest super:superpw 命令

客户端2:

  1. [zk: localhost:2181(CONNECTED) 4] ls /
  2. [cjian, zookeeper, test]
  3. [zk: localhost:2181(CONNECTED) 5] get /test
  4. Authentication is not valid : /test
  5. [zk: localhost:2181(CONNECTED) 6] addauth digest cjian:111111
  6. [zk: localhost:2181(CONNECTED) 7] get /test
  7. 123
  8. cZxid = 0x5e
  9. ctime = Thu Jan 28 16:48:36 CST 2021
  10. mZxid = 0x5e
  11. mtime = Thu Jan 28 16:48:36 CST 2021
  12. pZxid = 0x5e
  13. cversion = 0
  14. dataVersion = 0
  15. aclVersion = 1
  16. ephemeralOwner = 0x0
  17. dataLength = 3
  18. numChildren = 0

2.4 digest授权模式

digest不用先进行认证用户的添加,且密码是需要经过SHA1及BASE64加密后的

setACL  节点路径  digest:用户名:密码:acl权限

linux环境下加密命令:echo -n user:password | openssl dgst -binary -sha1 | openssl base64

echo -n cjian:111111 | openssl dgst -binary -sha1 | openssl base64
ST25maIOy8WImjpR7Nf2/D2wFXQ=

setACL  /test digest:cjian:ST25maIOy8WImjpR7Nf2/D2wFXQ=:cdrwa

以上四种可以混合使用 中间使用,分割:

setAcl  /test  ip:127.0.0.1:cdrwa,auth:cjian:cdrwa,digest:cjian:ST25maIOy8WImjpR7Nf2/D2wFXQ=:cdrwa

 

2.5ACl超级管理员

Linux下:

zookeeper的权限管理模式有一种叫做super,该模式提供一个超管可以方便的访问任何权限的节点

假设这个超管是:super:admin,需要先为超管生成密码的密文

  1. echo -n super:admin | openssl dgst -binary -sha1 | openssl base64
  2. xQJmxLMiHGwaqBvst5y6rkB6HQs=

然后打开bin/zkServer.sh服务器脚本文件,找到这一行:

nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \

这就是脚本启动zookeeper的命令,默认只有以上两个配置项,我们需要加一个超管的配置项:

"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="

修改完后变成:

  1. nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}"
  2. "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"
  3. "-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs=" \
  4. -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &

之后启动zookeeper,输入如下命令添加权限即可

addauth digest super:admin

 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/974914?site=
推荐阅读
相关标签
  

闽ICP备14008679号