使用控制台脚本与使用sasl
保护的Kafka进行通信时遇到问题。 Kafka受sasl
保护,听众为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
文件,所以我做了。
我的属性文件(请记住,括号表示"已删除"数据,我无法在此处输入所有实际数据):
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
文件是我在java应用程序中使用的文件的直接副本,该文件与kafka通信并且它可以正常工作,但是在这里,使用控制台工具,它只是不起作用。我试着寻找解决方案,但我找不到任何有用的东西。
任何人都可以帮我吗?
答案 0 :(得分:17)
有两种方法可以为Kafka客户端提供JAAS配置。
通过客户端属性: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"