我需要为访问Zookeeper服务器内部数据的客户端设置user:password身份验证。我正在尝试使用zkCli和Curator Framework来弄清楚它是如何工作的,出于某种原因,从Curator Framework执行的代码会绕过所有安全设置,并且在不具有安全访问权限的情况下会表现出完全的访问权限。

我一直在关注这些问题的答案:

Using ACL with Curator

How to access a protected znode from ZooKeeper using zkCli?

zkCli:

[zk: localhost:7999(CONNECTED) 29] create /testpath contents digest:user:smGaoVKd/cQkjm7b88GyorAUz20=:cdrwa
Created /testpath
[zk: localhost:7999(CONNECTED) 4] getAcl /testpath
'digest,'user:smGaoVKd/cQkjm7b88GyorAUz20=
: cdrwa
[zk: localhost:7999(CONNECTED) 30] rmr /testpath
Authentication is not valid : /testpath
[zk: localhost:7999(CONNECTED) 31]


上面的结果符合预期,我们添加了ACL限制,现在我们无法访问创建的节点。但是,当我尝试使用Curator Framework访问此节点时,它将删除它,但不应删除它。

        String zkConnectString = "hostname:7999";
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);

        CuratorFramework client = CuratorFrameworkFactory.builder()
                .connectString(zkConnectString)
                .retryPolicy(retryPolicy)
                .build();
        client.start();
        try {
            client.delete().forPath("/testpath");
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(0);
        }



因此,Java Curator Framework代码成功删除了该节点,而不给出任何身份验证错误。我究竟做错了什么?

产品版本:

策展人框架:2.11.1

Zookeeper服务器:3.4.5

Zookeeper Java客户端:3.4.12

最佳答案

在ZooKeeper CLI中,您正在调用rmr,它是“全部删除”。之所以会违反ACL,是因为该ACL适用于/testpath下的节点,并且您没有权限删除/获取(很可能是抱怨的get)/testpath下的节点。请注意,如果在CLI中改为尝试delete /testpath,则它会起作用(我自己对此进行了测试),因为节点/testpath采用了其父级的ACL。 TBH我永远也无法保持ZooKeeper ACL正确,我写了Curator。简而言之,Curator在做正确的事情(与CLI一样)。

关于java - Curator Framework绕过Zookeeper ACL设置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56937183/

10-11 08:40