最近公司项目,需要支持Kafka SASL,经过2天的摸索,终于搞定,特此记录。
该文从以下5方面,进行介绍

  1. 环境搭建
  2. 代码修改
  3. 监控工具修改
  4. 命令脚本参数对比
  5. 常见报错

一、环境搭建

1、Kafka Server修改

在config目录下创建kafka_server_jaas.conf文件,配置如下

KafkaServer {
 org.apache.kafka.common.security.plain.PlainLoginModule required
 username=“admin”
 password=“admin”
 user_admin=“admin”
 user_fm=“fm_security”;
 };

其中,Username和password属性,用于Kafka Broker间,进行连接所使用的账户和密码。
user_{userName}=”{password}”,用于定义client连接到broker所需账号和密码。在上述配置中,定义了两个账户,admin和fm。

Server.properties修改

#Listeners
 listeners=SASL_PLAINTEXT://10.45.50.65:9098
 #使用的认证协议
 security.inter.broker.protocol=SASL_PLAINTEXT
 #SASL机制
 sasl.enabled.mechanisms=PLAIN
 sasl.mechanism.inter.broker.protocol=PLAIN
 #身份验证处理类
 authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
 super.users=User:admin

2、Kafka Client修改

在config目录下创建kafka_client_jaas.conf配置文件,配置如下

KafkaClient {
 org.apache.kafka.common.security.plain.PlainLoginModule required
 username=“fm”
 password=“fm_security”;
 };

userName和password属性,需要与kafka_server_jaas.conf配置文件中,配置的账户和密码对应,否则,会报认证失败的异常。

3、生产者脚本修改

在Consumer.properties配置文件中,增加如下两个配置项

security.protocol=SASL_PLAINTEXT
 sasl.mechanism=PLAIN
 sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required 
 username=“admin” 
 password=“admin”;

Kafka-console-consumer.sh修改
在最开始处,增加如下配置。其中config对应于Kafka Client中创建的配置文件路径。

export KAFKA_OPTS=" -Djava.security.auth.login.config=/home/install/signal_other/kafka_2.11-1.0.1/config/kafka_client_jaas.conf"

4、消费者脚本修改

同生产者。

5、Kafka-consumer-group脚本修改

在config目录下创建consumer_group.conf配置文件,增加如下配置

security.protocol=SASL_PLAINTEXT
 sasl.mechanism=PLAIN
 sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required 
 username=“fm” 
 password=“fm_security”;

其中userName和password属性的含义,同生产者和消费者脚本中userName和password属性。

二、代码修改

1、生产者修改

在生产者配置属性中,增加如下三项:

producerConfig.put(“security.protocol”, “SASL_PLAINTEXT”);
 producerConfig.put(“sasl.mechanism”, “PLAIN”);
 producerConfig.put(“sasl.jaas.config”, “org.apache.kafka.common.security.plain.PlainLoginModule required username=“fm” password=“fm_security”;”);


其中针对于username和password中出现的明文,可通过配置文件中配置密文,进行解密后,在进行字符串填充。

2、消费者修改

同生产者。

三、监控工具Kafka Tool修改

1、在Kafka Tool安装目录下,创建一个快捷方式。

2、在启动命令的时候,增加一个启动参数,完整参数如下

“E:\Program Files\kafkatool2\kafkatool.exe” -J-Djava.security.auth.login.config=“E:/Program Files/kafkatool2/kafka_client_jaas.conf”

kafka 配置clientid springboot kafka 配置sasl_apache

3、创建kafka_client_jaas.conf配置文件,配置内容如下

KafkaClient {
 org.apache.kafka.common.security.plain.PlainLoginModule required
 username=“fm”
 password=“fm_security”;
 };

4、添加kafka连接

(1)将type切换成SASL plaintext选项

kafka 配置clientid springboot kafka 配置sasl_apache_02

(2)填入ZK(或broker地址)
(3)将SASL Mechanism输入框填入PLAIN

kafka 配置clientid springboot kafka 配置sasl_apache_03

四、脚本对比(普通和SASL)

1、生产者

普通

./kafka-console-producer.sh --broker-list 10.45.50.65:9098 --topic QLJ

SASL

./kafka-console-producer.sh --broker-list 10.45.50.65:9098 --topic QLJ --producer.config …/config/producer.properties

2、消费者

普通

./kafka-console-consumer.sh --bootstrap-server 10.45.50.65:9098 --topic QLJ

SASL

./kafka-console-consumer.sh --bootstrap-server 10.45.50.65:9098 --topic QLJ --consumer.config …/config/consumer.properties

3、Kafka-consumer-group.sh

普通

./kafka-consumer-groups.sh --bootstrap-server 10.45.50.65:9098

SASL

./kafka-consumer-groups.sh --bootstrap-server 10.45.50.65:9098 --command-config …/config/consumer_group.properties --list

五、常见报错

1、Executing consumer group command failed due to Request METADATA failed on brokers List(10.45.50.65:9098 (id: -1 rack: null))

kafka 配置clientid springboot kafka 配置sasl_配置文件_04


解决方式:执行命令时,提供–consumer.config …/config/consumer.properties参数。

2、 Connection to node -1 could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)

kafka 配置clientid springboot kafka 配置sasl_apache_05


解决方式:执行命令时,使用consumer_group.properties配置文件。因为consumer.properties配置文件中提供group.id属性,导致查询消费者详情的时候,使用的是配置文件提供的消费者群组,而不是参数传入的消费者群组名称。3、org.apache.kafka.common.errors.SaslAuthenticationException: Authentication failed: Invalid username or password

kafka 配置clientid springboot kafka 配置sasl_kafka_06


解决方式:检查consumer.properties中配置的username和password和kafka_client_jaas.properties配置文件,提供的用户名和密码是否一致。