Zookeeper管理员会因为某些客户端对某些节点设置了权限,而导致在紧急的情况下无法修改这些节点感到困扰。在这种情况下,管理员可以通过Zookeeper超级用户模式访问这些节点,一旦设置了超级权限访问节点,后续的操作就不需要check ACL了。
使用超级用户模式,可以通过Zookeeper的zookeeper.DigestAuthenticationProvider.superDigest参数开启。
使用org.apache.zookeeper.server.auth.DigestAuthenticationProvider生成superDigest:
@Test
public void generate() {
try {
System.out.println(DigestAuthenticationProvider.generateDigest("super:superpw"));
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
输出
super:g9oN2HttPfn8MMWJZ2r45Np/LIA=
在${ZOOKEEPER_HOME}/bin/zkServer.sh配置启动参数:
我使用的是zookeeper-3.4.6,修改zkServer.sh文件的第109行:
nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "-Dzookeeper.DigestAuthenticationProvider.superDigest=super:g9oN2HttPfn8MMWJZ2r45Np/LIA=" \
超级权限是通过DigestAuthenticationProvider实现的,示例:
@Test
public void testSuperServer() {
List<ACL> acls = new ArrayList<ACL>(2);
try {
Id id1 = new Id("digest", DigestAuthenticationProvider.generateDigest("fish:fishpw"));
ACL acl1 = new ACL(ZooDefs.Perms.WRITE, id1);
Id id2 = new Id("digest", DigestAuthenticationProvider.generateDigest("qsd:qsdpw"));
ACL acl2 = new ACL(ZooDefs.Perms.READ, id2);
acls.add(acl1);
acls.add(acl2);
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
}
ZooKeeper zk = null;
try {
zk = new ZooKeeper("10.0.1.75:2181,10.0.1.76:2181,10.0.1.77:2181", 300000, new Watcher() {
// 监控所有被触发的事件
public void process(WatchedEvent event) {
System.out.println("已经触发了" + event.getType() + "事件!");
}
});
if (zk.exists("/test", true) == null) {
System.out.println(zk.create("/test", "ACL测试".getBytes(), acls, CreateMode.PERSISTENT));
}
} catch (IOException e) {
e.printStackTrace();
} catch (KeeperException e1) {
e1.printStackTrace();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
@Test
public void testSuperClient() {
try {
ZooKeeper zk = new ZooKeeper("10.0.1.75:2181,10.0.1.76:2181,10.0.1.77:2181", 300000, new Watcher() {
// 监控所有被触发的事件
public void process(WatchedEvent event) {
System.out.println("已经触发了" + event.getType() + "事件!");
}
});
zk.addAuthInfo("digest", "super:superpw".getBytes());
System.out.println(new String(zk.getData("/test", null, null)));
zk.setData("/test", "I change!".getBytes(), -1);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
示例先使用digest对Znode /test 设置读写权限,然后通过super:superpw的超级用户去访问。

本文介绍了Zookeeper管理员如何在紧急情况下使用超级用户模式绕过权限限制访问节点。超级用户模式通过设置zookeeper.DigestAuthenticationProvider.superDigest参数启用,并通过DigestAuthenticationProvider生成superDigest。在示例中,展示了为Znode设置权限以及使用超级用户进行访问的过程。
6773

被折叠的 条评论
为什么被折叠?



