`
gaoke
  • 浏览: 86753 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ZooKeeper ACL(Access Control List)访问控制列表

 
阅读更多

zk做为分布式架构中的重要中间件,通常会在上面以节点的方式存储一些关键信息,默认情况下,所有应用都可以读写任何节点,在复杂的应用中,这不太安全,ZK通过ACL机制来解决访问权限问题,详见官网文档:http://zookeeper.apache.org/doc/r3.4.6/zookeeperProgrammers.html#sc_ZooKeeperAccessControl

总体来说,ZK的节点有5种操作权限

CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写)

注:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限

 

身份的认证有4种方式

world:默认方式,相当于全世界都能访问
auth:代表已经认证通过的用户(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)
digest:即用户名:密码这种方式认证,这也是业务系统中最常用的
ip:使用Ip地址认证

 

Cli命令行下可以这样测试:

通过getAcl命令可以发现,刚创建的节点,默认是 world,anyone的认证方式,具有cdrwa所有权限

 

继续捣鼓:

先给/test增加了user1:+owfoSBn/am19roBPzR1/MfCblE的只读(r)权限控制,

说明:setAcl /test digest:用户名:密码:权限 给节点设置ACL访问权限时,密码必须是加密后的内容,这里的+owfoSBn/am19roBPzR1/MfCblE=,对应的原文是12345 (至于这个密文怎么得来的,后面会讲到,这里先不管这个),设置完Acl后,可以通过

getAcl /节点路径 查看Acl设置

然后get /test时,提示认证无效,说明访问控制起作用了,接下来:

addauth digest user1:12345 给"上下文"增加了一个认证用户,即对应刚才setAcl的设置

然后再 get /test 就能取到数据了

最后 delete /test 成功了!原因是:根节点/默认是world:anyone:crdwa(即:全世界都能随便折腾),所以也就是说任何人,都能对根节点/进行读、写、创建子节点、管理acl、以及删除子节点(再次映证了ACL中的delete权限应该理解为对子节点的delete权限)

 

刚才也提到了,setAcl /path digest这种方式,必须输入密码加密后的值,这在cli控制台上很不方便,所以下面这种方式更常用:

注意加框的部分,先用addauth digest user1:12345 增加一个认证用户,然后用 setAcl /test auth:user1:12345:r 设置权限,跟刚才的效果一样,但是密码这里输入的是明文,控制台模式下手动输入更方便。

 

好了,揭开加密规则:

1
2
3
4
5
6
7
static public String generateDigest(String idPassword)
        throws NoSuchAlgorithmException {
    String parts[] = idPassword.split(":"2);
    byte digest[] = MessageDigest.getInstance("SHA1").digest(
            idPassword.getBytes());
    return parts[0] + ":" + base64Encode(digest);
}

就是SHA1加密,然后base64编码  

 

代码使用:

zookeeper有一个很好用的客户端开源项目zkclient,官网地址为:http://github.com/zkclient ,其最新片0.7-dev已经支持ACL了(旧0.1版无此功能,所以推荐使用最新版),使用方法:

git clone https://github.com/sgroschupf/zkclient (把代码拉到本地)

修改

build.gradle 找到92行

把这一段干掉,否则编译时会出错

然后(windows环境,把./gradew 换成gradlew)

./gradlew test (测试)

./gradlew jars (编译生成jar包)

./gradlew install (安装到本机maven仓库)  

 

新建一个maven项目,pom.xml参考下面设置:

 View Code

 

然后写一段代码测试一下:

 

输出结果:

复制代码
test-data
节点创建成功!
---------------------
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /test
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /test
test-data
---------------------
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /test
new-data
---------------------
[31,s{'digest,'admin-user:mAlW21Phn07yOvWnKJYq2sCMoZw=}
]
---------------------
节点删除成功!
复制代码

从zkclient的使用结果看,与cli操作效果一样。  

 

最后:关于多级节点之间的ACL,并非继承关系,但是也有些一联系,这是初次接触ACL中比较难理解的地方:

从这张图上可以发现,子节点/a/b的控制权限范围(全世界都能做任何事)可以超出父节点的范围(仅限:user-a:pwd:a具有read/admin权限)

继续,看上面的这4条红线标注的地方,从上向下一个个解释:

红线1:因为/a只有user-a:pwd-a有ra权限,即:没用户具有c(create)权限,所以不能创建子节点

红线2:因为/a/b为world:anyone:cdrwa权限,即无限制,所以在/a/b下创建子节点b1,地球人已经无法阻止,创建成功

红线3:给/a/b/b1指定了user-b1:pwd-b1的da权限(即:delete+admin)

(注:重温下前面提到的setAcl 二种模式,

一种是setAcl /path digest:username:encrypedpwd:crwda 用这种方式时,encrypedpwd用户必须是密文

另一种方式是先addauth digest:usrname:password 先把授权信息加入上下文,这里password用的是明文,然后再setAcl /path auth:username:password:crdwa

所以如果在cli控制台测试,强烈建议用第二种方式,否则象上图中的方式用错了方式,pwd-b1在zk中被认为是密文,要解密出来几乎不可能,所以设置后,相当于这个节点就废了,因为你不知道密码,要操作该节点时,提供不了正确的认证信息)

红线4:还是刚才的理由,因为/a/b为world:anyone:cdrwa,没有限制,所以删除其下的子节点不受阻挡。

从上图可以看出,无法get父节点的内容,但是可以get子节点的内容,再次说明父、子节点的权限没直接关系,但是做delete时,上面的例子却遇到了麻烦:

想删除/a/b时,由于父节点/a的ACL列表里,只有ra权限,没有d权限,所以无法删除子节点。想删除/a时,发现下面还有子节点b,节点非空无法删除,所以这个示例就无解了(因为根据前面的操作,密码也还原不出来,也就无法修改ACL属性),而根节点/也无法删除,解决办法,只能到data目录里清空所有数据,再重启zk,但是这样就相当于所有数据全扔了,所以在设计ACL时,对于delete权限,要谨慎规划,在测试zk集群上做好测试,再转到生产环境操作。

 

最后给一些权限组合的测试结果:

要修改某个节点的ACL属性,必须具有read、admin二种权限

要删除某个节点下的子节点,必须具有对父节点的read权限,以及父节点的delete权限

 

参考文章:
https://ihong5.wordpress.com/2014/07/10/apache-zookeeper-acl-access-control-list-getting-permission-sets/

https://ihong5.wordpress.com/2014/07/24/apache-zookeeper-setting-acl-in-zookeeper-client/

https://ihong5.wordpress.com/2014/06/24/znode-types-and-how-to-create-read-delete-and-write-in-zookeeper-via-zkclient/

http://zookeeper.apache.org/doc/r3.4.6/zookeeperProgrammers.html#sc_ZooKeeperAccessControl

分享到:
评论

相关推荐

    zookeeper未授权访问修复建议

    ZooKeeper 的访问权限配置是通过 ACL(Access Control List)来实现的。ACL 是一种访问控制机制,通过设置不同的权限来控制用户对 ZooKeeper 节点的访问。 ZooKeeper 中的 ACL 由三部分组成:权限、用户和节点。 1...

    为zookeeper配置相应的acl权限

    Zookeeper 使用 ACL(Access Control List)来控制访问 Znode,ACL 的实现和 UNIX 的实现非常相似:它采用权限位来控制哪些操作被允许,哪些操作被禁止。但是和标准的 UNIX 权限不同的是,Znode 没有限制用户(user...

    Zookeeper权限控制代码

    Zookeeper的权限模型基于ACL(Access Control Lists),它提供了读(Read)、写(Write)、创建(Create)、删除(Delete)、管理员(Admin)五种基本权限。每个数据节点可以有多个ACL条目,每个条目由一个SID...

    zookeeper连接工具zktools

    4. **权限管理**:Zookeeper支持ACL(Access Control List)权限管理,ZkTools也提供了相应的操作接口,方便用户管理节点的访问权限。 5. **事务操作**:ZkTools支持执行多条操作指令作为一个事务,确保原子性和...

    ZooKeeper笔记.pdf

    - **创建ZNode**:使用`create`命令创建ZNode,例如`c:create /path data`,可以指定权限ACL(Access Control List)。 - **权限控制**:Zookeeper支持基于ZNode的访问控制,如`c`, `w`, `r`, `d`, `a`分别代表...

    zookeeper3八本

    9. **安全性**:Zookeeper支持ACL(Access Control List)权限控制,通过设置权限规则,可以限制不同用户对节点的操作。此外,可以通过SSL/TLS加密通信,提升安全性。 10. **监控与调试**:使用JMX(Java ...

    zookeeper-3.4.8

    8. 安全机制:Zookeeper提供了ACL(Access Control List)访问控制,可以对不同的节点设置不同的权限,增强了系统的安全性。 在实际应用中,我们需要了解如何配置Zookeeper集群,如何在Dubbo中集成Zookeeper,以及...

    zookeeper教程资料.zip

    1. 安全性:Zookeeper支持认证和授权,可以通过ACL(Access Control List)设置权限,保护数据安全。 2. 性能调优:包括调整数据存储路径、优化网络参数、合理设置session超时时间、监控系统资源等。 3. 监控与...

    zookeeper-3.5.3-beta配置版.zip

    - ACL(Access Control List):ZNode的访问控制列表,用于定义谁可以对ZNode进行什么操作。 - Watcher:观察者机制,允许客户端注册监听ZNode的变更,当ZNode发生变化时,ZooKeeper会向注册的客户端发送事件通知。 ...

    zookeeper.7z

    - **安全性**:Zookeeper 提供了 ACL(Access Control List)机制,用于保护数据的安全,防止未授权的访问。 了解并掌握 Zookeeper 的原理和实践,对于构建和维护大规模分布式系统是必不可少的。无论是开发者还是...

    zookeeper-3.3.6

    3. 安全性:Zookeeper支持基于ACL(Access Control List)的权限控制,可以对不同节点设置不同的访问权限。 四、Zookeeper-3.3.6的关键改进 1. 性能优化:3.3.6版本对网络通信进行了优化,提高了处理速度,降低了...

    Zookeeper概述、原理及应用汇总

    6. **ACL访问控制**:Zookeeper支持对ZNode的访问控制列表(Access Control List, ACL)设定,从而限制不同客户端对节点的访问权限。 综上所述,Zookeeper不仅是一种强大的分布式协调工具,还是实现复杂分布式系统不...

    zkui zookeeper可视化(下载解压后直接可用,不需要二次打包,方便快捷)

    ZKUI的主要功能包括:节点状态监控、会话管理、ACL(Access Control List)管理、节点数据查看和编辑等。用户可以通过ZKUI清晰地看到ZooKeeper集群中的各个节点状态,及时发现异常。会话管理可以帮助用户了解当前...

    zookeeper源码

    Zookeeper提供了丰富的Java和C语言API,包括创建、删除、更新ZNode,读取ZNode数据,设置Watch,以及获取ZNode的ACL(Access Control List)等操作。这些API使得开发人员能够方便地与Zookeeper交互,实现各种分布式...

    zookeeper-3.5.4

    通过ACL(Access Control List)策略,可以精确地控制每个Znode的访问权限,防止未授权的操作。同时,它支持多种认证方式,如SASL(Simple Authentication and Security Layer)和SSL,增强了网络传输的安全性。 在...

    zookeeper详解

    此外,每个Znode还具有ACL(Access Control List)属性,用于控制对该节点的访问权限。 3. **操作(Operations)**:Zookeeper定义了一系列的操作,如创建节点(`create`)、获取节点数据(`get`)、设置节点数据(`set`)、...

    ZooKeeper 面试题(30道ATM精选问题).pdf

    在ACL(Access Control List)权限控制方面,ZooKeeper支持UGO(User/Group/Others)权限控制,并提供了详细的权限管理机制,用于控制对Znode的访问。 ZooKeeper支持的Chroot特性类似于Linux系统中的chroot,它允许...

    zookeeper-api基础.zip

    Zookeeper提供ACL(Access Control List)机制进行权限控制,每个ZNode都可以有自己的访问控制策略。ACL由ID、权限和scheme组成,其中ID是权限的拥有者,scheme是权限认证方式,权限包括读、写、执行、创建子节点和...

Global site tag (gtag.js) - Google Analytics