配置zookeeper的 ACL权限

一、简介

以下是从官网摘抄的,官网地址:https://zookeeper.apache.org/doc/r3.4.13/zookeeperProgrammers.html#sc_ZooKeeperAccessControl
ZooKeeper使用ACL来控制对其znode(ZooKeeper数据树的数据节点)的访问。ACL实现与UNIX文件访问权限非常相似:它使用权限位来允许/禁止针对节点及其所应用范围的各种操作。与标准UNIX权限不同,ZooKeeper节点不受用户(文件所有者),组和环境(其他)的三个标准范围的限制。ZooKeeper没有znode所有者的概念。而是,ACL指定一组ID和与这些ID关联的权限。

还请注意,ACL仅与特定的znode有关。特别是它不适用于儿童。例如,如果 / app仅可被ip:172.16.16.1读取,并且 / app / status是世界可读的,则任何人都可以读取/ app / status;ACL不是递归的。

ZooKeeper支持可插入身份验证方案。使用格式scheme:id来指定ID,其中scheme是ID对应的身份验证方案。例如,ip:172.16.16.1是地址为172.16.16.1的主机的ID 。

当客户端连接到ZooKeeper并对其进行身份验证时,ZooKeeper会将与该客户端相对应的所有ID与该客户端连接相关联。当客户端尝试访问节点时,将根据znodes的ACL检查这些ID。ACL由(scheme:expression,perms)对组成。表达式的格式特定于该方案。例如,该对(ip:19.22.0.0/16,READ) 为IP地址以19.22开头的任何客户端提供READ权限。

二、支持的权限类型

  • CREATE:可以创建一个子节点
  • READ:可以从节点获取数据并列出其子节点。
  • WRITE:可以为节点设置数据
  • DELETE:可以删除一个子节点
  • admin:可以设置权限

三、内嵌的ACL Schemes

  • world:所有者可以访问,默认权限
  • auth: 不使用任何ID,代表任何经过身份验证的用户。
  • digest: 使用用户名:密码字符串生成MD5哈希,然后将其用作ACL ID身份。通过以明文形式发送username:password来完成认证。在ACL中使用时,表达式将是username:base64 编码的SHA1 密码摘要
  • ip/域名: 使用客户端主机IP作为ACL ID身份。
  • super: 超级权限

四、权限测试

设置的格式说明:ACL的格式由::三段组成。

1、默认权限

[zk: 127.0.0.1(CONNECTED) 63] getAcl /
'world,'anyone  
: cdrwa  

其中cdrwa为CREATE,DELETE,READ,WRITE,ADMIN权限的缩写名称
默认权限代表所有的客户端都可以正常访问zookeeper,其中的schema为world(全世界),id只能为anyone

2、auth权限
这种授权不针对任何特点ID,而是对所有已经添加认证的用户。也就是说在进行设置ACL的时候,不用设置id值。
这种方式是以明文密码的方式来进行配置ACL的
使用方式

addauth digest <user>:<password> 
setAcl <path> auth:<id>:<acl>

示例:

[zk: 127.0.0.1(CONNECTED) 75] create /test1 '123'  #创建测试znode
[zk: 127.0.0.1(CONNECTED) 75] addauth digest user:password
[zk: 127.0.0.1(CONNECTED) 79] setAcl /test1 auth:user:password:r #设置当前路径的ACL权限,默认的user:password可以不用写,也就是 setAcl /test1 auth::r 这样,如果添加多个addauth,那么所有添加的用户对于改路径都有权限
[zk: 127.0.0.1(CONNECTED) 80] getAcl /test1          # 查看权限,可以发现对于user:password 这个用户只有r权限,同时查看权限的时候,发现密码已经经过加密处理了。        
'digest,'user:tpUq/4Pn5A64fVZyQ0gOJ8ZWqkY=
: r

切换一个zookeeper的终端进行测试;

