【问题标题】:ZooKeeper ACL, allow children creation but not changing a nodeZooKeeper ACL,允许创建子节点但不更改节点
【发布时间】:2018-01-12 14:43:54
【问题描述】:

我正在考虑使用 ZK 服务器来进行服务发现,重点是安全性。可能有多个集群(由 Source of Truth 创建的 ZK 目录),并且多个服务器会为这些目录创建一个临时节点。

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

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

【问题讨论】:

    标签: apache-zookeeper


    【解决方案1】:

    是的,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 实现您自己的身份验证方案。

    【讨论】:

    • 如果你设置了127.0.0.1,是不是意味着除了leader服务器上的一个客户端之外,没有人可以改变节点?
    • 我以 ip 架构为例。最好使用租赁摘要或实现自己的身份验证模式并将其插入 Zookeeper。插入zookeeper只是简单地将jar添加到zookeeper服务器的lib目录中
    • 谢谢。但是如果我将源设置为ip:127.0.0.1:cra,其他客户端无法读取,只有127.0.0.1可以。因此,我需要一些类似 linux 的方式来设置权限:127.0.0.1:all, world:cr,对吗?你会怎么做?
    • 你是对的,我们需要 2 个 ACL:一个用于具有 cra 权限的身份验证,另一个用于仅具有 READ 权限的其他方案。我已经使用摘要身份验证架构更新了该信息和更详细示例的答案
    猜你喜欢
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多