给一个目录设了 ACL,它下面的东西就安全了吗?不一定。这篇验证 ZooKeeper 的 ACL 完全不继承,以及要保护整棵子树的代价。
/p/c 的 ACL: [('world', 'anyone', 31)]
匿名按完整路径读 /p/c → 允许 (父节点受保护,但子节点自己的 ACL 是 world)
匿名列出 /p 的子节点 → 拒绝(NoAuth)匿名在 /p 下创建子节点 → 拒绝(NoAuth) 匿名删除 /p/c(子节点是 world,但父节点 /p 只允许 admin)→ 拒绝(NoAuth) 匿名修改 /p/c 的数据(子节点 world:cdrwa)→ 允许
建树 3906 个节点用时 12.8 s;全是 world,匿名读两个深层节点:2/2 成功 递归 set_acls 3906 个节点用时 13.2 s(逐个同步请求);之后匿名读深层节点: 拒绝(NoAuth)
用异步请求或 multi 可以更快,本文只测了逐个同步的写法。
/tree/n0/new 的 ACL: [('world', 'anyone')]
创建时就带上 ACL(create 的 acl 参数)或者在创建后立刻 set_acls,否则会有一小段「裸奔」的时间窗。