Zookeeper系列(三)——Zookeeper的ACL权限控制

语言: CN / TW / HK

theme: smartblue

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

概述

通过Zookeeper实现的的分布式锁、配置管理等功能,本质上就是操作数据节点Znode,如果不针对Znode做一定的访问权限控制,那么很容易被其他人误删,引起严重的后果。

说到 ACL 权限控制大家应该不会陌生,比如 Linux 系统将对文件的使用者分为三种身份,即 User、Group、Others。使用者对文件拥有读(read) 写(write)以及执行(execute)3 种方式的控制权。这种权限控制方式相对比较粗糙,而Zookeeper的ACL权限控制更加强大。

系列文章见Zookeeper系列笔记,带你入门到精通

Zookeeper的ACL详解

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

setAcl /digest_node1 ip:127.0.0.1:crwda

权限模式(Scheme)

通俗的来说,就是采用哪种方式进行权限认证,一共由6中方式。

| 权限模式 | 说明 | | -------- | ----------------------------------------------------------- | | world | 表示任何人都能访问操作节点 | | auth | 代表已经认证通过的用户(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户) | | digest | 采用用户名密码的认证方式 | | ip | 使用客户端ip的认证方式 |

授权对象(ID)

授权对象意味着哪些对象有权限,给谁授予权限,不同权限模式下的授权对象都是不一致的。

| 权限模式 | 授权对象 | 例子 | | -------- | ------------------------------------------------------------------------------- | ---------------------------- | | world | 永远只有一个授权对象,anyone | anyone | | auth | 授权的用户名,cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户,如addauth digest alvin:pwd | alvin | | digest | password需要加密处理,格式如username:base64(sha-1(username:password)) | alvin:SDFSDFcfasdfaU= | | ip | 是一个ip地址或者ip地址段 | 10.100.1.10010.100.1.100/170 |

权限信息(Permission)

这里主要是用来表示授予每个节点什么权限,控制权限授予的粒度。

| 类型 | ACL简写 | 描述 | | ------ | --------- | ---------------- | | read | r | 获取节点数据并列出其子节点权限 | | write | w | 设置节点数据权限 | | create | c | 创建子节点权限 | | delete | d | 删除子节点权限(不包含当前节点) | | admin | a | 设置该节点ACL权限的权限 |

  • create和delete权限已从write权限中分离出来,以实现更精细的访问控制
  • delete是指对子节点的删除权限

ACL特点

  • Zookeeper的权限控制是基于znode节点的,需要对每个节点设置权限。
  • 每个znode支持设置多种权限控制方案和多个权限。
  • 子节点不会继承父节点的权限。客户端无法访问某个节点,但是可以访问他的子节点。

ACL相关命令

getAcl getAcl 读取ACL权限

setAcl setAcl 设置ACL权限

addauth addauth 添加认证用户

Shell命令演示ACL

world权限模式演示

  1. 创建的节点名默认为world的权限模式,任何人都可以访问

  1. 取消节点的查看权限后,无法访问数据

Auth权限模式演示

  1. 添加授权用户 addauth digest username:password

  1. 设置节点ACL

  1. 查看节点ACL

  1. 另外启动一个客户端,读取节点,发现没有权限,需要通过addauth命令授权才可以。

digest授权模式实战

  1. 设置digest模式的ACL

digest模式需要加密处理,通过下面的命令获取加密的字符串。

echo -n username:password | openssl dgst -binary -sha1 | openssl base64

复制加密后的字符串,

  1. 获取节点数据,发现没有权限

  1. 登录用户,成功获取节点数据

设置节点多个ACL

可以设置多种acl,用逗号隔开就行,我们以world和ip模式为例。

总结

ZooKeeper 作为分布式系统协调框架,往往在一个分布式系统下起到关键的作用。尤其是在分布式锁、配置管理等应用场景中。如果因为错误操作对重要数据节点进行变更或删除,对整个分布式系统影响很大,甚至会导致整个分布式服务不可用。所以当你在设计使用 ZooKeeper 的时候一定要考虑对关键节点添加权限控制。

思考一个问题,如果一个客户端对服务器上的一个节点设置了只有它自己才能操作的权限,那么等这个客户端下线或被删除后。对其创建的节点要想进行修改应该怎么做呢?

可以通过super模式来操作删除节点,可以认为是一种特殊的 Digest 认证。具有 Super 权限的客户端可以对 ZooKeeper 上的任意数据节点进行任意操作。具体参考:https://www.cnblogs.com/mengen/p/10919054.html

参考

https://www.cnblogs.com/qlqwjy/p/10517231.html

https://blog.csdn.net/qq_40837310/article/details/106826963

https://zookeeper.apache.org/doc/r3.1.2/zookeeperProgrammers.html#sc_ZooKeeperAccessControl

https://www.cnblogs.com/mengen/p/10919054.html