在kafka kraft模式启动时使用的 JAAS 配置示例

一、创建 JAAS 配置文件
文件路径:config/kafka_server_jaas.conf
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin-secret"
user_log_agent="gzagent#wn1WEE01"
user_log_server="gzserver#wn1WEE02";
};关键说明:
username/password:Broker 节点之间通信的管理员账户(KRaft 模式下 Controller 与 Broker 通信也需要)。user_<用户名>:客户端连接时使用的账户,前缀必须是user_,后接用户名。- 分号
;不能少,否则认证失败。 - 密码中的
#是合法字符,无需转义。
二、修改config/kraft/server.properties
# ========== Broker 基础配置 ========== node.id=1 controller.quorum.voters=1@localhost:9093 process.roles=broker,controller listeners=SASL_PLAINTEXT://localhost:9092,CONTROLLER://localhost:9093 advertised.listeners=SASL_PLAINTEXT://localhost:9092 inter.broker.listener.name=SASL_PLAINTEXT controller.listener.names=CONTROLLER listener.security.protocol.map=CONTROLLER:PLAINTEXT,SASL_PLAINTEXT:SASL_PLAINTEXT # ========== SASL 认证配置 ========== sasl.enabled.mechanisms=PLAIN sasl.mechanism.inter.broker.protocol=PLAIN # ========== 授权配置(配合 ACL 使用) ========== authorizer.class.name=kafka.security.authorizer.AclAuthorizer allow.everyone.if.no.acl.found=false super.users=User:admin # ========== 日志目录 ========== log.dirs=/tmp/kraft-combined-logs
三、修改启动脚本,加载 JAAS 文件
文件:bin/kafka-server-start.sh
在文件开头(export KAFKA_HEAP_OPTS 附近)添加:
# 加载 JAAS 配置文件 export KAFKA_OPTS="-Djava.security.auth.login.config=/path/to/kafka/config/kafka_server_jaas.conf"
请将
/path/to/kafka/替换为你的实际安装路径。
四、格式化存储并启动
# 加载 JAAS 配置文件 export KAFKA_OPTS="-Djava.security.auth.login.config=/path/to/kafka/config/kafka_server_jaas.conf"
五、创建用户并分配 ACL
服务启动后,使用 kafka-configs.sh 动态创建用户并设置 SCRAM 密码(推荐 SCRAM,比 PLAIN 更安全):
# ========== 创建用户 log_agent(写权限)========== bin/kafka-configs.sh --bootstrap-server localhost:9092 \ --alter \ --add-config 'SCRAM-SHA-512=[password=gzagent#wn1WEE01]' \ --entity-type users \ --entity-name log_agent # ========== 创建用户 log_server(读权限)========== bin/kafka-configs.sh --bootstrap-server localhost:9092 \ --alter \ --add-config 'SCRAM-SHA-512=[password=gzserver#wn1WEE02]' \ --entity-type users \ --entity-name log_server
⚠️ 如果使用 PLAIN 机制(如上方 JAAS 配置),则用户信息已经在
kafka_server_jaas.conf中定义,无需再执行kafka-configs.sh创建,直接用user_log_agent/user_log_server连接即可。但 PLAIN 密码以明文传输,生产环境强烈建议改用 SCRAM-SHA-512。
六、分配 ACL 权限
# 允许 log_agent 向 Topic 写入 bin/kafka-acls.sh --bootstrap-server localhost:9092 \ --add \ --allow-principal User:log_agent \ --operation Write \ --topic my-private-topic # 允许 log_server 从 Topic 读取 bin/kafka-acls.sh --bootstrap-server localhost:9092 \ --add \ --allow-principal User:log_server \ --operation Read \ --topic my-private-topic \ --group log-server-group
七、客户端连接配置(生产者 / 消费者)
生产者(log_agent)
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("security.protocol", "SASL_PLAINTEXT"); // KRaft 单机可用 PLAINTEXT,生产建议 SASL_SSL
props.put("sasl.mechanism", "PLAIN"); // 或 "SCRAM-SHA-512"
props.put("sasl.jaas.config",
"org.apache.kafka.common.security.plain.PlainLoginModule required " +
"username=\"log_agent\" password=\"gzagent#wn1WEE01\";");消费者(log_server)
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("security.protocol", "SASL_PLAINTEXT");
props.put("sasl.mechanism", "PLAIN");
props.put("sasl.jaas.config",
"org.apache.kafka.common.security.plain.PlainLoginModule required " +
"username=\"log_server\" password=\"gzserver#wn1WEE02\";");
props.put("group.id", "log-server-group");方案对比总结
| 机制 | JAAS 中定义 | kafka-configs.sh 创建 | 安全性 | 推荐场景 |
|---|---|---|---|---|
| SASL/PLAIN | ✅ 在 kafka_server_jaas.conf 中 | ❌ 不需要 | 低(密码明文传输) | 开发/测试 |
| SASL/SCRAM-SHA-512 | ❌ 不需要 | ✅ 动态创建 | 高(密码不传输) | 生产环境 |
你的需求是 KRaft 启动配置,所以直接用上面的 kafka_server_jaas.conf + PLAIN 机制即可快速跑通。如需生产级安全,建议将 sasl.enabled.mechanisms 改为 SCRAM-SHA-512,并用 kafka-configs.sh 创建用户。

