Zookeeper权限模型

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简写描述
    createc可以创建子结点,create
    deleted可以删除子结点,delete、deleteall。就算没有删除权限也可以删除当前节点
    readr可以读取节点数据及子节点列表,get、ls
    writew可以修改结点数据,set
    admina可以修改结点访问控制权限列表,setAcl。不设置但是可以查看权限,getAcl

虽然父节点被设置了权限,但是创建的子节点默认权限是 world:anyone:cdrwa

权限操作

zookeeper可以通过 setAclgetAcl 命令来获取或设置节点的权限

  • 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

image20200629114124626.png

在zk1的docker容器中可以对 /aclnode 节点任意操作,因为之前已经用 addauth 命令登录了

image20200629114336044.png

退出连接后重新连接,发现未验证,需要重新登录

image20200629114435758.png

登录后,又可以操作啦

image20200629114500816.png

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超级管理员

  1. 假设这个超管的账号密码是 supper:admin

  2. 获取到这个密码的密文

    echo -n super:admin | openssl dgst -binary -sha1 | openssl base64
    # xQJmxLMiHGwaqBvst5y6rkB6HQs=
    
  3. 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="
    
  4. 重启ZK服务,用超管帐号登录

    addauth digest super:admin
    

    就可以用这个账号为所欲为了

# Zookeeper 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×