• Zookeeper 节点权限控制ACL详解


    一:zooKeeper ACL权限控制概述

    Zookeeper类似于unix文件系统,节点类比文件,客户端可以删除节点,创建节点,修改节点。Zookeeper可以使用ACL(access control list)访问控制列表来对节点的权限进行控制。

    acl权限控制使用:scheme id permission来标志,主要涵盖三个方面:

    权限模式(scheme):授权的策略。
    权限对象(id):授权的对象。
    权限(permission):授予的权限。


    Zookeeper acl的特性:
    Zookeeper的权限控制是基于znode节点的,需要对每个节点设置权限。
    每个znode支持设置多种权限控制方案和多个权限。
    子节点不会继承父节点的权限。客户端无法访问某个节点,但是可以访问他的子节点。

    权限模式种类:

    权限模式种类
    模式                                                             描述
    world这种模式方法的授权对象只有一个anyone,代表登录到服务器的所有客户端都能对该节点执行某种权限
    ip对连接的客户端使用IP地址认证方式进行认证
    auth使用以添加认证的用户进行认证
    digest使用 用户:密码方式验证


    权限的类型:

    权限类型
    ACL权限类型ACL权限缩写ACL权限描述
    readr读取节点及显示子节点列表的权限
    writew设置节点数据的权限
    createc创建子节点的权限
    deleted删除子节点的权限
    admina设置该节点ACL权限的权限

            
    关于授权的命令:

    权限相关命令
    命令命令用法命令作用描述
    getAclgetAcl /path读取节点的ACL
    setAclsetAcl /path acl设置节点的ACL
    createcreate /path data acl创建节点时设置acl
    addAuthaddAuth scheme auth添加认证用户,类似于登录操作

    二:zookeeper ACL权限控制实战

    1.查看某个节点权限

    getAcl path

    1. [zk: localhost:2181(CONNECTED) 19] create /test_shao/test_node_xx
    2. Created /test_shao/test_node_xx
    3. [zk: localhost:2181(CONNECTED) 20] getAcl /test_shao/test_node_xx 
    4. 'world,'anyone
    5. : cdrwa
    6. ##这是所有节点的默认acl,表示所有连接到zookeeper 的客户端都能对该节点进行cdrwa操作(即拥有所有权限)

    2. 设置/修改 world 权限模式

    1. 1)设置或者修改 world 模式权限
    2. [zk: localhost:2181(CONNECTED) 21] setAcl /test_shao/test_node_xx world:anyone:cdra
    3. [zk: localhost:2181(CONNECTED) 22] getAcl /test_shao/test_node_xx
    4. 'world,'anyone
    5. : cdra
    6. #当前设置会覆盖节点之前的权限(注意不要轻易去掉节点的a权限,否则所有人都无法对其进行权限设置)
    7. 2)取消 world 权限模式的所有权限
    8. setAcl /test_shao/test_node_xx world:anyone:
    9. #不要在生产环境轻易做该参数

    3.设置/修改 ip 权限模式

    1. 1) 设置单个ip
    2. [zk: localhost:2181(CONNECTED) 23] getAcl /test_shao/test_node_xx
    3. 'world,'anyone
    4. : cdra
    5. [zk: localhost:2181(CONNECTED) 24] setAcl /test_shao/test_node_xx ip:127.0.0.1:cdrwa
    6. [zk: localhost:2181(CONNECTED) 25] getAcl /test_shao/test_node_xx
    7. 'ip,'127.0.0.1
    8. : cdrwa
    9. ##这时只有通过 127.0.0.1 这个ip登录的客户端,才能访问 /test_shao/test_node_xx 节点。同时我们看到之前该节点的 world 模式权限被覆盖掉了。
    10. 2) 设置ip地址段
    11. setAcl /test_shao/test_node_xx ip:192.168.1.0/16:cdrwa

    4.设置/修改 auth 权限模式

    1. 1)设置 auth 权限模式
    2. [zk: localhost:2181(CONNECTED) 26] addauth digest admin:root
    3. [zk: localhost:2181(CONNECTED) 27] getAcl /test_shao/test_node_xx
    4. 'ip,'127.0.0.1
    5. : cdrwa
    6. [zk: localhost:2181(CONNECTED) 29] setAcl /test_shao/test_node_xx auth:admin:cdra
    7. [zk: localhost:2181(CONNECTED) 30] getAcl /test_shao/test_node_xx
    8. 'digest,'admin:0sxEug2Dpm/NpzMPieOlFREd9Ao=
    9. : cdra
    10. ##使用 auth 模式前,需要先通过 addauth 命令创建授权用户(admin:后面是密码加密后的字符串),auth权限模式又覆盖了之前的ip模式权限
    11. 这时退出重新登录zk后发现没有 /test_shao/test_node_xx 的操作权限,使用授权用户后可以正常操作
    12. [zk: localhost:2181(CONNECTED) 0] get /test_shao/test_node_xx
    13. Insufficient permission : /test_shao/test_node_xx
    14. [zk: localhost:2181(CONNECTED) 1] addauth digest admin:root
    15. [zk: localhost:2181(CONNECTED) 2] get /test_shao/test_node_xx
    16. null

    5.设置/修改 digest 权限模式

    1. digest授权模式基于账号密码的授权模式,与Auth模式类似,只是他设置权限之前不用使用
    2. addauth digest username:password进行权限用户添加。
    3. 直接使用命令 setAcl path digest:username:password:acl 进行授权就行。只是这里的密码要使用加密后的密码,不能使用铭文密码。
    4. 可以使用linux命令进行
    5. echo -n username:password | openssl dgst -binary -sha1 | openssl base64 得到加密后的密码,这里的password是铭文密码
    6. [root@ecs-38198 ~]# echo -n admin:root | openssl dgst -binary -sha1 | openssl base64
    7. 0sxEug2Dpm/NpzMPieOlFREd9Ao=
    8. [zk: localhost:2181(CONNECTED) 3] delete /test_shao/test_node_xx
    9. [zk: localhost:2181(CONNECTED) 4] create /test_shao/test_node_xx "测试节点内容"
    10. Created /test_shao/test_node_xx
    11. [zk: localhost:2181(CONNECTED) 5] getAcl /test_shao/test_node_xx
    12. 'world,'anyone
    13. : cdrwa
    14. [zk: localhost:2181(CONNECTED) 6]
    15. [zk: localhost:2181(CONNECTED) 6] setAcl /test_shao/test_node_xx digest:admin:0sxEug2Dpm/NpzMPieOlFREd9Ao=:cdrwa
    16. [zk: localhost:2181(CONNECTED) 7] getAcl /test_shao/test_node_xx
    17. 'digest,'admin:0sxEug2Dpm/NpzMPieOlFREd9Ao=
    18. : cdrwa
    19. ##退出重新登录后,发现没有权限操作该节点,需要登录后才有权限操作
    20. zk: localhost:2181(CONNECTED) 0] get /test_shao/test_node_xx
    21. Insufficient permission : /test_shao/test_node_xx
    22. [zk: localhost:2181(CONNECTED) 1] addauth digest admin:root
    23. [zk: localhost:2181(CONNECTED) 2] get /test_shao/test_node_xx
    24. 测试节点内容

    6.同时设置多个权限模式

    1. #上面我们发现老的权限模式会被新的权限模式覆盖,如果想设置多种权限模式,可以在 setAcl 时同时指定多种权限模式通过逗号分割
    2. [zk: localhost:2181(CONNECTED) 7] setAcl /test_shao/test_node_xx ip:127.0.0.1:cdrwa,auth:admin:cdrwa,world:anyone:cdrwa,digest:admin:0sxEug2Dpm/NpzMPieOlFREd9Ao=:cdrwa
    3. [zk: localhost:2181(CONNECTED) 8] getAcl /test_shao/test_node_xx
    4. 'ip,'127.0.0.1
    5. : cdrwa
    6. 'digest,'admin:0sxEug2Dpm/NpzMPieOlFREd9Ao=
    7. : cdrwa
    8. 'world,'anyone
    9. : cdrwa
    10. 'digest,'admin:0sxEug2Dpm/NpzMPieOlFREd9Ao=
    11. : cdrwa

    8.设置超级权限

    Zookeeper管理员会因为某些客户端对某些节点设置了权限,而导致在紧急的情况下无法修改这些节点感到困扰。在这种情况下,管理员可以通过Zookeeper超级用户模式访问这些节点,一旦设置了超级权限访问节点,后续的操作就不需要check ACL了

    1. [zk: localhost:2181(CONNECTED) 4] setAcl /test_shao/test_node_xx world:anyone:r
    2. [zk: localhost:2181(CONNECTED) 5] getAcl /test_shao/test_node_xx
    3. 'world,'anyone
    4. : r
    5. [zk: localhost:2181(CONNECTED) 6] set /test_shao/test_node_xx "新的测试内容"
    6. Insufficient permission : /test_shao/test_node_xx
    7. [zk: localhost:2181(CONNECTED) 7] setAcl /test_shao/test_node_xx world:anyone:cdrwa
    8. Insufficient permission : /test_shao/test_node_xx
    9. ##通过上面一通操作后,我们发现我们没有权限写/test_shao/test_node_xx 节点了,这时候怎么办?(还有比如我们使用了auth或者digest 权限模式后,忘记了密码,怎么办?)
    10. 这时我们可以设置超级权限,重启zk
    11. 1) 在 zkEnv.sh 添加如下行
    12. export SERVER_JVMFLAGS="-Dzookeeper.DigestAuthenticationProvider.superDigest=super:g9oN2HttPfn8MMWJZ2r45Np/LIA= $SERVER_JVMFLAGS"
    13. #这里指定的用户名密码为 super:superpw ,可以通过如下命令生成加密后的密码
    14. [root@ecs-38198 bin]# echo -n super:superpw | openssl dgst -binary -sha1 | openssl base64
    15. g9oN2HttPfn8MMWJZ2r45Np/LIA=
    16. 2)执行 zkEnv.sh
    17. sh zkEnv.sh
    18. 3)重启 zk
    19. zkServer.sh stop
    20. zkServer.sh start
    21. 4)使用超级用户登录zk
    22. [zk: localhost:2181(CONNECTED) 0] getAcl /test_shao/test_node_xx
    23. 'world,'anyone
    24. : r
    25. [zk: localhost:2181(CONNECTED) 1] set /test_shao/test_node_xx "新的测试内容"
    26. Insufficient permission : /test_shao/test_node_xx
    27. [zk: localhost:2181(CONNECTED) 2] addauth digest super:superpw
    28. [zk: localhost:2181(CONNECTED) 3] set /test_shao/test_node_xx "新的测试内容"
    29. [zk: localhost:2181(CONNECTED) 4] get /test_shao/test_node_xx
    30. 新的测试内容
    31. [zk: localhost:2181(CONNECTED) 5] setAcl /test_shao/test_node_xx world:anyone:cdrwa
    32. [zk: localhost:2181(CONNECTED) 6] getAcl /test_shao/test_node_xx
    33. 'world,'anyone
    34. : cdrwa
    35. #这时我们看到我们可以正常操作节点的内容了,可以重新给该节点添加正确权限,让其他客户端能正常访问

  • 相关阅读:
    利用 Pandoc + ChatGPT 优雅地润色论文,并保持 Word 公式格式:Pandoc将Word和LaTeX文件互相转化
    旧电脑升级记录
    css-pseudo-class锚伪类
    JSR303参数校验与全局异常处理
    【目录】前端开发(JavaScript、Vue)
    基于Linux的智能家居(工厂模式)
    【单片机毕业设计选题24009】-基于单片机的智能窗帘控制系统设计
    Servlet【最复杂的hello world】
    单机多卡、多机多卡的艺术
    【UI自动化】Selenium输出发送的请求日志
  • 原文地址:https://blog.csdn.net/shaochenshuo/article/details/125994056