附件一:Kafka客户端四类常用的安全协议
PLAINTEXT SSL SASL_PLAINTEXT SASL_SSL
| 安全协议类型 | 传输加密能力 | 身份认证能力 | 核心特点 | 典型适用场景 | 安全等级 |
|---|---|---|---|---|---|
| PLAINTEXT | ❌ 无任何加密,所有数据明文传输 | ❌ 无身份校验,连通网络即可访问 | 配置最简单、性能损耗几乎为0,完全无安全防护 | 完全隔离的内网开发测试环境,禁止在生产/公网使用 | 极低 |
| SSL | ✅ 基于TLS/SSL全程加密传输,防窃听、防篡改 | ❌ 仅做传输层加密,不提供账号类身份校验 | 只保障数据传输链路安全,不做访问者身份管控 | 仅需要加密传输数据,不需要额外用户权限管控的集群 | 中等 |
| SASL_PLAINTEXT | ❌ 数据和认证信息均明文传输 | ✅ 通过SASL框架校验用户名密码,拦截未授权访问 | 实现了基础的用户权限管控,但账号密码存在被窃听风险 | 封闭内网环境中快速实现基础访问控制,不对外暴露 | 中高 |
| SASL_SSL | ✅ 全程TLS加密,所有传输数据密文传输 | ✅ 同时支持SASL账号密码身份校验 | 兼顾身份认证和传输加密,彻底避免数据泄露、账号盗用风险 | 生产环境集群、公网暴露的集群,是生产级标准安全配置 | 最高 |

附件二:kafka的几种sasl.mechanism对比
Kafka 官方支持的主流 SASL 认证机制,核心差异集中在密码传输方式、存储形态、安全性、运维成本等维度,以下是完整对比:
表格
| SASL 机制 | 密码传输形态 | 服务端密码存储 | 依赖外部组件 | 安全等级 | 核心特点 | 典型适用场景 |
|---|---|---|---|---|---|---|
| PLAIN | 明文传输 | 明文存储在 JAAS 配置文件中 | 无,完全内置实现 | 低 | 配置最简单,开发调试零门槛,但账号密码全程明文暴露,极易被窃听 | 仅用于完全隔离的内网开发测试环境,禁止生产使用 |
| SCRAM-SHA-256 / SCRAM-SHA-512 | 传输随机挑战值,密码本身不直接传输 | 加盐哈希值存储在 Kafka 内部 Topic 中,无明文密码留存 | 无,完全内置实现 | 高 | 兼顾安全性和易用性,支持动态增删改用户,无需重启集群,是 Kafka 生产环境的主流标准方案 | 绝大多数自建生产集群,不需要额外引入外部认证服务的场景 |
| GSSAPI (Kerberos) | 基于 Ticket 票据完成身份校验,全程不传递密码 | 密码存储在独立的 Kerberos KDC 服务端 | 必须部署 Kerberos 域控服务 | 极高 | 企业级强认证方案,支持全集群统一身份管控,安全性拉满,但运维复杂度极高 | 大型金融、政企等已有成熟 Kerberos 体系的企业级生产集群 |
| OAUTHBEARER | 基于 JWT 令牌完成认证,不传递原始密码 | 无本地密码存储,依赖外部授权服务校验令牌有效性 | 必须对接 OAuth2 授权服务 | 高 | 支持动态令牌、细粒度权限、单点登录,适配云原生生态 | 云托管 Kafka 集群、需要对接统一 OAuth 身份体系的云原生场景 |
| LDAP | 需额外扩展自定义实现,原生不直接支持 | 密码存储在外部 LDAP 服务端 | 必须对接 LDAP 目录服务 | 中高 | 复用企业已有的账号体系,无需在 Kafka 侧重复维护用户 | 已有统一 LDAP 账号管理的企业,实现账号打通的场景 |
到此这篇关于在kafka kraft模式启动时使用的 JAAS 配置示例的文章就介绍到这了,更多相关kafka kraft模式JAAS 配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
MyBatis使用Zookeeper保存数据库的配置可动态刷新的实现代码
这篇文章主要介绍了MyBatis使用Zookeeper保存数据库的配置,可动态刷新,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-08-08
Spring @Configuration和@Component的区别
今天小编就为大家分享一篇关于Spring @Configuration和@Component的区别,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2018-12-12


最新评论