java - Curator Framework 绕过 Zookeeper ACL 设置
问题描述
我需要为访问 Zookeeper 服务器内部数据的客户端设置用户:密码身份验证。我正在尝试使用 zkCli 和 Curator Framework 来弄清楚它是如何工作的,并且出于某种原因,从 Curator Framework 执行的代码会绕过所有安全设置,并且在它不应该拥有它们时表现得像它具有完全访问权限一样。
我一直在关注这些问题的答案:
如何使用 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
解决方案
在您调用的 ZooKeeper CLI 中rmr
,它是 Delete All。您收到 ACL 违规是因为 ACL 适用于下面的节点,/testpath
并且您没有权限删除/获取(可能是抱怨的获取)节点下面/testpath
。请注意,如果您在 CLI 中尝试delete /testpath
它可以工作(我自己对此进行了测试),因为节点/testpath
采用了其父节点的 ACL。TBH 我永远无法将 ZooKeeper ACL 直接记在脑海中,于是我写了 Curator。因此,简而言之,Curator 正在做正确的事情(与 CLI 所做的事情相同)。
推荐阅读
- r - 使用POSIXct时如何避免时区异常变化?
- r - R Shiny - 动态创建的 actionButtons 要么一次全部触发(observeEvent),要么根本不触发(eventReactive)
- mysql - 在 MySql 中,如何查询表以查看一列是否有另一列的两个相似条目?
- .net - .msi 卸载不会删除以前的文件
- windows - Delphi 中的 Windows 10“固定启动”
- sql - 如何在 PostgreSQL 中找到序列中的空白?
- css - 使用转换延迟的错误
- sas - 如何在 Enterprise Guide 7.1 中更改 sysprint 值
- python - 如何将后端的全息视图与 bokehjs 前端连接起来
- android - 从 Firebase 填充 ListView,有代码但没有收到任何数据