ZooKeeper ACL,允许创建子项但不更改节点

时间:2018-01-10 10:51:59

标签: apache-zookeeper

我正在考虑使用ZK服务器进行服务发现,重点关注安全性。可能有多个集群(由真实来源创建的ZK目录),并且多个服务器将为这些目录创建一个短暂的节点。

现在,我不希望任何其他ZK客户端删除或修改由真实来源创建的ZK目录。他们应该只能为他们添加短暂的孩子,以便他们被发现。

ZK是正确的工具吗? 我应该设置哪些AC?

1 个答案:

答案 0 :(得分:2)

是的,ZK是正确的工具。

您可以通过设置ACL permissions

来管理每个节点的访问权限

我们以摘要式身份验证为例。首先让我们生成密码:

java -cp zookeeper-3.4.6.jar:lib/log4j-1.2.16.jar:lib/slf4j-log4j12-1.6.1.jar:lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider u1:p1
u1:p1->u1:fpT/y03U+EjItKZOSLGvjnJlyng=

在zkCli会话中,让我们进行身份验证:

addauth digest u1:p1

例如,您只设置权限以创建子节点并读取当前节点并为经过身份验证的用户管理节点,并且只读取其他人的权限:

[zk: localhost:2181(CONNECTED) 14] setAcl /source/of1 digest:u1:fpT/y03U+EjItKZOSLGvjnJlyng=:cra,world:anyone:r
[zk: localhost:2181(CONNECTED) 15] getAcl /source/of1
'digest,'u1:fpT/y03U+EjItKZOSLGvjnJlyng=
: cra
'world,'anyone
: r

然后可以创建子节点(短暂的和永久的)并读取当前节点

set /source/of1 "jjj"
Authentication is not valid : /source/of1
[zk: localhost:2181(CONNECTED) 17] create -e /source/of1/truthEphemeral ""
Created /source/of1/truthEphemeral
[zk: localhost:2181(CONNECTED) 18] ls /source/of1
[truthEphemeral] 

在其他zkCli会话中,让我们尝试在不进行身份验证的情况下读取/ source / of1的子项:

[zk: localhost:2181(CONNECTED) 0] ls /source/of1
[truthEphemeral]

现在让我们尝试在该未经身份验证的会话下创建新的子节点:

[zk: localhost:2181(CONNECTED) 1] create -e /source/of1/truthEphemeral2 ""
Authentication is not valid : /source/of1/truthEphemeral2

现在让我们在zkCli会话中使用摘要模式进行身份验证,并尝试创建新的子节点:

[zk: localhost:2181(CONNECTED) 2] addauth digest u1:p1
[zk: localhost:2181(CONNECTED) 3] create -e /source/of1/truthEphemeral2 ""
Created /source/of1/truthEphemeral2

对于身份验证,您可以使用开箱即用的方案之一,或使用zookeeper pluggable authentication实现您自己的身份验证方案。