bigywater.tech
ZooKeeper · 72

Digest、IP、Auth、SASL ACL 对比

ZooKeeper 的 ACL 有 world、auth、digest、ip、sasl、x509 几种方案。它们各自的 id 长什么样、信任什么、有什么坑?这篇每种都实际用一遍,并验证 digest 哈希到底是怎么算的。

sha1(user:password)
digest id 的算法,无盐,我算的值与保存的一致
auth 方案
自动变成创建者当前身份的 digest id
ip 方案
信任源地址,经 NAT 后所有客户端是同一个 IP

world 与 auth

实测 · 本机执行输出
  匿名读 /w → 允许
  alice 用 auth:"" 创建 /a,实际保存的 ACL: [('digest', 'alice:l+tY9T55txG8G/8vAjsjlr4obeM=')]
  bob 读 /a → 拒绝 | alice 读 /a → 允许 | 匿名读 /a → 拒绝

digest

实测 · 本机执行输出
  我自己算的 alice:apw 的 digest: alice:l+tY9T55txG8G/8vAjsjlr4obeM= | ZooKeeper 保存的: alice:l+tY9T55txG8G/8vAjsjlr4obeM= | 一致: True
  同样的口令在任何节点上的哈希都一样(无盐):再算一次 = alice:l+tY9T55txG8G/8vAjsjlr4obeM=

ip

实测 · 本机执行输出
  匿名(127.0.0.1)读 /ip-ok   → 允许
  匿名(127.0.0.1)读 /ip-net  → 允许
  匿名(127.0.0.1)读 /ip-no   → 拒绝
  注意:ip 方案信任连接的源地址,经过 NAT / 代理之后所有客户端看起来是同一个 IP。

sasl 与 x509

实测 · 本机执行输出
  create 带 sasl:someone 的 ACL → InvalidACLError
  create 带 x509:someone 的 ACL → InvalidACLError

忘了给自己留 ADMIN

实测 · 本机执行输出
  admin 读 /lost → 拒绝 | admin 改 /lost 的 ACL → 拒绝 (只有 bob 有读权限,没有人有 ADMIN 权限:这个节点的 ACL 再也改不了)

分步演示

ACL 方案
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。单机;ip 方案只测了 127.0.0.1(本机只有这一个源地址);digest 口令是实验用的假口令
    • 没有验证:ip 方案经过真实 NAT / 反向代理的表现、x509 与 sasl 的完整使用(第 76、77 篇)、digest 之外的口令哈希加强、超级用户
    京ICP备2026067502号-1京公网安备11010502063487号