Kafka KRaft + SSL + SASL/PLAIN 部署文档

本文档介绍如何在 Windows 环境下部署 Kafka 4.x,使用 KRaft 模式、SSL 加密和 SASL/PLAIN 认证。stevensu1/test-kafka

1. 环境准备

  • JDK 17 或更高版本
  • Kafka 4.x 版本(本文档基于 kafka_2.13-4.0.0)

2. 目录结构

D:\kafka_2.13-4.0.0\
├── bin\windows\
├── config\
│   ├── server.properties
│   ├── ssl.properties
│   ├── jaas.conf
│   └── log4j2.properties
├── logs\
└── config\ssl\
    ├── kafka.server.keystore.jks
    └── kafka.server.truststore.jks
    

3. 配置文件说明

3.1 server.properties

# 节点角色配置
process.roles=broker,controller
node.id=1

# 监听器配置
listeners=PLAINTEXT://:9092,CONTROLLER://:9093,SSL://:9094,SASL_SSL://:9095
advertised.listeners=SSL://localhost:9094,SASL_SSL://localhost:9095
controller.listener.names=CONTROLLER
inter.broker.listener.name=SSL
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_SSL:SASL_SSL

# 控制器配置
controller.quorum.voters=1@localhost:9093

# 日志配置
log.dirs=D:/kafka_2.13-4.0.0/logs

# 安全配置
sasl.enabled.mechanisms=PLAIN
sasl.mechanism.inter.broker.protocol=PLAIN
authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer
allow.everyone.if.no.acl.found=true

# SSL 配置
ssl.keystore.location=config/ssl/kafka.server.keystore.jks
ssl.keystore.password=kafka123
ssl.key.password=kafka123
ssl.truststore.location=config/ssl/kafka.server.truststore.jks
ssl.truststore.password=kafka123
ssl.client.auth=required
ssl.enabled.protocols=TLSv1.2,TLSv1.3
ssl.endpoint.identification.algorithm=HTTPS
ssl.secure.random.implementation=SHA1PRNG
    

3.2 ssl.properties

# SSL 配置
ssl.keystore.location=config/ssl/kafka.server.keystore.jks
ssl.keystore.password=kafka123
ssl.key.password=kafka123
ssl.truststore.location=config/ssl/kafka.server.truststore.jks
ssl.truststore.password=kafka123
ssl.client.auth=required
ssl.enabled.protocols=TLSv1.2,TLSv1.3
ssl.endpoint.identification.algorithm=HTTPS
ssl.secure.random.implementation=SHA1PRNG
    

3.3 jaas.conf

KafkaServer {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="admin-secret"
    user_admin="admin-secret"
    user_alice="alice-secret";
};
    

3.4 log4j2.properties

status = INFO
name = KafkaConfig

# 控制台输出
appender.console.type = Console
appender.console.name = console
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

# 文件输出
appender.kafka.type = RollingFile
appender.kafka.name = kafka
appender.kafka.fileName = ${sys:kafka.logs.dir}/server.log
appender.kafka.filePattern = ${sys:kafka.logs.dir}/server-%d{yyyy-MM-dd}-%i.log.gz
appender.kafka.layout.type = PatternLayout
appender.kafka.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
appender.kafka.policies.type = Policies
appender.kafka.policies.time.type = TimeBasedTriggeringPolicy
appender.kafka.policies.size.type = SizeBasedTriggeringPolicy
appender.kafka.policies.size.size = 100MB
appender.kafka.strategy.type = DefaultRolloverStrategy
appender.kafka.strategy.max = 10

# 根日志配置
rootLogger.level = INFO
rootLogger.appenderRefs = console, kafka
rootLogger.appenderRef.console.ref = console
rootLogger.appenderRef.kafka.ref = kafka

# Kafka 日志配置
logger.kafka.name = kafka
logger.kafka.level = INFO
logger.kafka.additivity = false
logger.kafka.appenderRefs = console, kafka
logger.kafka.appenderRef.console.ref = console
logger.kafka.appenderRef.kafka.ref = kafka
    

4. 部署步骤

4.1 初始步骤

1. 下载 Kafka 4.x 版本(本文档基于 kafka_2.13-4.0.0)

2. 解压到 D:\kafka_2.13-4.0.0

3. 创建必要的目录:

mkdir D:\kafka_2.13-4.0.0\logs
mkdir D:\kafka_2.13-4.0.0\config\ssl
    

4. 创建配置文件(server.properties、ssl.properties、jaas.conf、log4j2.properties)

4.2 生成 SSL 证书

运行以下命令生成 SSL 证书:

# 1. 生成 CA 私钥和证书
openssl req -new -x509 -keyout ca-key -out ca-cert -days 365 -nodes -subj "/CN=kafka-ca"

# 2. 生成服务器私钥
openssl genrsa -out kafka.server.key 2048

# 3. 生成服务器证书签名请求(CSR)
openssl req -new -key kafka.server.key -out kafka.server.csr -subj "/CN=localhost"

