【七日打卡】什么是ZooKeeper的ACL权限控制

290 阅读4分钟

ACL权限控制

为什么要有ACL机制

  1. ZooKeeper中包含大量对数据节点的操作,如果关键的数据节点被错误删除了,就会对我们的系统产生很大的影响,因此需要给节点加上权限控制,拥有权限的客户端才可以执行相关操作。

  2. 为什么要发明ACL而不用Linux文件系统中的权限控制呢?

    官方文档这样说:

    ZooKeeper uses ACLs to control access to its znodes (the data nodes of a ZooKeeper data tree). The ACL implementation is quite similar to UNIX file access permissions: it employs permission bits to allow/disallow various operations against a node and the scope to which the bits apply. Unlike standard UNIX permissions, a ZooKeeper node is not limited by the three standard scopes for user (owner of the file), group, and world (other). ZooKeeper does not have a notion of an owner of a znode. Instead, an ACL specifies sets of ids and permissions that are associated with those ids.

    我的理解是Unix的User/Group/Others 满足不了复杂场景,所以ZooKeeper发明了ACL来实现权限控制。

基本概念

一个 ACL 权限设置通常可以分为 3 部分,分别是:权限模式(Scheme)、授权对象(ID)、权限信息(Permission)。最终组成一条例如“scheme : id : permission”格式的 ACL 请求信息。

权限模式:Scheme

权限模式是用来设置ZooKeeper服务端进行权限验证的方式。

一般分为两种:范围认证口令认证

  • 范围认证:ZooKeeper可以针对某一个IP或者某一段IP地址授予权限

    比如我们可以让一个 IP 地址为“ip:192.168.1.101”的机器对服务器上的某个数据节点具有写入的权限。或者也可以通过“ip:192.168.1.101/102”给一段 IP 地址的机器赋权。

  • 口令认证:可以理解为用户名 + 密码的方式

    在 ZooKeeper 中这种验证方式是 Digest 认证。

    Digest 这种认证方式首先在客户端传送“username:password”这种形式的权限表示符后,ZooKeeper 服务端会对密码 部分使用 SHA-1 和 BASE64 算法进行加密,以保证安全性。

    另一种权限模式 Super 可以认为是一种特殊的 Digest 认证。具有 Super 权限的客户端可以对 ZooKeeper 上的任意数据节点进行任意操作。

我们看一个Digest模式下客户端的使用方式。

//创建节点
create /digest_node1

//设置digest权限验证
setAcl /digest_node1 digest:用户名:base64格式密码:rwadc 

//查询节点Acl权限
getAcl /digest_node1 

//授权操作
addauth digest user:passwd

最后一种授权模式是 world 模式,其实这种授权模式对应于系统中的所有用户,本质上起不到任何作用。设置了 world 权限模式系统中的所有用户操作都可以不进行权限验证。

授权对象(ID)

授权对象就是说我们要把权限赋予谁。

  • IP模式下,授权对象就是一段或多段IP
  • 如果使用 Digest 或 Super 方式,则对应于一个用户名
  • 如果使用了World模式,则对应于授权系统中所有的用户

权限信息(Permission)

权限就是指我们可以在数据节点上执行的操作种类。

  • 数据节点(create):创建权限,授予权限的对象可以在数据节点下创建子节点;
  • 数据节点(wirte):更新权限,授予权限的对象可以更新该数据节点;
  • 数据节点(read):读取权限,授予权限的对象可以读取该节点的内容以及子节点的信息;
  • 数据节点(delete):删除权限,授予权限的对象可以删除该数据节点的子节点;
  • 数据节点(admin):管理者权限,授予权限的对象可以对该数据节点体进行 ACL 权限设置。

注意:每个节点都有维护自身的 ACL 权限数据,即使是该节点的子节点也是有自己的 ACL 权限而不是直接继承其父节点的权限。

总结

ZooKeeper的ACL机制用来保障一些关键的数据节点只能被有权限的客户端执行可执行的操作。

本文简单介绍了ACL机制的基本概念,没有深入讲述ACL机制的源码,读者可以自己翻看源码理解一下客户端和服务器对于ACL的处理。

笔者仔细翻看了一些文章和书籍,对ACL还是有一些不清楚的地方,下次找机会再分享吧。读者可以翻阅blog.51cto.com/zero01/2108…

参考资料

  1. zookeeper.apache.org/doc/r3.6.2/…
  2. 从Paxos到Zookeeper
  3. ZooKeeper源码分析与实战
  4. github.com/qiurunze123…
  5. www.runoob.com/w3cnote/zoo…
  6. ningg.top/zookeeper-l…
  7. blog.51cto.com/zero01/2108…