Kafka 集群开启 SASL 认证实战(三):外置 ZooKeeper 完整版,quorum 认证 + ACL 访问控制
本系列终章。前两篇分别解决了"内置 zk 全套认证"和"外置 zk 只锁通道"两个场景,这一篇把安全等级拉满:kafka↔zk 认证 + zk ACL 白名单 + kafka 客户端认证三层一起上,做到 zk 连不上、kafka 进不去、topic 动不了。配置在 ZooKeeper 3.6.3 + Kafka 2.5.1 生产集群完整验证。
系列导航
| 篇 | 场景 | 链接 |
|---|---|---|
| 一 | 内置 ZooKeeper 的 Kafka 集群加 SASL 全套配置 | 点击直达 |
| 二 | 外置 ZooKeeper,只做 kafka↔zk 之间认证 | 点击直达 |
| 三 | 外置 ZooKeeper 完整版:quorum 认证 + zk ACL + 客户端认证(本篇) | 本篇 |
一、本篇达成什么
- zk 与 kafka 之间有加密认证(quorum + server-client 双通道)
- zk 对外通过 ACL 限制访问(IP 白名单,白名单外连 2181 直接拒绝)
- kafka 对客户端启用 SASL 认证(生产/消费都必须带账号)
架构图一句话版:
text
应用 --SASL_PLAINTEXT+账号--> Kafka --PLAIN+账号--> ZooKeeper --ACL/IP白名单--> 拒绝一切陌生连接
二、前置配置:zk 侧(与第二篇一致)
zk 侧的四个文件(zk_server.jaas、zk_client.jaas、java.env、zoo.cfg 追加 quorum 认证)与第二篇完全相同 ,不再重复贴,直接看:第二篇 ZooKeeper 侧配置。差异只有一点:zk_server.jaas 的 Server 段账号库建议把 kafka 用账号和管理账号分开,例如:
text
Server {
org.apache.zookeeper.server.auth.DigestLoginModule required
user_super="Test@12345"
user_zkclient="Test@12345";
};
三、Kafka 侧完整 SASL 配置
3.1 kafka.jaas(三段式,本篇核心差异)
bash
cd /opt/module/kafka_2.12-2.5.1/config
vi kafka.jaas
text
Client {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="zkclient"
password="Test@12345";
};
KafkaServer {
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 段,完整版多了 KafkaServer(broker 身份 + 客户端账号库)和 KafkaClient(broker 间通信身份)。
3.2 server.properties
properties
listeners=SASL_PLAINTEXT://192.168.10.31:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.enabled.mechanisms=PLAIN
sasl.mechanism.inter.broker.protocol=PLAIN
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
allow.everyone.if.no.acl.found=true
zookeeper.client.sasl=true
allow.everyone.if.no.acl.found=true的取舍:true 表示没设 ACL 的 topic 所有人可读写(兼容存量业务,平滑过渡);要收紧就改 false,然后逐个 topic 授权:
bash./bin/kafka-acls.sh --bootstrap-server 192.168.10.31:9092 \ --command-config ./config/command.properties \ --add --allow-principal User:admin --operation Read --operation Write --topic test-topic
注释残留旧配置(和前两篇相同):
properties
#advertised.host.name=192.168.10.31
#advertised.port=9092
#advertised.listeners=PLAINTEXT://192.168.10.31:9092
3.3 启动脚本
kafka-run-class.sh 挂 JAAS(与第二篇一致):
bash
export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/module/kafka_2.12-2.5.1/config/kafka.jaas"
3.4 客户端配置
producer.properties / 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
启动顺序依然是 zk 全部起来 → kafka 逐台起 ,起来后看 logs/server.log 无 SASL 报错再进行 ACL。
四、zk ACL 访问控制(IP 白名单)
SASL 管"你是谁",ACL 管"你能碰哪些路径"。对 kafka/hadoop 这类共用 zk 的组件,最实用的是 IP 维度白名单。
4.1 登录 zk 客户端
zk 独立安装时:
bash
cd /opt/module/apache-zookeeper-3.6.3-bin/bin
./zkCli.sh -server 192.168.10.31:2181
zk 是 kafka 自带时:
bash
./zookeeper-shell.sh 192.168.10.31:2181
4.2 设置白名单
例如只允许本机 + 三台 kafka 访问 zk 根目录及全部子目录:
text
setAcl -R / ip:127.0.0.1:cdrwa,ip:192.168.10.31:cdrwa,ip:192.168.10.32:cdrwa,ip:192.168.10.33:cdrwa
📌 三个保命细节:
- 务必带上
127.0.0.1------zk 自身的部分本地操作走 loopback,漏了它集群行为异常- 集群模式只需登录其中一台 zk 设置一次,配置会同步
- 重复执行
setAcl会整体覆盖之前的白名单,不是追加------每次都要写全量列表
低版本 zk 不支持 -R(递归),需要去掉 -R 逐级设置。
4.3 验证
text
getAcl /
返回的白名单与设置一致即生效;用白名单外的机器 zkCli 直连会被直接拒绝。
五、三重效果验证清单
| 目标 | 验证操作 | 预期 |
|---|---|---|
| kafka↔zk 认证 | broker 正常启动、kafka-topics.sh --list 正常 |
元数据读写正常 |
| zk 拒绝陌生连接 | 白名单外机器 zkCli.sh -server ...:2181 |
连接被拒 |
| kafka 拒绝裸客户端 | 不带 --producer.config 直接生产 |
SASL authentication failed |
| 授权 topic 可读写 | 带 config 的生产/消费 | 正常收发 |
六、踩坑清单(完整版专属)
| 坑 | 现象 | 解法 |
|---|---|---|
ACL 漏加 127.0.0.1 |
zk 状态异常、部分命令失败 | 白名单必带本机回环 |
| setAcl 覆盖了旧白名单 | 其他组件突然连不上 zk | 每次写全量 IP 列表 |
allow.everyone.if.no.acl.found=false 直接上生产 |
存量业务瞬间全断 | 先 true 过渡,逐 topic 授权后再收紧 |
| kafka.jaas 少了 KafkaClient 段 | broker 之间无法同步 | 三段配齐 |
Kafka 3.x 报 SimpleAclAuthorizer 废弃 |
启动警告/失败 | 3.x 改用 org.apache.kafka.metadata.authorizer.StandardAuthorizer |
总结
完整版 = 第二篇的 zk 配置 + kafka 侧三段式 JAAS + ACL 白名单,三层防护各管一段:SASL 管身份、ACL 管路径、IP 白名单管入口。上线节奏建议:先在测试环境完整跑一遍第五节的验证清单,生产变更时按"zk → kafka → ACL"顺序推进,ACL 最后上。
至此三步走完,你的 Kafka 从"裸奔"变成了"认证 + 白名单双保险"。系列三篇到此完结,欢迎收藏串联阅读。评论区聊聊:你们的等保/安全整改还有哪些组件没过关?
系列文章配置在 ZooKeeper 3.6.3 + Kafka 2.5.1 生产集群验证;示例密码请替换后使用。