java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > kafka kraft模式JAAS 配置

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

作者:飞火流星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";
};

关键说明‌:

二、修改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 配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文