【发布时间】:2018-01-12 14:43:54
【问题描述】:
我正在考虑使用 ZK 服务器来进行服务发现,重点是安全性。可能有多个集群(由 Source of Truth 创建的 ZK 目录),并且多个服务器会为这些目录创建一个临时节点。
现在,我不希望任何其他 ZK 客户端删除或修改由事实来源创建的 ZK 目录。他们应该只能向他们添加短暂的孩子,以便他们被发现。
ZK 是正确的工具吗? 我应该设置哪些 ACls?
【问题讨论】:
标签: apache-zookeeper
我正在考虑使用 ZK 服务器来进行服务发现,重点是安全性。可能有多个集群(由 Source of Truth 创建的 ZK 目录),并且多个服务器会为这些目录创建一个临时节点。
现在,我不希望任何其他 ZK 客户端删除或修改由事实来源创建的 ZK 目录。他们应该只能向他们添加短暂的孩子,以便他们被发现。
ZK 是正确的工具吗? 我应该设置哪些 ACls?
【问题讨论】:
标签: apache-zookeeper
是的,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 实现您自己的身份验证方案。
【讨论】: