概述
ACL,全称:access control list,与linux系统对文件的权限控制类似,主要涵盖三个方面:
- 权限模式(scheme):授权的策略
- 授权对象(id):anyone、ip地址
- 权限(permission)
特点如下:
- zookeeper的权限控制是基于每个znode节点的,对每个节点设置权限
- 每个znode支持设置多种权限控制方案核多个权限
- 子节点不会继承父节点的权限,客户端无权访问某节点,但是可以访问它的子节点。
授权模式
- world:默认授权模式,代表登录zookeeper的所有用户,anyone
- ip:对客户端使用ip地址认证
- auth:使用一个认证的用户认证
- digest:使用 用户名/密码 的方式认证
权限
- create:创建子节点
- delete:删除子节点(仅限于下一级节点)
- read:读取节点数据以及显示子节点列表
- write:设置节点数据
- admin:设置节点访问控制列表权限
相关命令
getAcl [-s] path
setAcl [-s] [-v version] [-R] path acl
addauth scheme auth
getAcl
代表针对登录zookeeper的所有用户拥有 创建、删除、读取、设置节点数据、设置权限列表的权限
setAcl
Auth授权模式
添加认证用户
addauth digest leolee:lyl512240816
用户名leolee,密码:xxxxxxx
认证用户授权
setAcl /node1 auth:leolee:cdrwa
查看认证用户授权后的权限
之后连接zookeeper之后,需要执行 addauth digest 用户名:密码 才可以操作 /node1 节点。
digest授权模式
该模式需要提供一个加密的密码。
授权命令
setAcl <path> digest:<user>:<password>:<acl>
计算密码的密文
在linux系统中使用如下命令:
echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64
执行之后会返回一个针对这个用户名的密码密文。
授权操作
使用密文设置授权
setAcl <path> digest:<user>:<密文>:<acl>
登录授权用户
addauth digest <user>:<密码明文>
之后就可以操作该节点了。
多种授权模式
针对某个节点可以同时使用多种授权模式进行授权。
setAcl <path> ip:<ip:port>:<acl>,auth:<user>:<acl>,digest:<user>:<密文>:<acl>
Acl超级管理员
zookeeper提供一个超级管理员模式,使用超管可以方便的访问呢任何权限的节点。比如在忘记认证用户密码的时候,就可以使用超管进行相应的权限操作。
设置超管
生成密码密文:
echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64
打开zookeeper目录下的/bin/zkServer.sh服务器启动脚本,找到如下信息:
nohup "$JAVA" $ZOO_DATADIR_AUTOCREATE "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" \
"-Dzookeeper.log.file=${ZOO_LOG_FILE}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
这是脚本中启动zookeeper的命令,默认是只有以上两个配置,超管模式需要增加一项配置:
"-Dzookeeper.DigestAuthenticationProvider.superDigest=<user>:<密码密文>"
之后启动zookeeper之后,就通过如下命令添加权限(登录超管用户):
addauth digest <超管用户名>:<密码明文>