Kafka“在JAAS配置中未指定登录模块”

30

我在使用控制台脚本与使用 sasl 安全机制的 Kafka 通信时遇到了问题。Kafka 使用 SASL_PLAINTEXT 监听器,并且机制是 PLAIN

我的做法: 我尝试使用其中一个 Kafka 脚本列出一些数据:

bin/kafka-consumer-groups.sh --bootstrap-server (address) --list

然而我明白了

WARN Bootstrap broker (address) disconnected (org.apache.kafka.clients.NetworkClient)

如果命令失败,这是可以理解的,因为它受到了 sasl 的保护。

因此,我尝试了如何将客户端用户名/密码添加到该命令中。 首先,我尝试运行 kafka-console-consumer 脚本,我使用 --command-config 添加必要的文件。我很快发现无法直接添加 jaas 文件,需要使用 .properties 文件,所以我这样做了。

我的 properties 文件(请记住,括号表示“已屏蔽”的数据,我无法在此处放置所有真实数据):

bootstrap.servers=(address)
zookeeper.connect=127.0.0.1:2181
zookeeper.connection.timeout.ms=6000
sasl.jaas.config=(path)/consumer_jaas.conf
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
group.id=(group)

我的jaas文件:

KafkaClient {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username=(username)
    password=(password);
};

这个jaas文件在我的标准Java应用程序中可以工作。

但是,当我尝试运行kafka-consumer-groups脚本或kafka-console-consumer时,我会遇到以下错误:

Exception in thread "main" org.apache.kafka.common.KafkaException: java.lang.IllegalArgumentException: Login module not specified in JAAS config
at org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:94)
at org.apache.kafka.common.network.ChannelBuilders.create(ChannelBuilders.java:93)
at org.apache.kafka.common.network.ChannelBuilders.clientChannelBuilder(ChannelBuilders.java:51)
at org.apache.kafka.clients.ClientUtils.createChannelBuilder(ClientUtils.java:84)
at kafka.admin.AdminClient$.create(AdminClient.scala:229)
at kafka.admin.AdminClient$.create(AdminClient.scala:223)
at kafka.admin.AdminClient$.create(AdminClient.scala:221)
at kafka.admin.ConsumerGroupCommand$KafkaConsumerGroupService.createAdminClient(ConsumerGroupCommand.scala:454)
at kafka.admin.ConsumerGroupCommand$KafkaConsumerGroupService.<init>(ConsumerGroupCommand.scala:389)
at kafka.admin.ConsumerGroupCommand$.main(ConsumerGroupCommand.scala:65)
at kafka.admin.ConsumerGroupCommand.main(ConsumerGroupCommand.scala)
Caused by: java.lang.IllegalArgumentException: Login module not specified in JAAS config
at org.apache.kafka.common.security.JaasConfig.<init>(JaasConfig.java:68)
at org.apache.kafka.common.security.JaasUtils.jaasConfig(JaasUtils.java:59)
at org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:85)

这个jaas文件是我在与kafka通信的Java应用程序中使用的文件的直接副本,并且它可以正常工作。但是在这里,使用控制台工具,它就不能正常工作。我尝试寻找解决方案,但我找不到任何有用的信息。

有人能帮我吗?

1个回答

51

提供JAAS配置给Kafka客户端有两种方式。

  • 通过客户端属性sasl.jaas.config。在这种情况下,您将其设置为实际的JAAS配置条目。例如,您的配置文件变为:

bootstrap.servers=(address)
zookeeper.connect=127.0.0.1:2181
zookeeper.connection.timeout.ms=6000
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="(username)" password="(password)";
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
group.id=(group)

正如您已经了解的那样,您可以使用--command-config将属性文件传递给kafka-consumer-groups.sh

  • 通过Java属性:java.security.auth.login.config。在这种情况下,您将其设置为JAAS文件的路径。此外,如果您在KAFKA_OPTS中设置它,kafka-consumer-groups.sh将自动选择它。

  • export KAFKA_OPTS="-Djava.security.auth.login.config=(path)/consumer_jaas.conf"
    

    我直接将JAAS配置条目放入.properties文件中,这样就成功了。现在我可以使用这些脚本而没有任何错误。不知道为什么它对外部文件有问题。谢谢! - Tomasz
    8
    使用sasl.jaas.config时,只能将其设置为JAAS配置项,而不能使用文件路径。相反,对于Java属性而言,只能使用文件路径。 - Mickael Maison
    3
    我已经正确设置了sasl.jaas.config,但仍然出现“[main] ERROR io.confluent.admin.utils.cli.KafkaReadyCommand - Error while running kafka-ready.”和“Caused by: java.lang.IllegalArgumentException: Could not find a 'KafkaClient' entry in the JAAS configuration. System property 'java.security.auth.login.config' is not set”错误。我该如何停止寻找.jaases文件并改为使用我指定的内容? - Patrick Szalapski

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接