zookeeper 提供简略的 ACL 性能, 用于对某个具体的 node 做根本的访问控制. 比方限度某个用户对 / a 这个节点只有只读权限.zookeeper 的 ACL 的粒度严格限度在 node 级别而且对父节点的 ACL 设置不会被子节点继承, 比方设置某用户 u1 对节点 / a 有只读权限后并不意味着用户 u1 对 /a/sub_a 的节点也是只读.
Note also that an ACL pertains only to a specific znode. In particular it does not apply to children. For example, if /app is only readable by ip:172.16.16.1 and /app/status is world readable, anyone will be able to read /app/status; ACLs are not recursive.
zookeeper 的 ACL 权限管制, 能够管制节点的读写操作, 保证数据的安全性,Zookeeper ACL 权限设置分为 3 局部组成, 别离是: 权限模式 (Scheme)、受权对象(ID)、权限信息(Permission). 最终组成一条例如scheme:id:permission
格局的 ACL 申请信息。
上面咱们具体看一下这 3 局部代表什么意思:
-
Scheme(权限模式): zookeeper 提供上面 5 种权限模式
- world: 默认, 任何人都有权限
- auth: 代表曾经认证通过的用户(cli 中能够通过 addauth digest user:pwd 来增加以后上下文中的受权用户)
- digest: 应用 username:password 字符串生成 MD5 哈希,并将其用作 ACL ID 标识。身份验证是通过明文发送用户名: 明码来实现的。当在 ACL 中应用时,表达式将是用户名:base64 编码的 SHA1 明码摘要。
- ip: 应用客户端主机 IP 作为 ACL ID 标识。ACL 表达式的模式是 addr/bits,其中 addr 的最无效位与客户端主机 IP 的最无效位相匹配
- x509
- 受权对象(ID): 受权对象就是说咱们要把权限赋予谁, 不同的 Scheme 有绝对应的 ID 类型, 对应于 5 种不同的权限模式来说, 如果咱们抉择采纳 IP 形式, 应用的受权对象能够是一个 IP 地址或 IP 地址段; 而如果应用 Digest, 则对应于一个用户名。如果是 World 模式,是受权零碎中所有的用户
-
权限信息(Permission): 权限就是指咱们能够在数据节点上执行的操作品种, 在 ZooKeeper 中曾经定义好的权限有 5 种:
- 数据节点(c: create)创立权限,授予权限的对象能够在数据节点下创立子节点;
- 数据节点(w: wirte)更新权限,授予权限的对象能够更新该数据节点;
- 数据节点(r: read)读取权限,授予权限的对象能够读取该节点的内容以及子节点的列表信息;
- 数据节点(d: delete)删除权限,授予权限的对象能够删除该数据节点的子节点;
- 数据节点(a: admin)管理者权限,授予权限的对象能够对该数据节点体进行 ACL 权限设置。
代码验证
咱们能够应用 setAcl
设置 ACL 也能够应用 getAcl
获取 ACL 信息
world 模式
world 模式就是任何连上 zookeeper 的人都有权限进行操作, 然而权限是能够变更的, 默认为cdrwa
, 也就是create
,delete
,read
,write
,admin
.
# 创立一个 node
[zk: localhost:2181(CONNECTED) 2] create /world_acl thinktik
Created /world_acl
# 获取 ACL 信息, 也就是默认的 ACL 信息
[zk: localhost:2181(CONNECTED) 3] getAcl /world_acl
'world,'anyone # 任何人都能够拜访
: cdrwa # create,delete,read,write,admin.
# 更新权限为 admin,create,delete
[zk: localhost:2181(CONNECTED) 4] setAcl /world_acl world:anyone:acd
#
[zk: localhost:2181(CONNECTED) 5] getAcl /world_acl
'world,'anyone
: cda
# 因为没有 read 权限, 所以尝试读取数据时会报错, 提醒没有权限
[zk: localhost:2181(CONNECTED) 6] get /world_acl
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /world_acl
IP 模式
# 创立一个节点
[zk: localhost:2181(CONNECTED) 0] create /ip_acl thinktik
Created /ip_acl
# 设置权限为只能 127.0.0.1 能够拜访, 权限为 crwda
[zk: localhost:2181(CONNECTED) 1] setAcl /ip_acl ip:127.0.0.1:crwda
# 查看权限
[zk: localhost:2181(CONNECTED) 2] getAcl /ip_acl
'ip,'127.0.0.1
: cdrwa
# 读取数据
[zk: localhost:2181(CONNECTED) 3] get /ip_acl
thinktik
# 批改权限, 去掉 read 权限
[zk: localhost:2181(CONNECTED) 4] setAcl /ip_acl ip:127.0.0.1:cwda
# 这时无奈读取了
[zk: localhost:2181(CONNECTED) 5] get /ip_acl
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /ip_acl
Auth 模式
[zk: localhost:2181(CONNECTED) 6] create /auth_acl thinktik
Created /auth_acl
# 减少受权用户, 明文用户名和明码
[zk: localhost:2181(CONNECTED) 7] addauth digest user1:password1
# 授予权限
[zk: localhost:2181(CONNECTED) 9] setAcl /auth_acl auth:user1:cdrwa
[zk: localhost:2181(CONNECTED) 10] getAcl /auth_acl
'digest,'user1:XDkd2dsEuhc9ImU3q8pa8UOdtpI=
: cdrwa
# 获取数据
[zk: localhost:2181(CONNECTED) 11] get /auth_acl
thinktik
如果从新连贯之后获取会报没权限, 须要增加受权用户
[zk: localhost:2181(CONNECTED) 1] get /auth_acl
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /auth_acl
# 须要增加受权用户
[zk: localhost:2181(CONNECTED) 2] addauth digest user1:password1
[zk: localhost:2181(CONNECTED) 3] get /auth_acl
thinktik
残余的 digest 和 X509 我就不详细描述了.
本文原创链接:zookeeper ACL
参考:
- ZooKeeper access control using ACLs
- zookeeper 的 ACL 权限管制