Zookeeper的权限模型是访问控制列表(Access Control List),简称ACL
权限格式
scheme:id:permission
-
scheme:采取什么方式授权
方案 描述 world 所有用户都是这个权限,id必须为anyone ip 只有指定的IP才有这个权限 auth 使用已添加认证的用户认证 digest 使用"用户名:密码"方式认证 -
id:授权对象,如果scheme是ip,那么id就是ip地址。如果是auth,id就是用户,多个对象用
,
分隔 -
permission:授予哪些权限,有5个。create(新增)、delete(删除)、read(查询)、writer(修改)、admin(修改权限),这5中权限可以分别简写成cdrwa。
权限 ACL简写 描述 create c 可以创建子结点,create delete d 可以删除子结点,delete、deleteall。就算没有删除权限也可以删除当前节点 read r 可以读取节点数据及子节点列表,get、ls write w 可以修改结点数据,set admin a 可以修改结点访问控制权限列表,setAcl。不设置但是可以查看权限,getAcl
虽然父节点被设置了权限,但是创建的子节点默认权限是 world:anyone:cdrwa
权限操作
zookeeper可以通过 setAcl
,getAcl
命令来获取或设置节点的权限
setAcl [-s] [-v dataVersion] [-R] path data
:设置权限getAcl [-s] path
:查看权限addauth scheme auth
:添加用户
World授权
用命令 create
创建的节点默认就是 world:anyone
模式的,并且拥有所有权限
IP授权
比如下面这条命令只允许 192.168.133.133
这个地址对 /aclnode
节点有删除、查询、修改、修改权限的权限。
setAcl /aclnode ip:192.168.133.133:drwa
# 也可以同时对多个ip地址授权,用 , 分隔
setAcl /aclnode ip:192.168.133.133,192.168.133.134:drwa
Auth授权模式
先添加一个用户,用户名是root,密码是123
addauth digest root:123
创建一个节点,scheme是auth,/aclnode
就只允许root这个用户操作啦
create /aclnode gg auth:root:cdwra
# 或者通过setAcl授权
setAcl /aclnode auth:root:cdwra
查看acl
在zk1的docker容器中可以对 /aclnode
节点任意操作,因为之前已经用 addauth
命令登录了
退出连接后重新连接,发现未验证,需要重新登录
登录后,又可以操作啦
Digest授权模式
和Auth授权模式的区别是,Digest需要加上用户加密后的密码
setAcl <path> digest:<user>:<password>:<acl>
加密后的密码可以通过下面这条命令获取
echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64
user和password是加密前的密码,举个例子:
echo -n root:123 | openssl dgst -binary -sha1 | openssl base64
# 输出:dqFD4/T6OaSbifsDlGaqTwLweYE=
dqFD4/T6OaSbifsDlGaqTwLweYE=
就是root用户加密后的密码
多模式授权
可以对一个节点同时用多个模式进行授权
setAcl /aclnode ip:192.168.133.132:cdrwa,auth:root:cdrwa,digest:bbj:673OfZhUE8JEFMcu0l64qI8e5ek=:cdrwa
允许 192.168.133.132
这个地址、root和bbj用户有所有权限
Acl超级管理员
-
假设这个超管的账号密码是
supper:admin
-
获取到这个密码的密文
echo -n super:admin | openssl dgst -binary -sha1 | openssl base64 # xQJmxLMiHGwaqBvst5y6rkB6HQs=
-
在
zkServer.sh
这个脚本nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"
后面加上"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="
。如:nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="
-
重启ZK服务,用超管帐号登录
addauth digest super:admin
就可以用这个账号为所欲为了