Kafka与ZooKeeper用SASL_PLAINTEXT、与生产者用SCRAM认证可行吗
方案可行性结论
你的配置方案完全可落地,不存在实现障碍。
Kafka将SCRAM认证的加密凭证存储在ZooKeeper是SCRAM机制的标准设计,和你要配置的ZooKeeper-Kafka之间的SASL_PLAINTEXT认证是两条完全独立的认证链路,不存在冲突:
- ZooKeeper与Kafka Broker之间的SASL_PLAINTEXT认证:是Broker作为客户端连接ZooKeeper时的身份校验,凭证独立配置在ZooKeeper和Broker的JAAS文件中
- Kafka Broker与生产者客户端之间的SCRAM认证:是客户端连接Broker时的身份校验,SCRAM的用户凭证会被加盐迭代哈希后持久化到ZooKeeper存储,仅用于客户端和Broker之间的校验逻辑,和ZK-Broker之间的认证没有关联
具体配置步骤
1. 配置ZooKeeper侧SASL认证(供Broker连接使用)
- 新建ZooKeeper的JAAS配置文件
zookeeper_jaas.conf,配置允许Broker连接的账号:
Server { org.apache.zookeeper.server.auth.DigestLoginModule required user_kafka_broker="broker_connect_zk_pwd"; };
- 修改ZooKeeper启动参数,添加JVM参数指定JAAS文件路径:
-Djava.security.auth.login.config=/path/to/zookeeper_jaas.conf - 在ZooKeeper配置文件
zoo.cfg中添加以下配置开启SASL校验:
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider requireClientAuthScheme=sasl
- 启动ZooKeeper节点。
2. 配置Kafka Broker双链路SASL
- 新建Broker的JAAS配置文件
kafka_server_jaas.conf,同时配置ZK连接凭证和SCRAM认证模块:
// Broker连接ZooKeeper使用的凭证,和ZK侧配置的账号密码完全对应 Client { org.apache.zookeeper.server.auth.DigestLoginModule required username="kafka_broker" password="broker_connect_zk_pwd"; }; // Broker侧SCRAM认证模块入口 KafkaServer { org.apache.kafka.common.security.scram.ScramLoginModule required; };
- 修改Broker配置文件
server.properties,核心配置如下:
# 监听配置,本地测试用SASL_PLAINTEXT即可 listeners=SASL_PLAINTEXT://0.0.0.0:9092 advertised.listeners=SASL_PLAINTEXT://localhost:9092 security.inter.broker.protocol=SASL_PLAINTEXT sasl.mechanism.inter.broker.protocol=PLAIN # ZK相关ACL配置 zookeeper.connect=localhost:2181 zookeeper.set.acl=true # 客户端SCRAM认证配置 listener.name.sasl_plaintext.sasl.enabled.mechanisms=SCRAM-SHA-256,SCRAM-SHA-512 listener.name.sasl_plaintext.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required; listener.name.sasl_plaintext.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;
- 修改Kafka启动参数,添加JVM参数指定Broker的JAAS文件路径:
-Djava.security.auth.login.config=/path/to/kafka_server_jaas.conf - 启动Kafka Broker节点。
3. 创建生产者使用的SCRAM用户
Broker启动完成后,执行Kafka自带的命令创建生产者账号,创建完成后账号的加盐哈希凭证会自动加密存储到ZooKeeper:
kafka-configs.sh --zookeeper localhost:2181 --alter \ --add-config 'SCRAM-SHA-256=[password=producer_user_pwd],SCRAM-SHA-512=[password=producer_user_pwd]' \ --entity-type users --entity-name producer_user
这里的producer_user和producer_user_pwd就是你生产者代码中需要填入的用户名、密码。
4. 修正生产者客户端代码
你原有代码的JAAS配置字符串缺少必要的引号和结尾分号,会直接导致认证失败,同时需要补充两个必填的SASL参数,修正后代码如下:
String username = "producer_user"; String pass = "producer_user_pwd"; String saslJaasConfigValue = String.format( "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"%s\" password=\"%s\";", username, pass); props.put(SaslConfigs.SASL_JAAS_CONFIG, saslJaasConfigValue); // 补充必填安全配置 props.put(SaslConfigs.SASL_MECHANISM, "SCRAM-SHA-256"); props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SASL_PLAINTEXT");
注意:SASL_PLAINTEXT模式下传输层无加密,凭证和业务数据会明文在网络传输,仅适合本地Docker测试场景使用,生产环境请替换为SASL_SSL协议。
内容的提问来源于stack exchange,提问作者sphoenix
相关产品推荐
相关产品推荐

