Kafka 开启 SASL_PLAINTEXT 双监听器认证(内网/外网)
- 背景:云上部署 Kafka 时,由于业务需要,需要开放外网端口进行访问。为保证安全,需要开启 SASL_PLAINTEXT 认证。
文章目录
- 1️⃣修改Kafka配置文件server.properties
- 2️⃣ 配置 JAAS 文件 config/jaas.conf
- 3️⃣修改启动脚本
- 4️⃣ 客户端连接配置
- 5️⃣ 测试客户端连接
- 6️⃣日志提示
- 7️⃣ SpringBoot 使用示例
- ✅ 总结
1️⃣修改Kafka配置文件server.properties
vim /opt/kafka/config/server.properties# 内外网监听器
listeners=INTERNAL://192.168.162.99:9093,EXTERNAL://0.0.0.0:9092# 映射监听器对应协议
listener.security.protocol.map=INTERNAL:SASL_PLAINTEXT,EXTERNAL:SASL_PLAINTEXT# 广播给客户端的地址
advertised.listeners=INTERNAL://192.168.162.99:9093,EXTERNAL://YOUR_PUBLIC_IP:9092# 内部 Broker 间通信使用内网
inter.broker.listener.name=INTERNAL# SASL 配置
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN
2️⃣ 配置 JAAS 文件 config/jaas.conf
vim /opt/kafka/config/jaas.conf
KafkaServer {org.apache.kafka.common.security.plain.PlainLoginModule requiredusername="admin"password="YourPassword123!"user_admin="YourPassword123!"user_zhangsan="123456"; # 可配置多个客户端账号
};
说明:
username/password:Kafka Broker 自身认证
user_XXX=“密码”:客户端可用账号
保证至少有一条 user_XXX 的密码与 username 一致
3️⃣修改启动脚本
vim /opt/kafka/bin/kafka-run-class.sh
if [ -z "$KAFKA_OPTS" ]; thenKAFKA_OPTS="-Djava.security.auth.login.config=/opt/kafka/config/jaas.conf"
fi
然后用:
nohup bin/kafka-server-start.sh config/server.properties >> logs/kafka-console.log 2>&1 &
4️⃣ 客户端连接配置
创建 config/admin-sasl-plain.properties:
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="YourPassword123!";
5️⃣ 测试客户端连接
测试 1:使用密码
/opt/kafka/bin/kafka-topics.sh --list \--bootstrap-server YOUR_PUBLIC_IP:9092 \--command-config config/admin-sasl-plain.properties
测试 2:不使用密码
/opt/kafka/bin/kafka-topics.sh --list --bootstrap-server YOUR_PUBLIC_IP:9092
结果会报错:TimeoutException,说明 SASL 认证生效。
6️⃣日志提示
如果日志出现:
Failed authentication ... (Authentication failed: Invalid username or password)
说明客户端密码错误或未配置。正常现象,可忽略。
7️⃣ SpringBoot 使用示例
spring:kafka:bootstrap-servers: YOUR_PUBLIC_IP:9092producer:properties:sasl.mechanism: PLAINsecurity.protocol: SASL_PLAINTEXTconsumer:properties:sasl.mechanism: PLAINsecurity.protocol: SASL_PLAINTEXT
kafka-jaas.conf:
KafkaClient {org.apache.kafka.common.security.plain.PlainLoginModule requiredusername="admin"password="YourPassword123!";
};
启动时加载 JAAS 配置:
@SpringBootApplication
public class Application {public static void main(String[] args) throws IOException {File file = ResourceUtils.getFile("classpath:kafka-jaas.conf");System.setProperty("java.security.auth.login.config", file.getAbsolutePath());SpringApplication.run(Application.class, args);}
}
✅ 总结
- 内外网双监听器可同时支持云主机内网和公网访问 SASL_PLAINTEXT
- 提供基本认证,但明文传输,需要结合 VPN 或 SSL
- 客户端必须使用 JAAS 配置才能访问 Kafka