[zk: localhost:2181(CONNECTED) 2] addauth digest user:password     # 切换到auth上下文环境
① 开始测试读权限
[zk: 127.0.0.1(CONNECTED) 81] ls /test1
[]
[zk: 127.0.0.1(CONNECTED) 82] get /test1
123

② 测试write权限
[zk: localhost:2181(CONNECTED) 4] set /test1 '124'
Authentication is not valid : /test1  # 发现是没有写权限的

③ 测试create权限
[zk: localhost:2181(CONNECTED) 5] create /test1/test11 '123'
Authentication is not valid : /test1/test11

④ 测试delete权限
[zk: localhost:2181(CONNECTED) 12] delete /test1   # 额,居然有delete权限
[zk: localhost:2181(CONNECTED) 13]

⑤ 测试 admin权限,这个权限并不是代表管理员的权限,仅仅只是是否有重新进行设置ACL的权限
[zk: localhost:2181(CONNECTED) 20] setAcl /test1 auth:user:password:ra
Authentication is not valid : /test1

3、digest
以加密的密码进行权限认证
使用方法

setAcl <path> digest:<user>:<password(密文)>:<acl>

密码的生成方式

echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64

eg:

(base) [root@localhost rsnmp]# echo -n testuser:12345 | openssl dgst -binary -sha1 | openssl base64
JAQXSDtqvFF3tJximvqJpWHdlBY=  # 这就是加密的密码

或者

java -cp /zookeeper-3.4.13/zookeeper-3.4.13.jar:/zookeeper-3.4.13/lib/slf4j-api-1.7.25.jar 
  org.apache.zookeeper.server.auth.DigestAuthenticationProvider 
  root:root

测试

[zk: localhost:2181(CONNECTED) 11] create /test2 '123'
Created /test2
[zk: localhost:2181(CONNECTED) 12] setAcl /test2 digest:testuser:JAQXSDtqvFF3tJximvqJpWHdlBY=:r

4、ip认证
也就是白名单
用法

setAcl path ip:ip地址:权限

eg:

[zk: localhost:2181(CONNECTED) 15] create /test3 '123'
Created /test3
[zk: localhost:2181(CONNECTED) 16] setAcl /test3 ip:127.0.0.1:cdrwa,ip:192.168.0.235:cdrwa
[zk: localhost:2181(CONNECTED) 17] getAcl /test3
'ip,'127.0.0.1
: cdrwa
'ip,'192.168.0.235
: cdrwa

注:zookeeper版本3.5以下的不支持设置网段的方式配置ACL,只有在3.5以上才支持
5、super
超级管理员权限,当在zookeeper里面配置很多的权限认证,也可能很多时候密码什么的都会忘记了,这时候可以设置super权限,来管理
假设这个超管是:super:admin
生成加密密码

(base) [root@localhost rsnmp]# echo -n super:admin | openssl dgst -binary -sha1 | openssl base64
xQJmxLMiHGwaqBvst5y6rkB6HQs=

配置zookeeper的zkServer.sh文件

需要添加:

"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="  #注:super后面的是生成的加密密码

重启zookeeper

[zk: localhost:2181(CONNECTED) 20] ls /test
Authentication is not valid : /test
[zk: localhost:2181(CONNECTED) 21] addauth digest super:admin   #切换到超级管理员的上下文
[zk: localhost:2181(CONNECTED) 22] ls /test                  
[test2, test1]
[zk: localhost:2181(CONNECTED) 23] delete /test/test1
[zk: localhost:2181(CONNECTED) 24] set /test/test2 '555'

如果hadoop需要连接带有ACL的zookeeper,需要配置相关的参数
借鉴:
https://blog.csdn.net/u010900754/article/details/78498291
https://www.jianshu.com/p/392248ab27f4
https://blog.csdn.net/qq_35440040/article/details/87911394 # hadoop配置zookeeper ACL

原文地址:https://www.cnblogs.com/yjt1993/p/13323565.html