阅读量:186
在 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:列出子节点。
设置 ACL 的示例
假设我们有一个 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解释:
- 第一条命令将默认 ACL 设置为
world:anyone:cdrwa,即任何人都可以读取、写入、创建子节点、删除子节点和管理 ACL。 - 第二条命令将特定用户
alice的 ACL 设置为cdrwa,即alice可以读取、写入、创建子节点、删除子节点和管理 ACL。
- 第一条命令将默认 ACL 设置为
验证 ACL
你可以使用 getAcl 命令来验证 ACL 设置是否正确:
zookeeperClient.sh getAcl /myNode
这将显示 /myNode 的当前 ACL 设置。
通过这种方式,你可以灵活地控制不同用户对 ZooKeeper 节点的访问权限。