Kafka 2.8怎么开启SASL安全认证?具体配置步骤有哪些?

文章导读
Kafka 2.8 开启 SASL 认证需要在 Broker 端配置监听器和安全机制,并在客户端提供对应的 JAAS 配置。生产环境强烈建议优先使用 SCRAM-SHA-256 或 SCRAM-SHA-512 机制配合 SSL 加密,避免明文传输密码。
📋 目录
  1. 命令速用版(测试环境)
  2. 生产环境 SASL_SSL 配置示例
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

Kafka 2.8 开启 SASL 认证需要在 Broker 端配置监听器和安全机制,并在客户端提供对应的 JAAS 配置。生产环境强烈建议优先使用 SCRAM-SHA-256 或 SCRAM-SHA-512 机制配合 SSL 加密,避免明文传输密码。

先说结论:Kafka 2.8 支持多种 SASL 机制,配置核心在于 Broker 的 listeners 设置与客户端的 JAAS 登录模块,开启后所有连接必须通过认证。

  • 适合:需要控制客户端访问权限、防止未授权连接的生产集群。
  • 先准备:确定 SASL 机制(推荐 SCRAM)、备份配置文件、规划账号体系、准备 SSL 证书(生产环境)。
  • 验收:使用 kafka-console-producer.sh 携带配置测试连接,确认无认证报错,且 Broker 日志无异常。

命令速用版(测试环境)

以下是 Broker 端 server.properties 的关键配置片段,适用于内网测试环境(SASL_PLAINTEXT)。直接替换或追加到配置文件中:

listeners=SASL_PLAINTEXT://0.0.0.0:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
sasl.enabled.mechanisms=SCRAM-SHA-256
listener.name.sasl_plaintext.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="admin-secret";

注意:上述配置仅用于测试,密码在网络中明文传输。生产环境请参考下文 SASL_SSL 配置。

生产环境 SASL_SSL 配置示例

生产环境必须配合 SSL/TLS 加密传输,防止密码抓包泄露。需提前准备好 keystore 和 truststore 证书文件。

listeners=SASL_SSL://0.0.0.0:9093
security.inter.broker.protocol=SASL_SSL
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
sasl.enabled.mechanisms=SCRAM-SHA-256
ssl.keystore.location=/var/ssl/private/kafka.server.keystore.jks
ssl.keystore.password=keystore-password
ssl.key.password=key-password
ssl.truststore.location=/var/ssl/private/kafka.server.truststore.jks
ssl.truststore.password=truststore-password
listener.name.sasl_ssl.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="admin-secret";

分步处理

1. 选择安全机制
Kafka 2.8 支持 PLAIN、SCRAM-SHA-256、SCRAM-SHA-512、GSSAPI 等。SCRAM 机制不需要 Kerberos 基础设施,配置相对简单,适合大多数场景。PLAIN 机制仅建议在 SSL 加密通道下使用,否则密码明文。

2. 配置 Broker 端
修改 config/server.properties。若使用 SCRAM,listeners 需改为 SASL_PLAINTEXT 或 SASL_SSL。配置 sasl.enabled.mechanisms 包含所选机制。如果是集群,inter.broker 协议也需对应修改。

3. 创建用户凭证
使用 kafka-configs.sh 脚本创建用户。例如创建 SCRAM 用户:

Kafka 2.8怎么开启SASL安全认证?具体配置步骤有哪些?
bin/kafka-configs.sh `--zookeeper` localhost:2181 `--alter` `--add-config` 'SCRAM-SHA-256=[password=your_password]' `--entity-type` users `--entity-name` admin

注意:ZooKeeper 地址需指向 Kafka 使用的 ZK 集群。若需批量创建用户,可使用以下脚本示例:

#!/bin/bash
users=("user1" "user2" "user3")
for user in "${users[@]}"; do
  bin/kafka-configs.sh `--zookeeper` localhost:2181 `--alter` `--add-config` 'SCRAM-SHA-256=[password=common_password]' `--entity-type` users `--entity-name` $user
done

4. 配置客户端
客户端需要创建 JAAS 配置文件或在命令行传入 sasl.jaas.config。例如 producer.properties:

security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="your_password";

若使用 SASL_SSL,还需配置 ssl.truststore.location 等 SSL 相关参数。

5. 重启 Broker
配置生效后需重启 Kafka Broker 进程。建议分批重启以避免服务中断。

bin/kafka-server-stop.sh
bin/kafka-server-start.sh config/server.properties

怎么验证是否生效

使用控制台生产者发送消息,若不携带认证配置应连接失败,携带正确配置应成功。

失败预期命令(无认证信息):
bin/kafka-console-producer.sh `--broker-list` localhost:9092 `--topic` test
此时客户端应报错 AuthenticationException,Broker 日志可能出现:

Kafka 2.8怎么开启SASL安全认证?具体配置步骤有哪些?
[2023-10-27 10:00:00,000] WARN Exception while processing request from /127.0.0.1 (kafka.network.Processor)
org.apache.kafka.common.errors.SaslAuthenticationException: Authentication failed: Invalid SCRAM credentials

成功预期命令(携带配置文件):
bin/kafka-console-producer.sh `--broker-list` localhost:9092 `--topic` test `--producer`.config client.properties

检查 Broker 日志(logs/server.log),确认没有 SASL 握手失败的报错,且有成功的认证记录。

常见坑

1. 传输层未加密:SASL_PLAINTEXT 配合 PLAIN 机制会以明文传输密码,存在抓包泄露风险。生产环境必须使用 SASL_SSL 或至少配合 SCRAM 机制。

2. ZooKeeper 未开启安全:开启 Kafka SASL 后,如果 ZooKeeper 本身未做加固,攻击者仍可能通过 ZK 修改配置。建议同步开启 ZK 认证。

3. 监听器名称大小写:Kafka 配置中监听器名称(如 SASL_PLAINTEXT)在部分参数中需转为小写匹配(如 listener.name.sasl_plaintext...),大小写不一致会导致启动失败。

4. JAAS 配置语法:JAAS 配置字符串末尾必须有分号,且用户名密码参数名需与机制匹配(PLAIN 用 username/password,SCRAM 也用 username/password 但模块名不同)。

5. 客户端协议不匹配:客户端 security.protocol 必须与 Broker listeners 协议一致,否则直接连接拒绝。

参考来源

  • Apache Kafka Documentation, "Security", https://kafka.apache.org/documentation.html#security
  • Apache Kafka Documentation, "Configuration Guide", https://kafka.apache.org/documentation.html#brokerconfigs