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

Apache zookeeper ZooKeeper ACL,允许创建子节点但不更改节点,apache-zookeeper,Apache Zookeeper,我正在考虑使用ZK服务器进行服务发现,重点关注安全性。可能有多个集群(真相来源创建的ZK目录),多个服务器将为这些目录创建一个临时节点 现在,我不希望任何其他ZK客户端删除或修改真理之源创建的ZK目录。他们应该只能添加短暂的孩子,让他们被发现 ZK是正确的工具吗? 我应该设置哪些ACL?是的,ZK是正确的工具 您可以通过设置来管理每个节点的访问权限 让我们以摘要身份验证为例。首先,让我们生成密码: java -cp zookeeper-3.4.6.jar:lib/log4j-1.2.16.jar

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

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

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

是的,ZK是正确的工具

您可以通过设置来管理每个节点的访问权限

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

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

对于身份验证,您可以使用开箱即用支持的方案之一,或者使用实现您自己的身份验证方案

是的,ZK是正确的工具

您可以通过设置来管理每个节点的访问权限

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

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

对于身份验证,您可以使用开箱即用支持的方案之一,或者使用实现您自己的身份验证方案

如果设置127.0.0.1,是否意味着除了leader服务器上的客户机之外,没有人可以更改节点?我使用了ip模式作为示例。最好至少使用摘要或实现您自己的auth模式,并将其插入Zookeeper。插入zookeeper只需将jar添加到zookeeper服务器上的lib目录中。但如果我将源代码设置为ip:127.0.0.1:cra,则其他客户端无法读取,只有127.0.0.1可以读取。因此,我需要一些类似linux的方法来设置权限:127.0.0.1:all,world:cr,对吗?你会怎么做呢?你是对的,我们需要两个ACL:一个用于使用cra权限进行身份验证,另一个用于使用仅读取权限的其他方案。我已经使用digest auth schema更新了答案,并使用了更详细的示例。如果设置127.0.0.1,是否意味着除了leader服务器上的客户机之外,没有人可以更改节点?我使用了ip schema作为示例。最好至少使用摘要或实现您自己的auth模式,并将其插入Zookeeper。插入zookeeper只需将jar添加到zookeeper服务器上的lib目录中。但如果我将源代码设置为ip:127.0.0.1:cra,则其他客户端无法读取,只有127.0.0.1可以读取。因此,我需要一些类似linux的方法来设置权限:127.0.0.1:all,world:cr,对吗?你会怎么做呢?你是对的,我们需要两个ACL:一个用于使用cra权限进行身份验证,另一个用于使用仅读取权限的其他方案。我已经用这些信息更新了答案,并使用digest auth schema更新了更详细的示例