# 4. 使用 CA 证书签名服务器证书
openssl x509 -req -CA ca-cert -CAkey ca-key -in kafka.server.csr -out kafka.server.cert -days 365 -CAcreateserial

# 5. 创建 JKS 格式的密钥库
keytool -import -alias ca -file ca-cert -keystore kafka.server.truststore.jks -storepass kafka123 -noprompt
keytool -import -alias server -file kafka.server.cert -keystore kafka.server.keystore.jks -storepass kafka123 -noprompt

# 6. 将私钥导入密钥库
openssl pkcs12 -export -in kafka.server.cert -inkey kafka.server.key -out kafka.server.p12 -name server -password pass:kafka123
keytool -importkeystore -srckeystore kafka.server.p12 -srcstoretype PKCS12 -destkeystore kafka.server.keystore.jks -deststoretype JKS -srcstorepass kafka123 -deststorepass kafka123

# 7. 移动证书文件到配置目录
move kafka.server.keystore.jks config\ssl\
move kafka.server.truststore.jks config\ssl\

4.3 格式化存储目录

在启动 Kafka 服务前,需要格式化存储目录,确保 meta.properties 正确生成:

bin\windows\kafka-storage.bat random-uuid
bin\windows\kafka-storage.bat format -t  -c config\server.properties
    

4.4 启动 Kafka 服务

运行以下命令启动 Kafka 服务:

start-kafka-kraft.bat
    

5. 客户端连接示例

5.1 Java 客户端配置

bootstrap.servers=localhost:9095
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin-secret";
ssl.truststore.location=你的truststore路径
ssl.truststore.password=kafka123
    

5.2 命令行工具配置

使用以下命令创建主题:

bin\windows\kafka-topics.bat --create --topic test-topic --bootstrap-server localhost:9095 --command-config config\client.properties
    

6. 常见问题

  • 问题: No `meta.properties` found in logs directory
    解决: 运行 kafka-storage.bat format 命令格式化存储目录。
  • 问题: ClassNotFoundException: kafka.security.authorizer.AclAuthorizer
    解决: 将 authorizer.class.name 修改为 org.apache.kafka.metadata.authorizer.StandardAuthorizer
  • 问题: Log4j 配置错误
    解决: 确保使用 Log4j2 配置文件,并在启动脚本中正确设置 KAFKA_LOG4J_OPTS

7. 参考链接

### 配置Kafka KRaft模式下使用SASL/SCRAM进行身份验证 在Kraft模式下配置Kafka以支持SASL/SCRAM认证涉及多个方面,包括设置服务器端和客户端的安全协议以及具体的认证参数。 #### 服务端配置 为了使Kafka Broker能够接受并处理来自客户端的SASL请求,在`server.properties`文件中需指定安全协议和支持的身份验证机制: - `listeners`: 定义监听器地址及其对应的安全协议。例如,对于仅采用SASL_PLAINTEXT的情况,应写成如下形式: ```properties listeners=SASL_PLAINTEXT://0.0.0.0:9092 ``` - `advertised.listeners`: 对外发布的监听者列表,通常与上述`listeners`保持一致。 - `listener.name.sasl_plaintext.plain.sasl.enabled.mechanisms`: 明确指出允许使用的具体SASL机制,如SCRAM-SHA-512: ```properties listener.name.sasl_plaintext.scram-sha-512.sasl.enabled.mechanisms=SCRAM-SHA-512 ``` 此外,还需确保启用了相应的JAAS配置来加载必要的登录模块,并指定了合法用户的凭证信息[^2]。 #### JAAS配置 创建一个名为`kafka_server_jaas.conf`的文件用于定义Broker侧的JAAS条目,内容类似于下面这样: ```plaintext KafkaServer { org.apache.kafka.common.security.scram.ScramLoginModule required; }; Client { org.apache.kafka.common.security.scram.ScramLoginModule required \ username="admin" password="password"; }; ``` 此文件路径应在启动命令或者环境变量里被正确引用,以便于JVM读取到这些设定。 #### 客户端连接选项 当应用程序作为生产者或消费者接入时,则要相应调整其自身的属性集,使之匹配上层架构所规定的访问控制策略。这主要包括但不限于以下几个关键项: - 设置`security.protocol`为`sasl_plaintext`; - 指定`ssl.endpoint.identification.algorithm`为空字符串(如果不需要SSL/TLS握手过程中的主机名校验的话); - 提供合适的`sasl.mechanism`值——即选用何种散列算法变体; - 填入有效的用户名密码组合至`jaas.config`字段内; 示例性的Java客户端代码片段可能看起来像这样: ```java Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); // SASL/SCRAM related settings props.put("security.protocol", "SASL_PLAINTEXT"); // or other protocols like SASL_SSL depending on your setup props.put("sasl.mechanism", "SCRAM-SHA-512"); props.put("sasl.jaas.config", "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"reader\" password=\"reader-password\";"); KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props); consumer.subscribe(Arrays.asList("test-topic")); while (true) { ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100)); } ``` 以上就是针对Kafka Kraft模式启用SASL/SCRAM鉴权所需执行的主要操作步骤概述[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值