关于zookeeper的安全

时间:2018-03-27 09:51:19

标签: apache-kafka apache-zookeeper

我遇到了关于zookeeper安全的问题。我有一个动物园管理员和卡夫卡,我用sasl保护动物园管理员。虽然我发现'zkcli'有一个错误,即使我不提供sasl的用户名和密码,我仍然可以访问zoopkeeper的znode。问题解释如下:

http://zookeeper-user.578899.n2.nabble.com/SASL-for-Client-connections-td7583502.html#a7583510

我想知道有没有办法让动物园管理员更安全。我知道setacl可以保护zookeeper的znode,但我发现如果在zookeeper中使用setcal会导致一些kafka错误。有没有更好的办法?非常感谢。

1 个答案:

答案 0 :(得分:0)

不确定它会对你有所帮助,但也许:)

以下是我为您的部分问题所做的工作(无SASL):有效客户端IP的白名单。

  • 添加到zkServer.sh -Dzookeeper.authProvider.1=MyCustomIPAuthenticationProvider

  • 使用withACL(ZooDefs.Ids.CREATOR_ALL_ACL)创建所有znodes(假设策展人)

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)。 (并且用例没有卡夫卡!)