11.4.4 ACL模型与权限类型

ACL(Access Control List)用于控制客户端对 ZooKeeper 节点的访问权限。每个节点可设置一组 ACL 条目:权限集合(Perms)+ 认证方案(Scheme)+ 身份标识(ID)。通过组合不同方案与权限,实现多租户隔离与最小权限原则。

原理草图(ACL 作用范围)

文章图片

ACL 权限类型(Perms)
- CREATE (c):允许在该节点下创建子节点。
- READ (r):允许读取节点数据及其子节点列表。
- WRITE (w):允许修改节点数据。
- DELETE (d):允许删除子节点。
- ADMIN (a):允许设置该节点 ACL(最高权限)。
权限可组合,如 cdrwa 表示全权限。


环境准备(客户端工具)
以官方二进制包为例,确保有 zkCli.sh 工具:

# 解压并进入 ZooKeeper
tar -zxvf apache-zookeeper-3.8.4-bin.tar.gz -C /opt
cd /opt/apache-zookeeper-3.8.4-bin/bin

# 连接到集群
./zkCli.sh -server 127.0.0.1:2181

ACL 设置与验证(完整可执行示例)

1)使用 digest 认证创建只读与管理员两类权限

# 在 zkCli 中执行
# 添加认证信息(digest: 用户名:密码)
addauth digest user1:pass1
addauth digest admin:adminpass

# 创建节点并设置 ACL
create /app "config-v1" \
    digest:user1:pass1:r \
    digest:admin:adminpass:cdrwa

2)验证权限效果

# 只读用户可读
addauth digest user1:pass1
get /app
# 预期:读取成功

# 只读用户尝试写入
set /app "config-v2"
# 预期:报错 NoAuth / Permission denied

# 管理员可写
addauth digest admin:adminpass
set /app "config-v2"
# 预期:写入成功

命令解释
- addauth digest user:pass:为当前会话添加认证信息。
- create /path data acl1 acl2:创建节点并同时设置 ACL。
- get /path:读取数据。
- set /path data:写入数据(需 WRITE 权限)。


常见配置策略示例
- 配置中心路径:READ 给业务账号,WRITE 给运维账号
- 服务注册路径:实例账号 CREATE/DELETE(临时节点),运维 READ
- 管理路径:仅管理员 ADMIN


典型排错
1)NoAuthPermission denied

# 检查当前会话是否已认证
getAcl /app

# 重新添加认证信息
addauth digest admin:adminpass

2)误以为子节点继承 ACL

# 子节点需要显式设置 ACL
create /app/child "data" digest:admin:adminpass:cdrwa
getAcl /app/child

3)忘记管理员权限导致无法修改 ACL

# 需要 ADMIN 权限才能 setAcl
setAcl /app digest:admin:adminpass:cdrwa
# 若无 ADMIN,请使用拥有 ADMIN 权限的账号连接修复

练习
1. 创建 /conf 节点,设置 user1 只读、admin 全权限。
2. 使用 user1 读取成功、写入失败;使用 admin 写入成功。
3. 在 /conf 下创建子节点 /conf/app1,验证其 ACL 是否继承。
4. 尝试用 user1 调整 /conf 的 ACL,记录报错信息并分析原因。