Zookeeper的ACL控制探讨

Zookeeper的ACL控制探讨

前言

在利用Zookeeper编写配置管理示例程序时, 关于ACL权限控制一直有疑惑, 特别是对节点的五种权限分别控制用户的什么行为不清楚. Google、百度了不少文章发现大部分只介绍了如何进行权限认证,对权限控制的行为以及对象粗略带过, 即使写了这部分内容也有不少问题. 基于这些原因, 我查阅了官方文档并且做了不少测试来验证权限控制的行为.

一. 身份认证

身份认证网上讨论较多,这里简单介绍一下. Zookeeper提供5种schema身份认证方式:

  • world: 它下面只有一个id, 叫anyone, world:anyone代表任何人.
  • auth: 它不需要id, 只要是通过authentication的user都有权限(zookeeper支持通过kerberos来进行authencation, 也支持username/password形式的authentication).
  • digest: 它对应的id为username:BASE64(SHA1(password)),它需要使用username:password方式进行认证. 这是业务系统最常用的认证方式.
  • ip: 它对应的id为客户机的IP地址,设置的时候可以设置一个ip段,比如ip:192.168.1.0/16, 表示匹配前16个bit的IP段.
  • super: 在这种scheme情况下,对应的id拥有超级权限,可以做任何事情(cdrwa).

二. 节点权限

节点的权限是和某个具体的id绑定的,如果某个id对一个znode有rw权限, 即表示注册这个id的session对该节点有read和write权限.

1. 官方文档:

ZooKeeper supports the following permissions:
* CREATE: you can create a child node. 能够创建子节点
* READ: you can get data from a node and list its children. 能够获取节点数据并且获取节点的子节点列表
* WRITE: you can set data for a node. 能够设置节点数据
* DELETE: you can delete a child node. 能够删除子节点
* ADMIN: you can set permissions. 能够给节点设置ACL

2. create权限

create: 针对节点的子节点的, 如果这个id没有该节点的create权限, 那么它无法为该节点创建子节点.

[zk: 127.0.0.1:2181(CONNECTED) 17] create /a a
Created /a
[zk: 127.0.0.1:2181(CONNECTED) 18] setAcl /a digest:user1:oMOD60B8cRkgiY51xfdG0FFW3FI=:drwa
...                                                             // user1拥有/a的drwa权限
[zk: 127.0.0.1:2181(CONNECTED) 19] getAcl /a
'digest,'user1:oMOD60B8cRkgiY51xfdG0FFW3FI=
: drwa
[zk: 127.0.0.1:2181(CONNECTED) 2] addauth digest user1:user1    // 为当前session注册user1用户,即当前连接拥有/a的drwa权限
[zk: 127.0.0.1:2181(CONNECTED) 23] create /a/b ab
Authentication is not valid : /a/b                              // 创建/a/b失败
[zk: 127.0.0.1:2181(CONNECTED) 24] ls /a
[]
------
分析: user1没有/a节点的create权限,因此给/a创建子节点失败.
3. delete权限

delete: 针对节点的子节点的, 如果这个id没有该节点的delete权限, 那么它无法删除该节点的子节点.

[zk: 127.0.0.1:2181(CONNECTED) 6] create /a a
Created /a
[zk: 127.0.0.1:2181(CONNECTED) 7] setAcl /a digest:user1:oMOD60B8cRkgiY51xfdG0FFW3FI=:crwa
...                                                             // user1拥有/a的crwa权限
[zk: 127.0.0.1:2181(CONNECTED) 8] getAcl /a
'digest,'user1:oMOD60B8cRkgiY51xfdG0FFW3FI=
: crwa
[zk: 127.0.0.1:2181(CONNECTED) 10] addauth digest user1:user1
[zk: 127.0.0.1:2181(CONNECTED) 11] create /a/b ab
Created /a/b                                                    // user1拥有/a的create权限,创建子节点成功
[zk: 127.0.0.1:2181(CONNECTED) 12] ls /a
[b]
[zk: 127.0.0.1:2181(CONNECTED) 13] delete /a/b
Authentication is not valid : /a/b                              // 删除/a的子节点失败
[zk: 127.0.0.1:2181(CONNECTED) 14] ls /a
[b]
------
分析: user1有/a节点的create权限,因此创建/a/b节点成功,但是user1没有/a节点的delete权限,因此删除/a/b节点失败.
4. 多级节点权限

多级节点的权限没有继承关系, 即子节点并不会继承父节点对某个id的权限设置. 没有继承关系并不是指没有关系,父节点的create和delete权限操作对象就是子节点.

[zk: 127.0.0.1:2181(CONNECTED) 1] getAcl /a
'digest,'user1:oMOD60B8cRkgiY51xfdG0FFW3FI=
: crwa
[zk: 127.0.0.1:2181(CONNECTED) 2] ls /a
Authentication is not valid : /a                                // 当前连接不具有/a的crwa权限
[zk: 127.0.0.1:2181(CONNECTED) 3] getAcl /a/b
'world,'anyone
: cdrwa                                                         // 任何人都有节点/a/b的全部权限
[zk: 127.0.0.1:2181(CONNECTED) 4] ls /a/b                       // read子节点列表权限
[]
[zk: 127.0.0.1:2181(CONNECTED) 5] create /a/b/c abc             // create子节点权限
Created /a/b/c
[zk: 127.0.0.1:2181(CONNECTED) 6] delete /a/b/c                 // delete子节点权限
[zk: 127.0.0.1:2181(CONNECTED) 7] ls /a/b
[]
[zk: 127.0.0.1:2181(CONNECTED) 8] get /a/b                      // read节点内容权限
ab
...
[zk: 127.0.0.1:2181(CONNECTED) 9] set /a/b ababab               // write节点内容权限
...
[zk: 127.0.0.1:2181(CONNECTED) 10] get /a/b
ababab
...
[zk: 127.0.0.1:2181(CONNECTED) 12] setAcl /a/b digest:user1:oMOD60B8cRkgiY51xfdG0FFW3FI=:rwa
...                                                             // admin:给节点设置acl权限
[zk: 127.0.0.1:2181(CONNECTED) 13] getAcl /a/b
'digest,'user1:oMOD60B8cRkgiY51xfdG0FFW3FI=
: rwa                                                           // 权限已经设置为user1拥有read、write、admin权限
[zk: 127.0.0.1:2181(CONNECTED) 14] get /a/b
Authentication is not valid : /a/b                              // 当前连接并没有注册user1用户, 因此无权read的/a/b节点内容
------
分析: 当前session并没有/a的权限, 因此无法操作/a. 节点/a/b被设置为任何人都有权限, 当前session在不具备/a的操作权限下, 可以对/a/b节点成
功进行create、delete、read、write和admin操作,因此证明子节点并不会继承父节点的权限设置.
5. 总结
  • 给某个节点设置的权限一定是和某个具体的id绑定的, 一个节点可以设置多个id且可以拥有不同的权限.
  • 节点的五种权限中, admin、read、write针对节点本身, create和delete则针对子节点, 反应了该节点可以对子节点进行什么操作.
  • 子节点和父节点之间的ACL并不存在继承关系, 每个节点的ACL都可以自由选择添加与否.

三. 参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值