首页 > 解决方案 > Curator Framework 绕过 Zookeeper ACL 设置

问题描述

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

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

将 ACL 与 Curator 一起使用

如何使用 zkCli 从 ZooKeeper 访问受保护的 znode?

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

动物园管理员服务器:3.4.5

Zookeeper java客户端:3.4.12

标签: javaapache-zookeeperaclapache-curator

解决方案


在您调用的 ZooKeeper CLI 中rmr,它是 Delete All。您收到 ACL 违规是因为 ACL 适用于下面的节点,/testpath并且您没有权限删除/获取(可能是抱怨的获取)节点下面/testpath。请注意,如果您在 CLI 中尝试delete /testpath它可以工作(我自己对此进行了测试),因为节点/testpath采用了其父节点的 ACL。TBH 我永远无法将 ZooKeeper ACL 直接记在脑海中,于是我写了 Curator。因此,简而言之,Curator 正在做正确的事情(与 CLI 所做的事情相同)。


推荐阅读