Kafka 集群开启 SASL 认证实战(一):内置 ZooKeeper 场景,JAAS 配置全流程

Kafka 集群开启 SASL 认证实战(一):内置 ZooKeeper 场景,JAAS 配置全流程# Kafka 集群开启 SASL 认证实战(一):内置 ZooKeeper 场景,JAAS 配置全流程

Kafka 默认"裸奔"------任何能连到 9092 端口的客户端都能生产和消费数据,等保测评、安全扫描第一个抓的就是它。本系列用三篇文章把 Kafka SASL 认证讲透:(一)内置 ZooKeeper 场景全套配置(本篇)→(二)外置 ZooKeeper 之 kafka 与 zk 间认证 →(三)外置 ZooKeeper 完整版(quorum 认证 + ACL 访问控制)。所有配置在 Kafka 2.5 + 内置 ZooKeeper 生产集群验证通过,可直接复制。

系列导航

场景 状态
内置 ZooKeeper 的 Kafka 集群加 SASL(broker + 客户端 + zk 全套) 本篇
外置 ZooKeeper,只做 kafka↔zk 之间认证 敬请期待
外置 ZooKeeper 完整版:quorum 认证 + zk ACL + 客户端认证 敬请期待

一、方案总览

本篇采用的认证组合:SASL_PLAINTEXT + PLAIN 机制------通道不加密但要求账号密码,性能开销最小,是内网日志/数据管道场景最常用的选择(需要加密通道可换成 SASL_SSL,配置方式相同)。

内置 ZooKeeper 的集群要动的东西一共五类:

文件 位置 作用
kafka_server_jaas.conf kafka/config/ 服务端 JAAS:broker 间、broker↔zk、内置 zk 的认证身份
kafka_client_jaas.conf kafka/config/ 客户端 JAAS:命令行生产/消费的认证身份
server.properties kafka/config/ 开启 SASL 监听与 ACL 授权
启动脚本 kafka/bin/ 挂载 JAAS 文件的 JVM 参数
producer/consumer.properties kafka/config/ 命令行客户端的协议配置

下线窗口:配置期间集群需要重启,请安排停机窗口,先停 Kafka 再停 ZooKeeper。

二、停服务

登录每台服务器,查出并杀掉 Kafka 与内置 ZooKeeper 进程:

bash 复制代码
[root@kafka01 ~]# jps
29552 Jps
11923 QuorumPeerMain
13053 Kafka
[root@kafka01 ~]# kill -9 11923 13053

顺序很重要:先杀 Kafka 再杀 zk,避免 broker 对着半死的 zk 反复重连刷日志。

三、配置 JAAS 密钥文件

3.1 kafka_server_jaas.conf(服务端)

进入配置目录创建文件(本文密码统一用 Test@12345 演示,上线前务必替换成自己的强密码):

bash 复制代码
cd /opt/module/kafka/config
vi kafka_server_jaas.conf
text 复制代码
KafkaServer {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="Test@12345"
    user_admin="Test@12345";
};

Server {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="Test@12345"
    user_admin="Test@12345";
};

QuorumServer {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="Test@12345"
    user_admin="Test@12345";
};

KafkaClient {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="Test@12345";
};

Client {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="Test@12345";
};

五个段分别管什么(内置 zk 场景最容易懵的地方):

用途
KafkaServer broker 自身身份 + user_xxx 注册客户端账号(PLAIN 机制的用户库就写在这里)
Server / QuorumServer 内置 ZooKeeper 的服务端身份
KafkaClient broker 作为客户端连其他 broker 时用
Client broker 作为客户端连内置 zk 时用

user_admin="密码" 这一行是给客户端开账号------以后每个应用一个 user_名字 条目,权限隔离靠这个。

3.2 kafka_client_jaas.conf(客户端)

bash 复制代码
vi kafka_client_jaas.conf
text 复制代码
KafkaClient {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="Test@12345";
};

把两个 JAAS 文件拷贝到集群所有节点

四、修改 server.properties

追加或修改以下配置(listeners 的 IP 按本机实际填写):

properties 复制代码
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
super.users=User:admin
listeners=SASL_PLAINTEXT://192.168.10.31:9092

必须注释掉这两行(旧版单机部署常残留,会和 listeners 冲突导致客户端连不上):

properties 复制代码
#advertised.host.name=192.168.10.31
#advertised.port=9092

其余节点按各自 IP 修改后分发。

五、改造启动脚本

进入 kafka/bin,给脚本挂上 JAAS 的 JVM 参数:

bash 复制代码
cd /opt/module/kafka/bin

kafka-server-start.sh(加在脚本启动逻辑之前):

bash 复制代码
export KAFKA_OPTS="$KAFKA_OPTS -Djava.security.auth.login.config=/opt/module/kafka/config/kafka_server_jaas.conf"

