乐趣区

关于zookeeper:zookeeper-ACL

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 权限管制
退出移动版