文章目录
一、简介
以下是从官网摘抄的,官网地址:ZooKeeper Programmer’s Guide。
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方案
以下是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
其中 cdrwa
为 CREATE, 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
。我们想要修改怎么办?
- 将权限恢复成
world
形式
setAcl / world:anyone:cdrwa # 设置该节点的ACL为所有权限
- 重新赋权即可
setAcl / auth:user:password:cdrwa #重新赋权
3. zookeeper canary 报错
在生产环境中,我们是使用了 CDH
来管理大数据组件。当我们对 /
目录添加了 ACL
权限后,会导致 CM
在监测 zookeeper
服务状态时报错。因为他的机制是:定时在 /
目录下创建一个节点,然后删除。以此来检测 zookeeper
服务的可用性。我们添加了 /
的权限,就会失败。
如何解决:
- 创建一个
zk node
名称为cloudera_manager
# 连接zookeeper 服务端
create /cloudera_manager # 创建节点
- 修改 zookeeper 参数
zookeeper_canary_root_path=/cloudera_manager/cloudera_manager_zookeeper_canary
注意:修改完参数后,无需重启 zookeeper 服务,该配置能直接生效
查看 CM 告警,问题解决!
转载:https://www.cnblogs.com/yjt1993/p/13323565.html