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

相关推荐
Sayai1 小时前
Kafka 集群开启 SASL 认证实战(三):外置 ZooKeeper 完整版,quorum 认证 + ACL 访问控制
zookeeper·kafka·linq
海兰1 小时前
【Kafka进阶6】顺序消费深度解析
分布式·kafka·linq
2601_960906722 小时前
Anthropic把Claude Code 2.1.236及以上版本的Fable 5会话
人工智能·kafka·时序数据库·etcd·tdengine
YH行业报告分析5 小时前
2026年直流配电网市场结构性增长解析:分布式能源并网与智能电网升级驱动下的技术路线博弈
分布式·能源
剑胆琴心静水深流13 小时前
全栈之路6---web集成与呈现
前端·vue.js·spring boot·分布式·spring·前端框架·npm
xiamo@moment17 小时前
kafka学习笔记-概念总集
运维·kafka
KAIWEILIUCC18 小时前
Ray:高性能、易扩展的Python分布式计算框架
分布式·llm
一路向北finish21 小时前
《CentOS 7 搭建 Hadoop 3.3.6 分布式集群:NFS 共享方案完整实操》
linux·运维·hadoop·分布式·centos
天涯明月19931 天前
Ray 架构解析——以动态任务图统一 AI 计算的分布式框架
大数据·人工智能·分布式·架构·ray