我需要为访问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/