【问题标题】: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

    1. 缓存凭据:使用缓存凭据创建 jaas.conf 文件。要使用缓存的 Kerberos 凭据(首先使用 kinit),请使用此配置。 它适合手动运行。

      KafkaClient { com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true; };

    2. 使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 2012-11-23
      • 1970-01-01
      相关资源
      最近更新 更多