Kafka 集群开启 SASL 认证实战(三):外置 ZooKeeper 完整版,quorum 认证 + ACL 访问控制

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 + 客户端认证(本篇) 本篇

一、本篇达成什么

  1. zk 与 kafka 之间有加密认证(quorum + server-client 双通道)
  2. zk 对外通过 ACL 限制访问(IP 白名单,白名单外连 2181 直接拒绝)
  3. 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

📌 三个保命细节:

  1. 务必带上 127.0.0.1------zk 自身的部分本地操作走 loopback,漏了它集群行为异常
  2. 集群模式只需登录其中一台 zk 设置一次,配置会同步
  3. 重复执行 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 生产集群验证;示例密码请替换后使用。

相关推荐
用户1494484813205 小时前
同为消息队列,RocketMQ 和 Kafka 的底层设计差在哪?
kafka
开开心心就好9 小时前
办公软件卸载不干净?专用工具一键清残留
java·前端·人工智能·智能手机·kafka·excel·memcache
ly76891 天前
ISR 收缩与 HW 推进:副本同步的边界条件与 UnderReplicated 排障
数据库·kafka·c#·linq·isr·hw·副本同步
此时不提桶,更待何时3 天前
06-09-A-Kafka架构与存储原理详解
架构·kafka·linq
醉颜凉4 天前
Kafka 与 RabbitMQ/RocketMQ 选型对比:场景匹配、性能基准与迁移成本
kafka·消息队列·rabbitmq·rocketmq·中间件选型
筑梦之路4 天前
K8S yaml文件部署kafka集群(Kraft模式)——筑梦之路
容器·kafka·kubernetes
筑梦之路4 天前
Kafka KRaft 模式 Kubernetes 部署手册(StatefulSet + apache/kafka 官方镜像)——筑梦之路
kafka·kubernetes·apache
智码看视界5 天前
技术选型指南:Pulsar vs Kafka:消息队列选型终极对比与压测
kafka·消息队列·pulsar·消息中间件·流处理·高吞吐·架构选型
俊哥大数据6 天前
Flink1.20.3 实时消费 Kafka 数据并解析入湖 Paimon1.4.2 全流程实战
分布式·flink·kafka·数据湖·paimon
今年下半年6 天前
记录一次IBMS物联网项目的架构设计及技术栈应用
物联网·websocket·网络协议·tcp/ip·微服务·udp·kafka