ACL权限控制命令

针对节点可以设置相关读写等权限,目的为了保障数据安全性

权限permissions可以指定不同的权限范围以及角色

ACL命令行

getAcl:获取某个节点的acl权限信息,语法:getAcl path

setAcl:设置某个节点的acl权限信息,语法:setAcl path

addauth:输入认证权限信息,注册时输入明文密码(登录),但是在zk的系统里,密码是以加密的形式存在的。语法:addauth scheme auth

#连接zk
$ zkCli.sh -server 127.0.0.1:2181
$ create /test 123
$ create /test/abc aaa
# 查看默认权限
$ getAcl /test/abc
'world,'anyone
:cdrwa

ACL的构成

zk的acl通过[scheme:id:permissions]来构成权限列表

  • scheme:代表采用某种权限机制

  • id:代表运行访问的用户

  • permissions:权限组合字符串

scheme

  • world:world下只有一个id,即只有一个用户,也就是anyone,那么组合的写法就是world:anyone:[permissions]

  • auth:代表认证登录,需要注册用户有权限就可以,形成为auth:user:password:[permissions]

  • digest:需要对密码加密才能访问,组合形式为digest:username:BASE64(SHA1(password)):[permissions]

简而言之,auth与digest的区别就是,前者明文,后者密文,setAcl/path auth:lee:lee:cdrwasetAcl/path auth:lee:BASE64(SHA1(lee)):cdrwa是等价的,在通过addauth digest lee:lee后都能啊哦做指定节点的权限

  • ip:当设置为ip指定的ip地址,此时限制ip进行访问,比如ip:192.168.1.1:[permissions]

  • super:代表超级管理员,拥有所有的权限。

permissions

权限字符串缩写:crdwa

  • CREATE:创建子节点

  • READ:获取节点/子节点

  • WRITE:设置节点数据

  • DELETE:删除子节点

  • ADMIN:设置分配以上权限的权利

ACL命令行学习

world:anyone:cdrwa

操作

$ ls /testacl
$ create /testacl/abc aa
$ getAcl /testacl/abc
#默认权限结果
'world,'anyone
:cdrwa
# 设置权限,并且其子节点没有删除权限*(不过 加a权限,后面将无法重新设置权限)
$ setAcl /testacl/abc world:anyone:crwa
# 查看权限
$ getAcl /testacl/abc
$ create /testacl/abc/bcd 123
$ delete /testacl/abc/bcd
# 权限结果
Authentication is not valid : /testacl/abc/bcd

# 重新设置权限
$ setAcl /testacl/abc world:anyone:rda
# 查看权限
$ getAcl /testacl/abc
# 成功删除
$ delete /testacl/abc/bcd
# ls /testacl/abc

# 重新设置权限,只能设置权限
$ setAcl /testacl/abc world:anyone:a
$ get /testacl/abc
# 结果无权限
Authentication is not valid : /testacl/abc
$ set /testacl/abc 123 
# 结果无权限
Authentication is not valid : /testacl/abc
# 重新设置权限,只能设置权限
$ setAcl /testacl/abc world:anyone:wa
# 设置完成,但没有读权限
$ set /testacl/abc 123
  • auth:user:pwd:cdrwa

  • digest:user:BASE64(SHA1(pwd)):cdrwa

  • addauth digest user:pwd

auth:user:pwd:cdrwa操作

$ create /names
$ ls /names
$ create /names revin revin
$ getAcl /names/revin
# 默认权限结果
'world,'anyone
:cdrwa

# 设置权限
$ setAcl /names/revin auth:revin:revin123:cdrwa
# 报错,因为需要一个这样的用户
Acl is not valid:/names/revin
# addauth digest revin:revin123
# 添加一个用户并登录,再次执行成功
# setAcl /names/revin auth:revin:revin123:cdrwa

$ getAcl /names/revin
# 权限结果
'digest,'revin:xxqweqweqweqweq=
:cdrwa

# 注意,当你再次授权给另外一个用户时,是无效的,只认第一次的
# setAcl /names/revin auth:hi:hi123:cdrwa
$ getAcl /names/revin
# 权限结果,不变
'digest,'revin:xxqweqweqweqweq=
:cdrwa
# 所以只认默认的revin:revin123,所以这时候也可以省略不写,匿名方式设置权限
# setAcl /names/revin auth:revin:revin123:crwa

digest:user:BASE64(SHA1(pwd)):cdrwa操作

ctrl+c 即可以退出之前所登录的revin用户就会自动退出

#连接zk
$ zkCli.sh -server 127.0.0.1:2181
$ ls /names
[revin]
$ create /names/test ttt
$ getAcl /names/test
# 默认权限结果
'world,'anyone
:cdrwa

# digest 需要密文的方式设置权限
$ setAcl /names/test digest:revin:xxqweqweqweqweq=:cdrwa
$ 登录用户
$ add auth digest revin:revin123
$ get /names/test

ip:192.168.1.1:[permissions]操作

$ create /names/ip ip
$ getAcl /names/ip
# 默认权限结果
'world,'anyone
:cdrwa

# 设置192.168.1.7操作权限
$ setAcl /names/ip ip:192.168.1.7:cdrwa

super超级管理员

super

1.修改zkServer.sh 增加super管理员

2.重启zkServer.sh

参考:【zookeeper】ACL super 超级管理员

# 连接zk,使用超级管理员登录即可操作
$ addauth digest xiaoming:xiaoming123

ACL的常用使用场景

  • 开发/测试环境分离,开发者无权操作测试库的节点,只能看

  • 生产环境上控制指定ip的服务可以访问相关节点,防止混乱

Last updated