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.jaaszk_client.jaasjava.envzoo.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.logSASL 报错再进行 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 生产集群验证;示例密码请替换后使用。

相关推荐
海兰1 小时前
【Kafka进阶6】顺序消费深度解析
分布式·kafka·linq
2601_960906722 小时前
Anthropic把Claude Code 2.1.236及以上版本的Fable 5会话
人工智能·kafka·时序数据库·etcd·tdengine
xiamo@moment17 小时前
kafka学习笔记-概念总集
运维·kafka
あ-2 天前
kafka broker迁移
kafka
海兰2 天前
【 Kafka进阶5】使用 Docker 部署 Apache Kafka 集群完全指南
docker·kafka·apache
csdn_aspnet2 天前
C# 在逗号分割的字符串中判断是否包含指定字符
c#·正则·linq·string·regex·contains
JavaPub-rodert3 天前
为什么 ZooKeeper 选择 CP,而 Eureka 选择 AP?
分布式·zookeeper·eureka
海兰3 天前
【Kafka进阶4】KRaft 完全指南:Apache Kafka 摆脱 ZooKeeper 的架构
zookeeper·kafka·apache
海兰4 天前
【 Kafka进阶3】Apache Kafka 分布式事件流平台:架构原理与微服务解耦机制简要分析
分布式·架构·kafka