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.confkafka/config/服务端 JAAS:broker 间、broker↔zk、内置 zk 的认证身份
kafka_client_jaas.confkafka/config/客户端 JAAS:命令行生产/消费的认证身份
server.propertieskafka/config/开启 SASL 监听与 ACL 授权
启动脚本kafka/bin/挂载 JAAS 文件的 JVM 参数
producer/consumer.propertieskafka/config/命令行客户端的协议配置

下线窗口:配置期间集群需要重启,请安排停机窗口,先停 Kafka 再停 ZooKeeper。

二、停服务

登录每台服务器,查出并杀掉 Kafka 与内置 ZooKeeper 进程:

[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 演示,上线前务必替换成自己的强密码):

cd /opt/module/kafka/config
vi kafka_server_jaas.conf
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 场景最容易懵的地方):

用途
KafkaServerbroker 自身身份 + user_xxx 注册客户端账号(PLAIN 机制的用户库就写在这里)
Server / QuorumServer内置 ZooKeeper 的服务端身份
KafkaClientbroker 作为客户端连其他 broker 时用
Clientbroker 作为客户端连内置 zk 时用

user_admin="密码" 这一行是给客户端开账号——以后每个应用一个 user_名字 条目,权限隔离靠这个。

3.2 kafka_client_jaas.conf(客户端)

vi kafka_client_jaas.conf
KafkaClient {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="Test@12345";
};

把两个 JAAS 文件拷贝到集群所有节点

四、修改 server.properties

追加或修改以下配置(listeners 的 IP 按本机实际填写):

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 冲突导致客户端连不上):

#advertised.host.name=192.168.10.31
#advertised.port=9092

其余节点按各自 IP 修改后分发。

五、改造启动脚本

进入 kafka/bin,给脚本挂上 JAAS 的 JVM 参数:

cd /opt/module/kafka/bin

kafka-server-start.sh(加在脚本启动逻辑之前):

export KAFKA_OPTS="$KAFKA_OPTS -Djava.security.auth.login.config=/opt/module/kafka/config/kafka_server_jaas.conf"

zookeeper-server-start.sh(同样方式,指向同一个服务端 JAAS):

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):

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,每台依次执行:

cd /opt/module/kafka
./bin/zookeeper-server-start.sh -daemon ./config/zookeeper.properties
./bin/kafka-server-start.sh -daemon ./config/server.properties

启动后先看日志确认无认证报错:

tail -f /opt/module/kafka/logs/server.log

七、客户端验证

给命令行生产者/消费者配置文件追加协议:

cd /opt/module/kafka/config
vi producer.properties   # 末尾追加下面两行
vi consumer.properties
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN

带配置生产、消费各跑一轮:

./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):

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sayai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值