zookeeper ACL权限
原文链接:https://www.jianshu.com/p/392248ab27f4
对zookeeper设置ACL属性
我们以zkCli为例,来说明zookeeper对ACL的设置。
使用zkCli时,ACL的格式由<schema>:<id>:<acl>三段组成。
- schema:可以取下列值:world, auth, digest, host/ip
- id: 标识身份,值依赖于schema做解析。
- acl:就是权限:cdwra分别表示create, delete,write,read, admin
注意:zookeeper对权限的控制是znode级别的,不具有继承性,即子节点不继承父节点的权限。这种设计在使用上还是有缺陷的,因为很多场景下,我们还是会把相关资源组织一下,放在同一个路径下面,这样就会有对一个路径统一授权的需求。
- schema world
这是默认方式,表示没有认证。当创建一个新的节点(znode),而又没有设置任何权限时,就是这个值,例如:
[zk: localhost:2181(CONNECTED) 18] create /noacl 'noacl'
Created /noacl
[zk: localhost:2181(CONNECTED) 19] getAcl /noacl
'world,'anyone
: cdrwa
看到/noacl的ACL属于就是world schema的,因为它没有设置ACL属性,这样任何人都可以访问这个节点。
如果要手工设置这个属性,那么此时的id域只允许一个值,即anyone,格式如下:
setAcl /newznode world:anyone:crdwa
- schema auth
这种授权不针对任何特点ID,而是对所有已经添加认证的用户,换句话说,就是对所有已经通过认证的用户授权。
用法如下:
addauth digest <user>:<password>
setAcl <path> auth:<id>:<acl>
注意:
- 比须要先添加认证用户,否则会失败呢。如下所示:
[zk: localhost:2181(CONNECTED) 0] create /test 'test'
[zk: localhost:2181(CONNECTED) 1] setAcl /test auth::crdwa
Acl is not valid : /test
- setAcl命令中的id域是被忽略的,可以填任意值,或者空串,例如:`setAcl <path> auth::crdwa。因为这个域是忽略的,会把所有已经添加的认证用户都加进来。
举例:
[zk: localhost:2181(CONNECTED) 2] addauth digest tom1:tom1
[zk: localhost:2181(CONNECTED) 3] addauth digest tom2:tom2
[zk: localhost:2181(CONNECTED) 4] addauth digest tom3:tom3
[zk: localhost:2181(CONNECTED) 5] setAcl /test auth:tom2:crdwa
[zk: localhost:2181(CONNECTED) 6] getAcl /test
'digest,'tom1:ben+k/3JomjGj4mfd4fYsfM6p0A=
: cdrwa
'digest,'tom2:2iJM00A7+qkeKdEXt8Bhgq+IACw=
: cdrwa
'digest,'tom3:TAZPWLs6IaYRS8mlvcfyCOwyBJ8=
: cdrwa
这个例子中,我们先添加了三个认证用户tom1,tom2,tom3,然后通过setAcl设置ACL,命令中指定了id为tom2,根据前面的说法,这个id值是被忽略的,写任何值,甚至空值也得到一样的结果。我们看到最后getAcl查询出来的结果包含所有前面添加的三个认证用户。
补充说明:zkCli的命令addauth digest user:pwd
是用来添加当前上下文中的认证用户的:
addauth digest user1:password1(明文)
其实我不是很理解这个功能,难道在一个会话(session)里可以添加多个认证用户吗,那验证的时候按哪一个算呢;如果不同的用户有不同的授权会导致授权冲突吗?以谁为准?
几点总结:
- auth的id值是无效的,表示给所有认证用户设置acl权限。
1.1. 认证用户的添加,通过addauth命令(addauth digest <username>:<password>),只在当前会话(session)有效。 - 当使用addauth命令添加多个认证用户后,再用auth setAcl来设置acl时,那么所有之前addauth的用户都被会加入到acl中。
- 如果在当前会话中还没有认证过的用户就使用auth setAcl来设置acl权限时会失败,前面已经讨论过。
[zk: localhost:2181(CONNECTED) 1] setAcl /test auth::crdwa
Acl is not valid : /test
- 在auth setAcl之后再使用addauth添加的认证用户是没有acl权限的,必须重新执行auth setAcl来设置权限。
- 使用addauth添加的认证用户只在当前会话(session)有效,如果此时在另外一个会话中,不添加对应的认证用户,那么就没有相应访问权限的,而且如果再使用auth setAcl来设置acl权限,则会覆盖之前的acl权限信息,而且只会针对当前会话中的认证用户来设置acl权限。
所以这种授权方式更倾向于用作测试开发环境,而不是产品环境中。
- schema digest
这就是最普通的用户名:密码的验证方式,在一般业务系统中最常用。
格式如下:
setAcl <path> digest:<user>:<password(密文)>:<acl>
和schema auth相比,有两点不同:
- 第一不需要预先添加认证用户(但是在zkCli访问的时候,肯定还是要添加认证用户的)。
- 第二密码是经过sha1及base64处理的密文。
密码可以通过如下shell的方式生成:
echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64
例如:
echo -n root:root | openssl dgst -binary -sha1 | openssl base64
qiTlqPLK7XM2ht3HMn02qRpkKIE=
或者可以使用zookeeper的库文件生成:
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
root:root->root:qiTlqPLK7XM2ht3HMn02qRpkKIE=
输出的root:jalRr+knv/6L2uXdenC93dEDNuE=
就是传递给setAcl使用的id串。
setAcl /test2 digest:root:jalRr+knv/6L2uXdenC93dEDNuE=:rwdca
注意,只有通过zkCli.sh设置digest的ACL时id才需要密文,而通过zookeeper的客户端设置digest的ACL时对应的auth数据是明文。这个属于编码实现的问题了。
和auth比较,digest有如下特性:
- setAcl不需要事先添加认证用户。
- 授权是针对单个特定用户。
- setAcl使用的密码不是明文,是sha1摘要值,无法反推出用户密码内容。
- schema host/ip
就是客户机地址,或者是主机名、或者是IP地址。
主机名可以是单个主机名,也可以是域名。IP可以是单个IP地址,也可以是IP地址段,比如ip:192.168.1.0/16。
这个不细说了,比较简单,也没有验证过。
- super用户
设置一个超级用户,这个超级用户的设置必须在zookeeper内部,zookeeper启动之前设置好。在这种scheme情况下,超级用户具有超级权限,可以做任何事情(cdrwa),不需要授权。
5.1 设置zookeeper环境变量SERVER_JVMFLAGS:
export SERVER_JVMFLAGS="-Dzookeeper.DigestAuthenticationProvider.superDigest=root:qiTlqPLK7XM2ht3HMn02qRpkKIE="
5.2 重启zookeeper
创建/test节点,并且设置acl为jerry1用户。
[zk: localhost:2181(CONNECTED) 0] create /test 'test'
Created /test
[zk: localhost:2181(CONNECTED) 1] setAcl /test digest:jerry1:dJJW56m9FIOfUDDHVC5wVWNsFEo=:rwdca
[zk: localhost:2181(CONNECTED) 2] getAcl /test
'digest,'jerry1:dJJW56m9FIOfUDDHVC5wVWNsFEo=
: cdrwa
5.3 添加认证用户tom
[zk: localhost:2181(CONNECTED) 3] addauth digest tom:tom
5.4 访问节点/test
[zk: localhost:2181(CONNECTED) 4] get /test
Authentication is not valid : /test
这时失败,因为tom用户没有权限。
5.3 添加认证用户root
[zk: localhost:2181(CONNECTED) 6] addauth digest root:root
5.4 再次访问节点/test
[zk: localhost:2181(CONNECTED) 6] get /test
test
...
成功,虽然root也没有在/test的acl列表里面(是有jerry1),但是也能访问,因为root在zookeeper集群里面被配置成了超级用户。
zookeeper ACL权限的更多相关文章
- Zookeeper Acl权限 超级用户权限 怎么跳过ACL密码/账户验证
Zookeeper的一个节点不知道什么原因无法删除了,查看日志发现是没有权限, 我们之前使用ACL进行Zookeeper节点的权限管理. 可以解决以下三种但不限于以下三种问题: 1.在设置Acl权限时 ...
- 1.ZooKeeper ACL权限控制
参考:https://blog.csdn.net/liuxiao723846/article/details/79391650 ZK 类似文件系统,Client 可以在上面创建节点.更新节点.删除节点 ...
- Solr Zookeeper ACL权限配置
首先注意:在配置ACL的时候,请关闭solr运行实例!!否则可能对集群造成不可恢复的损坏 开始: 1.修改solr.xml,在solrCloud节点添加,告诉solr要使用的provider: < ...
- ZooKeeper ACL权限设置
ZK的节点有5种操作权限:CREATE.READ.WRITE.DELETE.ADMIN 也就是 增.删.改.查.管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写)注:这5种权限中,del ...
- zookeeper的ACL权限控制
ACL:Access Control List 访问控制列表 1. 简介 0.概述 ACL 权限控制,使用:scheme:id:perm 来标识,主要涵盖 3 个方面: 权限模式(Scheme): ...
- ZooKeeper学习之路(五)—— ACL权限控制
一.前言 为了避免存储在Zookeeper上的数据被其他程序或者人为误修改,Zookeeper提供了ACL(Access Control Lists)进行权限控制.只有拥有对应权限的用户才可以对节点进 ...
- ZooKeeper系列(五)—— ACL 权限控制
一.前言 为了避免存储在 Zookeeper 上的数据被其他程序或者人为误修改,Zookeeper 提供了 ACL(Access Control Lists) 进行权限控制.只有拥有对应权限的用户才可 ...
- zookeeper ACL(access control lists)权限控制
基本作用: 针对节点可以设置 相关读写等权限,目的为了保障数据安全性 权限permissions可以制定不同的权限范围以及角色 一:ACL构成 zk的acl ...
- ZooKeeper的ACL权限
ACL控制权限 什么是ACL(Access Control List访问控制列表) 针对节点可以设置相关读写等权限, 目的为了保障数据安全性 权限permission可以指定不同的权限范围以及角色 A ...
随机推荐
- php生成pdf,php+tcpdf生成pdf, php pdf插件
插件例子:https://tcpdf.org/examples/ 下载tcpdf插件: demo // Include the main TCPDF library (search for insta ...
- window对象(全局对象)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 洛谷 P1379 八数码难题 题解
我个人感觉就是一道bfs的变形,还是对bfs掌握不好的人有一定难度. 本题思路: 大体上用bfs搜,用map来去重,在这里只需要一个队列,因为需要较少步数达到的状态一定在步数较多的状态之前入队列. # ...
- Oracle 对比insert和delete操作产生的undo
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/wangqingxun/article/de ...
- Lightning Web Components 来自salesforce 的web 组件化解决方案
Lightning Web Components 是一个轻量,快速,企业级别的web 组件化解决方案,官方网站也提供了很全的文档 对于我们学习使用还是很方便的,同时我们也可以方便的学习了解salesf ...
- [RN] React Native 实现 FlatList上拉加载
FlatList可以利用官方组件 RefreshControl实现下拉刷新功能,但官方没有提供相应的上拉加载的组件,因此在RN中实现上拉加载比下拉刷新要复杂一点. 不过我们仍可以通过FlatList ...
- Web前端社交账号注册按钮
[外链图片转存失败(img-vXBQK5k4-1564155857781)(https://upload-images.jianshu.io/upload_images/11158618-ceccff ...
- USACO 奶牛抗议 Generic Cow Protests
USACO 奶牛抗议 Generic Cow Protests Description 约翰家的N头奶牛聚集在一起,排成一列,正在进行一项抗议活动.第i头奶牛的理智度 为Ai,Ai可能是负数.约翰希望 ...
- kvm错误:failed to initialize KVM: Permission denied
错误1: 启动kvm容器报错: # virsh start hadoop-test error: Failed to start domain hadoop-testerror: internal e ...
- windows批量删除当前目录以及子目录的所有空文件夹
在桌面创建一个记事本,将以下内容复制粘贴到记事本中,将记事本的拓展名修改为bat即可,然后将该文件放到需要执行的目录双击. @echo off setlocal enabledelayedexpans ...