使用Kerberos保护Kafka和Zookeeper

时间:2018-06-12 17:46:01

标签: apache-kafka apache-zookeeper kerberos

我正在尝试在zookeeper和kafka之间建立一个kerberos标识。

我已按照此处提供的配置步骤进行操作:https://docs.confluent.io/4.1.1/kafka/authentication_sasl_gssapi.html#sasl-gssapi-broker

kafka经纪人成功连接到zookeeper集合,经纪人在znodes上设置ACL。

在Zookeeper中,我可以看到znodes / brokers / ids,但ACL设置如下:

'world,'anyone
: r
'sasl,'kafka/kafka-broker-01.c.aesthetic-way-193809.internal@MYREALM.COM
: cdrwa

第一个代理创建znode,放置其ACL并使其对所有想要添加其ID的节点不可修改。

文档说我们应该为所有经纪人使用相同的委托人,但文档的例子与此建议不符:

 // ZooKeeper client authentication
 Client {
   com.sun.security.auth.module.Krb5LoginModule required
   useKeyTab=true
   storeKey=true
   keyTab="/etc/security/keytabs/kafka_server.keytab"
   principal="kafka/kafka1.hostname.com@EXAMPLE.COM";
};

Shoud我创建了一个像kafka_zk_cli@MYREALM.COM这样的主体,并在每个代理上使用我的JAAS文件的Client部分?如果是,我可以在每个经纪人上共享该用户的密钥表吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以从主体中删除主机并为所有代理使用相同的主机,您可以手动设置acls(不理想),也可以将这些添加到您的zookeeper配置中

kerberos.removeHostFromPrincipal = true kerberos.removeRealmFromPrincipal = true

这三个选项中的任何一个都应该有帮助。

答案 1 :(得分:0)

属性kerberos.removeHostFromPrincipal,kerberos.removeRealmFromPrincipal对我不起作用。 看完Zookeeper版本3.4.14的源代码后,我将上述属性作为JVM参数(例如

)传递给了
-Dzookeeper.kerberos.removeHostFromPrincipal=true
-Dzookeeper.kerberos.removeRealmFromPrincipal=true

此外,就跨领域票证身份验证而言,我添加了auth规则,如:

-Dzookeeper.security.auth_to_local=RULE:[2:$1](.*)

看看类https://github.com/apache/zookeeper/blob/release-3.4.14/zookeeper-server/src/main/java/org/apache/zookeeper/server/auth/SaslServerCallbackHandler.java

现在我的主题ACLS看起来像这样

getAcl /kafka-cluster/config/topics/test20
'world,'anyone
: r
'sasl,'zookeeper
: cdrwa