Zookeeper ACL机制

权限介绍

Zookeeper权限管理(ACL)支持5种权限

  • CREATE:创建子节点

  • READ:获取本节点数据、节点信息及子节点列表

  • DELETE:删除子节点

  • WRITE:设置本节点数据

  • ADMIN:设置本节点权限

 

权限设置

语法

setAcl [-s] [-v version] [-R] path acl

注:-s 表示节点为顺序节点

        -v 指定节点版本号

        -R 递归应用相同权限到其子节点

        

acl表示权限列表,我们先看一下acl的格式是什么

[zk: 127.0.0.1:2181(CONNECTED) 2] setAcl /zookeeper rw
rw does not have the form scheme:id:perm
Acl is not valid : /zookeeper

可以看出,acl的格式为

scheme:id:perm

scheme

id

perm

description 

world

有唯一id,id为anyon

rwadc

创建节点的默认权限,授权模式为world:anyone:rwadc,所有客户端对该节点有rwadc权限

auth

id为username:passwd(需要提前注册)

rwadc

任何通过认证的用户均可访问操作

digest

id为username:passwd

rwadc

其中passwd为md5编码,即先进行sha1编码再进行base64编码

host

id为用户主机名

rwadc

主机名也可以是后缀,如baidu.com,则可以匹配host1.baidu.com、host2.baidu.com。

ip id为客户端的IP地址

rwadc

IP格式可以为addr/bits

举例说明

  • auth授权方式

[zk: localhost:2181(CONNECTED) 1] create /auth auth
Created /auth
[zk: localhost:2181(CONNECTED) 3] getAcl /auth                        # 默认的Acl为world
'world,'anyone
: cdrwa
[zk: localhost:2181(CONNECTED) 4] setAcl /auth auth:zookeeper:zookeeper:rwadc        # 设置Acl为auth,结果失败
Acl is not valid : /auth
[zk: localhost:2181(CONNECTED) 5] addauth digest zookeeper:zookeeper                 # 需要先增加auth的id
[zk: localhost:2181(CONNECTED) 6] setAcl /auth auth:zookeeper:zookeeper:rwadc
[zk: localhost:2181(CONNECTED) 7] getAcl /auth
'digest,'zookeeper:4lvlzsipXVaEhXMd+2qMrLc0at8=
: cdrwa

注:可以看到,设置成功后的Acl的id中,passed已经过md5加密

  • digest授权方式

该方式和auth差不多,不同在于id不需要提前注册

[zk: localhost:2181(CONNECTED) 8] create /digest digest
Created /digest
[zk: localhost:2181(CONNECTED) 9] setAcl /digest digest:zookeeper:zookeeper:rwadc
[zk: localhost:2181(CONNECTED) 10] getAcl /digest
Authentication is not valid : /digest
[zk: localhost:2181(CONNECTED) 16] getAcl /digest
'digest,'zookeeper:zookeeper
: cdrwa

注:可以看出设置成功后的Acl中id未经过任何加密处理

这样的话就需要我们自己先进行加密处理,然后再设置Acl,不然若直接设置Acl,则将无法访问,永远失去该节点的访问权限。正如上面的getAcl操作提示

[zk: localhost:2181(CONNECTED) 10] getAcl /digest
Authentication is not valid : /digest

加密方式

# 正确的加密方式

# 正确的加密方式
$ echo -n zookeeper:zookeeper | openssl dgst -binary -sha1 | openssl base64
4lvlzsipXVaEhXMd+2qMrLc0at8=

# 错误的加密方式
$ echo zookeeper:zookeeper | openssl dgst -binary -sha1 | openssl base64
VWUr1lLcb0QrQUJmK+WEKUYYnV4=
$ echo -n zookeeper:zookeeper | sha1sum |base64
ZTI1YmU1Y2VjOGE5NWQ1Njg0ODU3MzFkZmI2YThjYWNiNzM0NmFkZiAgLQo=

然后重新设置Acl

[zk: localhost:2181(CONNECTED) 21] setAcl /digest digest:zookeeper:4lvlzsipXVaEhXMd+2qMrLc0at8=:rwadc
[zk: localhost:2181(CONNECTED) 22] getAcl /digest
'digest,'zookeeper:4lvlzsipXVaEhXMd+2qMrLc0at8=
: cdrwa

之后就可以通过addauth的方式访问了

[zk: localhost:2181(CONNECTED) 0] get /digest
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /digest
[zk: localhost:2181(CONNECTED) 1] getAcl /digest
Authentication is not valid : /digest
[zk: localhost:2181(CONNECTED) 2] addauth digest zookeeper:zookeeper
[zk: localhost:2181(CONNECTED) 3] get /digest
digest
[zk: localhost:2181(CONNECTED) 4] getAcl /digest
'digest,'zookeeper:4lvlzsipXVaEhXMd+2qMrLc0at8=
: cdrwa

 

忘记密码怎么办?

  1. 如果有/目录的权限,可通过delete删除子节点,重新设置

  2. 通过设置配置文件skipAcl=yes,重启服务跳过所有的Acl检测,生产环境不推荐使用,最好是限制只能本地访问的时候进行,防止其他用户操作其他节点。

 

ACL机制的缺陷

  1. ACL 无递归机制,任何znode节点都需要单独设置,子节点无法继承父节点的ACL设置
  2. ACL仅仅是访问控制,并非是权限管理,有很多局限性

 

你可能感兴趣的:(zookeeper,ACL,机制,权限,Zookeeper学习笔记)