在 ZooKeeper 中,访问控制列表(ACL)用于定义哪些用户或用户组可以对特定的 znode 执行何种操作。ZooKeeper 的 ACL 使用了一种类似于 UNIX 文件系统权限的模型,但更加灵活。
ZooKeeper 的 ACL 主要由以下几部分组成:
Scheme:认证机制,指定如何验证用户身份。常见的 scheme 有:
world:任何人。auth:已经通过身份验证的用户。digest:使用用户名和密码进行认证。ip:基于客户端 IP 地址进行认证。Id:与 scheme 相关的身份标识。例如:
world,Id 是 "world"。digest,Id 是 username:base64(username:password)。ip,Id 是 IP 地址或 IP 地址范围。Permissions:权限掩码,指定允许的操作。常见的权限包括:
c:创建子节点。d:删除子节点。r:读取数据。w:写入数据。a:管理 ACL。x:列出子节点。假设我们有一个 znode /myNode,我们希望只有用户 alice 可以读取和写入该节点,而其他用户只能读取。我们可以使用 digest scheme 来实现这一点。
创建用户 alice 并生成密码哈希:
echo -n 'alice:password' | zkServer.sh digest
这将输出类似 alice:9k8sCfFJ6Ua5y7LjGJ8VQg== 的内容。
设置 ACL:
zookeeperClient.sh setAcl /myNode world:anyone:cdrwa
zookeeperClient.sh setAcl /myNode auth:alice:9k8sCfFJ6Ua5y7LjGJ8VQg==:cdrwa
解释:
world:anyone:cdrwa,即任何人都可以读取、写入、创建子节点、删除子节点和管理 ACL。alice 的 ACL 设置为 cdrwa,即 alice 可以读取、写入、创建子节点、删除子节点和管理 ACL。你可以使用 getAcl 命令来验证 ACL 设置是否正确:
zookeeperClient.sh getAcl /myNode
这将显示 /myNode 的当前 ACL 设置。
通过这种方式,你可以灵活地控制不同用户对 ZooKeeper 节点的访问权限。