ZooKeeper ACL,允许 children 创建但不允许更改节点
ZooKeeper ACL, allow children creation but not changing a node
我正在考虑使用 ZK 服务器进行服务发现,重点放在安全性上。可能有多个集群(由真实来源创建的 ZK 目录),并且多个服务器会为这些目录创建一个临时节点。
现在,我不希望任何其他 ZK 客户端删除或修改由真实来源创建的 ZK 目录。他们应该只能向他们添加临时 children 以允许他们被发现。
ZK 是正确的工具吗?
我应该设置哪些 ACL?
是的,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
例如,您仅设置权限以创建 child 个节点并读取当前节点并为经过身份验证的用户管理节点,而只为其他用户设置读取权限:
[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
然后可以创建 child 个节点(临时和永久)并读取当前节点
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 的 children:
[zk: localhost:2181(CONNECTED) 0] ls /source/of1
[truthEphemeral]
现在让我们尝试在该未经身份验证的会话下创建新的 child 节点:
[zk: localhost:2181(CONNECTED) 1] create -e /source/of1/truthEphemeral2 ""
Authentication is not valid : /source/of1/truthEphemeral2
现在让我们在该 zkCli 会话中使用摘要模式进行身份验证并尝试创建新的 child 节点:
[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 实施您自己的身份验证方案。
我正在考虑使用 ZK 服务器进行服务发现,重点放在安全性上。可能有多个集群(由真实来源创建的 ZK 目录),并且多个服务器会为这些目录创建一个临时节点。
现在,我不希望任何其他 ZK 客户端删除或修改由真实来源创建的 ZK 目录。他们应该只能向他们添加临时 children 以允许他们被发现。
ZK 是正确的工具吗? 我应该设置哪些 ACL?
是的,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
例如,您仅设置权限以创建 child 个节点并读取当前节点并为经过身份验证的用户管理节点,而只为其他用户设置读取权限:
[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
然后可以创建 child 个节点(临时和永久)并读取当前节点
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 的 children:
[zk: localhost:2181(CONNECTED) 0] ls /source/of1
[truthEphemeral]
现在让我们尝试在该未经身份验证的会话下创建新的 child 节点:
[zk: localhost:2181(CONNECTED) 1] create -e /source/of1/truthEphemeral2 ""
Authentication is not valid : /source/of1/truthEphemeral2
现在让我们在该 zkCli 会话中使用摘要模式进行身份验证并尝试创建新的 child 节点:
[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 实施您自己的身份验证方案。