【zookeeper】zookeeper的 ACL权限学习

一、简介

以下是从官网摘抄的,官网地址:ZooKeeper Programmer’s Guide

ZooKeeper使用ACL来控制对其 znodeZooKeeper数据树的数据节点)的访问。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方案

以下是ZooKeeper支持的内置ACL方案:

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

四、权限测试

1. 默认权限

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

示例:

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

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

2. auth权限

这种授权不针对任何特定ID,而是对所有已经通过身份验证的用户。也就是说在设置ACL时,不用设置ID值。这种方式是以明文密码的方式来进行配置ACL。

使用方式:

addauth digest <user>:<password>
setAcl <path> auth::<perms>

示例:

[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上下文环境

1. 开始测试读权限
[zk: 127.0.0.1(CONNECTED) 81] ls /test1
[]
[zk: 127.0.0.1(CONNECTED) 82] get /test1
123

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

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

4. 测试delete权限
[zk: localhost:2181(CONNECTED) 12] delete /test1   # 有delete权限
[zk: localhost:2181(CONNECTED) 13]

5. 测试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(密文)>:<perms>

密码的生成方式:

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

例如:

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

或者使用Java命令生成:

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_address>:<perms>

例如:

[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="

重启ZooKeeper后,可以使用super权限管理,例如:

[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'

这样,使用super权限可以进行管理操作。

五、扩展

1. 忘记密码修复方式

如果对上述设置授权后,忘记密码了,怎么办?方法如下:

进入配置文件zoo.cfg,修改配置,设置跳过Acl验证,配置如下:

skipACL=yes

然后重启zookeeper。

启动后,可按照第一节所述的方式,重新进行Acl设置即可。

2. 赋权错误修复方式

我们在设置密码时,如 admin:admin 写错了,写成了 admin:adimn。我们想要修改怎么办?

  1. 将权限恢复成 world 形式
setAcl / world:anyone:cdrwa   # 设置该节点的ACL为所有权限
  1. 重新赋权即可
setAcl / auth:user:password:cdrwa #重新赋权

3. zookeeper canary 报错

在生产环境中,我们是使用了 CDH 来管理大数据组件。当我们对 / 目录添加了 ACL 权限后,会导致 CM 在监测 zookeeper 服务状态时报错。因为他的机制是:定时在 / 目录下创建一个节点,然后删除。以此来检测 zookeeper 服务的可用性。我们添加了 / 的权限,就会失败。

在这里插入图片描述

如何解决:

  1. 创建一个 zk node 名称为 cloudera_manager
# 连接zookeeper 服务端
create /cloudera_manager # 创建节点
  1. 修改 zookeeper 参数
    在这里插入图片描述
zookeeper_canary_root_path=/cloudera_manager/cloudera_manager_zookeeper_canary

注意:修改完参数后,无需重启 zookeeper 服务,该配置能直接生效

查看 CM 告警,问题解决!

转载:https://www.cnblogs.com/yjt1993/p/13323565.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值