【问题标题】:Kafka Streams Application GSSAPI AuthenticationKafka Streams 应用程序 GSSAPI 身份验证
【发布时间】:2021-09-14 16:29:53
【问题描述】:
我有一个使用 Kafka-Streams-API 的应用程序。我在当地工作时没有问题。
我想连接到远程 Kafka 代理以进行阶段测试。并且远程 Kafka 代理设置为使用 GSSAPI sasl 机制并使用 Kerberos。运行使用 java 编写的 Streams 应用程序时出现错误。在我查找错误消息后,我找到了答案,但仍然有问题。
错误信息;
获取关联 ID 为 3 的元数据时出错:{[APPID]-KTABLE-AGGREGATE-STATE-STORE-0000000008-repartition=UNKNOWN_TOPIC_OR_PARTITION
我找到的答案说;
当使用授权者并且用户没有对主题的描述授权时,代理将不再向请求返回 TOPIC_AUTHORIZATION_FAILED 错误,因为这会泄露主题名称。相反,将返回 UNKNOWN_TOPIC_OR_PARTITION 错误代码。这可能会在使用生产者和消费者时导致意外超时或延迟,因为 Kafka 客户端通常会在未知主题错误时自动重试。如果您怀疑这可能发生,您应该查阅客户端日志。
所以我的实际问题是如何授权使用 GSAPI sasl 机制的远程主题?
【问题讨论】:
标签:
java
apache-kafka
kerberos
apache-kafka-streams
sasl
【解决方案1】:
有点晚了,但这就是答案。
有两种方法可以将 Kerberized Kafka 集群与 Stream App 连接起来。
Details
-
缓存凭据:使用缓存凭据创建 jaas.conf 文件。要使用缓存的 Kerberos 凭据(首先使用 kinit),请使用此配置。
它适合手动运行。
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useTicketCache=true;
};
-
使用 keytabs:创建一个 jaas.conf 文件,其中包含 keyTab 和主体信息。
适合自动运行。
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/etc/security/keytabs/mykafkaclient.keytab"
principal="mykafkaclient/clients.hostname.com@EXAMPLE.COM";
};
定义一个环境变量
export KAFKA_OPTS="-Djava.security.auth.login.config=/home/user/jaas.conf"
不要忘记控制访问名为 KRB5.conf(在 unix 中)或 KRB5.ini(在 Windows 中)的文件
krb5
当然,有些参数必须正确定义。
如果您想使用 Kafka CLI 访问 kafka 主题,请创建一个 client.properties
包含内容的文件
<code>security.protocol=SASL_PLAINTEXT
sasl.kerberos.service.name=kafka
sasl.mechanism=GSSAPI
</code>
使用 Kafka 流应用程序,您将在属性中提供这些参数。
- Kerberos 是一个复杂的主题。如果有人对它的细节感兴趣,我强烈推荐“Hadoop 和 Kerberos:大门外的疯狂”git-book