动物园管理员的安全
Safety about zookeeper
我遇到了zookeeper的安全问题。我有一个zookeeper&kafka,我用sasl来保护zookeeper。而我发现'zkcli'有一个bug,就是即使我不提供sasl的用户名和密码,我仍然可以访问zoopkeeper的znode。问题解释如下:
http://zookeeper-user.578899.n2.nabble.com/SASL-for-Client-connections-td7583502.html#a7583510
不知道有没有办法让zookeeper更安全。我知道setacl可以保护zookeeper的znode,但是我发现在zookeeper中使用setcal会导致一些kafka错误。有没有更好的办法?非常感谢。
不确定是否对您有帮助,但也许 :)
以下是我针对您的部分问题所做的工作(无 SASL):有效客户端 IP 的白名单。
添加到zkServer.sh
-Dzookeeper.authProvider.1=MyCustomIPAuthenticationProvider
使用 withACL(ZooDefs.Ids.CREATOR_ALL_ACL)
创建所有 znode(假设 Curator)
和
public class MyCustomIPAuthenticationProvider extends org.apache.zookeeper.server.auth.IPAuthenticationProvider {
private static Set<String> validHosts = new HashSet<>(); // todo populate
@Override
public KeeperException.Code handleAuthentication(org.apache.zookeeper.server.ServerCnxn cnxn, byte[] authData) {
String id = cnxn.getRemoteSocketAddress().getAddress().getHostAddress();
if (! matches(id, null) || ! matches(new String(authData), null)) {
return org.apache.zookeeper.KeeperException.Code.AUTHFAILED;
}
return super.handleAuthentication(cnxn, authData);
}
@Override
public boolean matches(String id, String aclExpr) {
return validHosts.contains(id);
}
@Override
public boolean isAuthenticated() {
return true;
}
}
注意它不是 100% 安全的(客户端可以伪造他的 IP)。
(而且用例没有 Kafka!)
我遇到了zookeeper的安全问题。我有一个zookeeper&kafka,我用sasl来保护zookeeper。而我发现'zkcli'有一个bug,就是即使我不提供sasl的用户名和密码,我仍然可以访问zoopkeeper的znode。问题解释如下:
http://zookeeper-user.578899.n2.nabble.com/SASL-for-Client-connections-td7583502.html#a7583510
不知道有没有办法让zookeeper更安全。我知道setacl可以保护zookeeper的znode,但是我发现在zookeeper中使用setcal会导致一些kafka错误。有没有更好的办法?非常感谢。
不确定是否对您有帮助,但也许 :)
以下是我针对您的部分问题所做的工作(无 SASL):有效客户端 IP 的白名单。
添加到zkServer.sh
-Dzookeeper.authProvider.1=MyCustomIPAuthenticationProvider
使用
withACL(ZooDefs.Ids.CREATOR_ALL_ACL)
创建所有 znode(假设 Curator)
和
public class MyCustomIPAuthenticationProvider extends org.apache.zookeeper.server.auth.IPAuthenticationProvider {
private static Set<String> validHosts = new HashSet<>(); // todo populate
@Override
public KeeperException.Code handleAuthentication(org.apache.zookeeper.server.ServerCnxn cnxn, byte[] authData) {
String id = cnxn.getRemoteSocketAddress().getAddress().getHostAddress();
if (! matches(id, null) || ! matches(new String(authData), null)) {
return org.apache.zookeeper.KeeperException.Code.AUTHFAILED;
}
return super.handleAuthentication(cnxn, authData);
}
@Override
public boolean matches(String id, String aclExpr) {
return validHosts.contains(id);
}
@Override
public boolean isAuthenticated() {
return true;
}
}
注意它不是 100% 安全的(客户端可以伪造他的 IP)。 (而且用例没有 Kafka!)