zookeeper默认提供的开放式操作权限,在实际部署中需要对节点的访问进行限制,这是就用到了zookeeper提供的ACL权限控制功能。
一.zookeeper的权限类型
-
c: 创建节点权限
-
r: 读取数据权限
-
w: 写入数据权限
-
d: 删除节点权限
-
a: 节点授权权限
二.zookeeper的授权类型
-
world:默认权限,开放式访问
-
auth:对当前已经登录用户授予权限
-
digest:指定用户名密码进行授权
-
ip: 指定ip地址进行授权
-
super: 超级管理员权限
三.zookeeper权限设置示例
查看节点权限
getAcl /test
登录用户
addauth digest <用户名>:<密码>
登录用户会将用户名注册到上下文中,在访问auth/digest授权的节点时,会根据上下文中存在的用户名进行权限校验
world授权
setAcl /test world:anyone:crwda
auth授权
setAcl /test auth::crwda
auth授权不需要指定用户,它会对当前上下文中已经登录的用户进行授权
digest授权
setAcl /test digest:<用户名>:<用户名:密码的密文>:crwda
digest是对指定用户进行授权,其中密码需要使用SHA1+BASE64密文,linux下可以使用如下命令对密码加密
echo -n <用户名>:<密码> | openssl dgst -binary -sha1 | openssl base64
ip授权
setAcl /test ip:127.0.0.1:crwda
多个授权使用逗号分隔
setAcl /test ip:127.0.0.1:crwda,auth::crwda
四.超级管理员权限
zookeeper是提供超级管理员权限的,它需要在每次服务启动是进行指定,在使用中如果检测到超级管理员的认证即可获得所有节点的访问权限
超级管理员设置方式
首先定义超级管理员的用户名密码,并获取SHA1+BASE64密文
echo -n root:123456 | openssl dgst -binary -sha1 | openssl base64
然后将用户名:密文配置到zookeeper的启动脚本zkServer.sh中,找到nohup启动命令,添加Dzookeeper.DigestAuthenticationProvider.superDigest启动参数
nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "-Dzookeeper.DigestAuthenticationProvider.superDigest=root:u53OoA8hprX59uwFsvQBS3QuI00="
最后重启服务,使用addauth登录超级管理员用户
addauth digest root:123456