zookeeper-server-start.sh(同样方式,指向同一个服务端 JAAS):

bash 复制代码
export KAFKA_OPTS="$KAFKA_OPTS -Djava.security.auth.login.config=/opt/module/kafka/config/kafka_server_jaas.conf"

kafka-console-producer.sh / kafka-console-consumer.sh(指向客户端 JAAS):

bash 复制代码
export KAFKA_OPTS="$KAFKA_OPTS -Djava.security.auth.login.config=/opt/module/kafka/config/kafka_client_jaas.conf"

改四个脚本比改 kafka-run-class.sh 一处更繁琐,但不会影响依赖 run-class 的其他工具行为,出问题好排查。

六、按顺序启动

先 zk 后 kafka,每台依次执行:

bash 复制代码
cd /opt/module/kafka
./bin/zookeeper-server-start.sh -daemon ./config/zookeeper.properties
./bin/kafka-server-start.sh -daemon ./config/server.properties

启动后先看日志确认无认证报错:

bash 复制代码
tail -f /opt/module/kafka/logs/server.log

七、客户端验证

给命令行生产者/消费者配置文件追加协议:

bash 复制代码
cd /opt/module/kafka/config
vi producer.properties   # 末尾追加下面两行
vi consumer.properties
properties 复制代码
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN

带配置生产、消费各跑一轮:

bash 复制代码
./bin/kafka-console-producer.sh --broker-list 192.168.10.31:9092 \
  --producer.config ./config/producer.properties --topic test-topic

./bin/kafka-console-consumer.sh --bootstrap-server 192.168.10.31:9092 \
  --consumer.config ./config/consumer.properties --topic test-topic --from-beginning

不带配置直连会被拒绝 (报 SASL authentication failed 或连接直接断开),这就是认证生效的标志。

八、应用侧接入

Java 应用(Spring Boot yaml 示例,对应 kafka-clients 的 sasl.jaas.config):

yaml 复制代码
spring:
  kafka:
    bootstrap-servers: 192.168.10.31:9092
    properties:
      security:
        protocol: SASL_PLAINTEXT
      sasl:
        mechanism: PLAIN
        jaas:
          config: 'org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="Test@12345";'

改完应用配置记得重启消费组/数据处理任务,否则它们还在用旧连接重试。

九、踩坑清单

现象 解法
忘注释 advertised.host.name 客户端拿到旧地址连不上 注释掉,让 listeners 接管
JAAS 没分发到所有节点 部分节点起不来,日志报 No JAAS configuration section named KafkaServer 全节点拷贝
客户端配置了但没重启 一直报认证失败 重启应用/任务
只改了 broker 没改内置 zk 的段 zk 起不来或 broker 注册不上 五个段配齐
Kafka 3.x 集群照抄 SimpleAclAuthorizer 已废弃 3.x 改用 org.apache.kafka.metadata.authorizer.StandardAuthorizer

总结

内置 ZooKeeper 场景的核心是一份五段式 JAAS + server.properties 六行配置 + 四个启动脚本挂参数,改完按 zk→kafka 顺序重启,命令行带配置验证通过即可交付。下一篇讲外置 ZooKeeper 的场景------只需要锁 kafka 与 zk 之间通道时,配置比这更简单,敬请期待。

你们的 Kafka 是裸奔还是有认证?等保测评被抓过未授权访问吗?评论区聊聊。


系列文章配置在 Kafka 2.5.1 生产集群验证;示例密码请替换后使用。

相关推荐
木圭的AI时代指南24 分钟前
Spark-X2.5 长输入 Agent 实测:全量读取陷阱与解释器寻找死循环复盘,附可复现任务
大数据·分布式·spark
KANGBboy9 小时前
doris+kafka安装部署(单机+集群)二时钟服务器 java_home
服务器·分布式
爱笑的k1111 小时前
分布式通信原语
分布式·ai infra
实战派K8S&DB11 小时前
GaussDB 高可用演进:从流复制到 DCF 分布式共识
分布式·gaussdb
写后端的胖头鱼12 小时前
【高频面试题】分布式锁在项目中的应用
java·分布式·后端·分布式锁·高频面试题
clz131452113 小时前
Kafka 日消 10 亿场景:用 ConcurrentLinkedQueue 实现高性能批量消费缓冲
分布式·kafka·linq
隐擎fox1 天前
高性能网络爬虫架构设计:基于 Python 的长连接复用与分布式会话池调度实践
分布式·python·网络协议·tcp/ip·高并发·网络爬虫、
闲云自留地1 天前
云平台存储管理员:Cinder 创建挂载卷 + Swift 分布式存储原理
分布式·wpf·swift
橙子圆1231 天前
RabbitMQ知识1
分布式·rabbitmq