ZooKeeper 的 ACL 有 world、auth、digest、ip、sasl、x509 几种方案。它们各自的 id 长什么样、信任什么、有什么坑?这篇每种都实际用一遍,并验证 digest 哈希到底是怎么算的。
匿名读 /w → 允许
alice 用 auth:"" 创建 /a,实际保存的 ACL: [('digest', 'alice:l+tY9T55txG8G/8vAjsjlr4obeM=')]
bob 读 /a → 拒绝 | alice 读 /a → 允许 | 匿名读 /a → 拒绝我自己算的 alice:apw 的 digest: alice:l+tY9T55txG8G/8vAjsjlr4obeM= | ZooKeeper 保存的: alice:l+tY9T55txG8G/8vAjsjlr4obeM= | 一致: True 同样的口令在任何节点上的哈希都一样(无盐):再算一次 = alice:l+tY9T55txG8G/8vAjsjlr4obeM=
匿名(127.0.0.1)读 /ip-ok → 允许 匿名(127.0.0.1)读 /ip-net → 允许 匿名(127.0.0.1)读 /ip-no → 拒绝 注意:ip 方案信任连接的源地址,经过 NAT / 代理之后所有客户端看起来是同一个 IP。
create 带 sasl:someone 的 ACL → InvalidACLError create 带 x509:someone 的 ACL → InvalidACLError
admin 读 /lost → 拒绝 | admin 改 /lost 的 ACL → 拒绝 (只有 bob 有读权限,没有人有 ADMIN 权限:这个节点的 ACL 再也改不了)