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 生产集群验证;示例密码请替换后使用。