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

 更新时间:2026年07月07日 09:48:14   作者:飞火流星02027  
在Apache Kafka的Kraft模式(也称为Raft模式)中,安全性是通过Zookeeper来实现的,但在Kraft模式下,我们使用的是Kafka自带的Raft协议来管理集群元数据,本文介绍在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 配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入理解SpringCloud之Eureka注册过程分析

    深入理解SpringCloud之Eureka注册过程分析

    eureka是一种去中心化的服务治理应用,其显著特点是既可以作为服务端又可以作为服务向自己配置的地址进行注册,这篇文章主要介绍了深入理解SpringCloud之Eureka注册过程分析
    2018-05-05
  • Java编译时类型与运行时类型

    Java编译时类型与运行时类型

    这篇文章主要介绍了Java编译时类型与运行时类型,文章以父类BaseClass和子类SubClass为例展开对主题的探讨,具有一的 参考价值,需要的小伙伴可以参考一下
    2022-03-03
  • Java毕业设计实战之药店信息管理系统的实现

    Java毕业设计实战之药店信息管理系统的实现

    这是一个使用了java+SSM+JSP+layui+maven+mysql开发的药店信息管理系统,是一个毕业设计的实战练习,具有药店信息管理该有的所有功能,感兴趣的朋友快来看看吧
    2022-01-01
  • Java数据封装树形结构代码实例

    Java数据封装树形结构代码实例

    这篇文章主要介绍了Java数据封装树形结构代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • SWT JFace Bookmark 制作

    SWT JFace Bookmark 制作

    SWT JFace Bookmark 制作
    2009-06-06
  • java针对于时间转换的DateUtils工具类

    java针对于时间转换的DateUtils工具类

    这篇文章主要为大家详细介绍了java针对于时间转换的DateUtils工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • MyBatis使用Zookeeper保存数据库的配置可动态刷新的实现代码

    MyBatis使用Zookeeper保存数据库的配置可动态刷新的实现代码

    这篇文章主要介绍了MyBatis使用Zookeeper保存数据库的配置,可动态刷新,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • java实现简易的学籍管理系统

    java实现简易的学籍管理系统

    这篇文章主要为大家详细介绍了java实现简易的学籍管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • java设计模式之单例模式学习

    java设计模式之单例模式学习

    单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在
    2014-01-01
  • Spring @Configuration和@Component的区别

    Spring @Configuration和@Component的区别

    今天小编就为大家分享一篇关于Spring @Configuration和@Component的区别,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12

最新评论