Kafka安全认证机制详解之SASL_SCRAM

本文详细介绍了如何在Kafka中使用SASL/SCRAM进行动态用户权限配置,包括创建、管理证书,配置服务端和客户端Jaas文件,以及进行权限测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SASL/SCRAM验证可以动态新增用户并分配权限。
SASL/SCRAM 通过将认证用户信息保存在 ZooKeeper 的方式,避免了动态修改需要重启 Broker 的弊端。在实际使用过程中,可以使用 Kafka 提供的命令动态地创建和删除用户,无需重启整个集群。因此,如果打算使用 SASL/PLAIN,不妨改用 SASL/SCRAM 试试。不过要注意的是,后者是 0.10.2 版本引入的。
kafka官方文档:
https://kafka.apache.org/documentation/#security_sasl_scram

一、配置

配置SCRAM证书

下面命令创建了一个证书:tly 密码是:123456

kafka-configs.sh --zookeeper localhost:2181 --alter --add-config SCRAM-SHA-256=[iterations=8192,password=123456],SCRAM-SHA-512=[password=123456] --entity-type users --entity-name tly

创建admin证书,密码也是admin

kafka-configs.sh --zookeeper localhost:2181 --alter --add-config SCRAM-SHA-256=[password=admin],SCRAM-SHA-512=[password=admin] --entity-type users --entity-name admin

查看证书

查看指定证书加上–entity-name tly 不加则查看所有证书

kafka-configs.sh --zookeeper localhost:2181 --describe --entity-type users --entity-name tly

删除证书

kafka-configs.sh --zookeeper localhost:2181 --alter --delete-config SCRAM-SHA-512 --delete-config SCRAM-SHA-256 --entity-type users --entity-name tly

image.png

二、服务端配置

创建配置文件

在kafka的config文件夹下创建kafka-server-jaas.conf文件

KafkaServer {
        org.apache.kafka.common.security.scram.ScramLoginModule required
        username="admin"
        password="admin"
        user_admin="admin"
        password="admin";
};

分发脚本

scp kafka-server-jaas.conf root@kafka2-82373:/opt/kafka_2.13-2.6.0/config

scp kafka-server-jaas.conf root@kafka3-82373:/opt/kafka_2.13-2.6.0/config

测试权限功能

生成三个证书

admin是用来broker之间相互认证的
producer是用来做生产者的
consumer是用来做消费者的

kafka-configs.sh --zookeeper kafka1-33529:2181 --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=admin],SCRAM-SHA-512=[password=admin]' --entity-type users --entity-name admin
kafka-configs.sh --zookeeper kafka1-33529:2181 --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=123456],SCRAM-SHA-512=[password=123456]' --entity-type users --entity-name producer
kafka-configs.sh --zookeeper kafka1-33529:2181 --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=123456],SCRAM-SHA-512=[password=123456]' --entity-type users --entity-name consumer

查看证书清单:

kafka-configs.sh --zookeeper kafka1-33529:2181 --describe --entity-type users 

image.png

创建kafka_server_jaas.conf配置文件

这个配置文件是用来在broker之间相互认证用的,用户名密码对应的就是上一步创建admin证书时指定的用户名密码。

vim kafka_server_jaas.conf

# 添加如下内容
KafkaServer {
  org.apache.kafka.common.security.scram.ScramLoginModule required
  username="admin"
  password="admin";
};

分发此配置文件到另外两个节点上,由于我是直接在/root路径下创建的,因此也同步到对应的路径下;如果实在config路径下创建的,则同步的时候也同步到对应的路径下

scp kafka_server_jaas.conf root@kafka2-33529:/root/kafka_server_jaas.conf
scp kafka_server_jaas.conf root@kafka3-33529:/root/kafka_server_jaas.conf

修改kafak启动脚本

编辑kafka-server-start.sh 脚本,将我们的jaas文件添加到对应的环境中;

# 编辑启动脚本
vim /opt/kafka_2.13-2.6.0/bin/kafka-server-start.sh

# 注释掉这一行(最后一行)
#exec $base_dir/kafka-run-class.sh $EXTRA_ARGS kafka.Kafka "$@"

# 添加下面的代码
exec $base_dir/kafka-run-class.sh $EXTRA_ARGS -Djava.security.auth.login.config=/root/kafka_server_jaas.conf kafka.Kafka "$@"

分发编辑好的脚本到其它节点:

scp /opt/kafka_2.13-2.6.0/bin/kafka-server-start.sh root@kafka2-33529:/opt/kafka_2.13-2.6.0/bin/kafka-server-start.sh

scp /opt/kafka_2.13-2.6.0/bin/kafka-server-start.sh root@kafka3-33529:/opt/kafka_2.13-2.6.0/bin/kafka-server-start.sh

修改server.properties文件

修改server.conf配置文件,启用认证并指定认证方式,指定超级管理员,启用acl控制权限等设置

# 编辑配置文件
vim /opt/kafka_2.13-2.6.0/config/server.properties

# 添加下面的额内容,注意:每台节点标记的时候对应的kafkaIP需要变更
listeners=SASL_PLAINTEXT://kafka3-33529:9092
advertised.listeners=SASL_PLAINTEXT://kafka3-33529:9092
sasl.enabled.mechanisms=SCRAM-SHA-256
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
security.inter.broker.protocol=SASL_PLAINTEXT
allow.everyone.if.no.acl.found=false
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
super.users=User:admin

重启服务

每个节点都要重启

# 重启zk
zkServer.sh restart

# 重启kafka
kafka-server-stop.sh
kafka-server-start.sh -daemon /opt/kafka_2.13-2.6.0/config/server.properties

重启后多次执行jps命令,确保kafka服务没有挂掉
image.png

修改生产者和消费者配置文件

修改生产者和消费者配置文件,增加权限认证

# 修改生产者配置文件
vim /opt/kafka_2.13-2.6.0/config/producer.properties

# 添加以下内容
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256

# 分发配置文件到其它节点
scp /opt/kafka_2.13-2.6.0/config/producer.properties root@kafka2-33529:/opt/kafka_2.13-2.6.0/config/producer.properties
scp /opt/kafka_2.13-2.6.0/config/producer.properties root@kafka3-33529:/opt/kafka_2.13-2.6.0/config/producer.properties

# 修改消费者配置文件
vim /opt/kafka_2.13-2.6.0/config/consumer.properties

# 添加以下内容
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256

# 分发配置文件到其它节点
scp /opt/kafka_2.13-2.6.0/config/consumer.properties root@kafka2-33529:/opt/kafka_2.13-2.6.0/config/consumer.properties
scp /opt/kafka_2.13-2.6.0/config/consumer.properties root@kafka3-33529:/opt/kafka_2.13-2.6.0/config/consumer.properties

配置生产者和消费者jaas文件

# 新建生产者jaas文件
vim kafka_producer_jaas.conf

# 增加以下内容,用户名密码为第一步在创建证书时创建的用户名密码
KafkaClient {
  org.apache.kafka.common.security.scram.ScramLoginModule required
    username="producer"
    password="123456";
};

# 分发到其它节点
scp kafka_producer_jaas.conf root@kafka2-33529:/root/kafka_producer_jaas.conf
scp kafka_producer_jaas.conf root@kafka3-33529:/root/kafka_producer_jaas.conf


# 新建生产者jaas文件
vim kafka_consumer_jaas.conf

# 增加以下内容,用户名密码为第一步在创建证书时创建的用户名密码
KafkaClient {
  org.apache.kafka.common.security.scram.ScramLoginModule required
    username="consumer"
    password="123456";
};

# 分发到其它节点
scp kafka_consumer_jaas.conf root@kafka2-33529:/root/kafka_consumer_jaas.conf
scp kafka_consumer_jaas.conf root@kafka3-33529:/root/kafka_consumer_jaas.conf

配置生产者jaas文件到启动脚本中

# 编辑配置文件
vim /opt/kafka_2.13-2.6.0/bin/kafka-console-producer.sh

# 注释掉下面内容
# exec $(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleProducer "$@"

# 新增下面内容
exec $(dirname $0)/kafka-run-class.sh -Djava.security.auth.login.config=/root/kafka_producer_jaas.conf kafka.tools.ConsoleProducer "$@"

配置消费者jaas文件到启动脚本中

# 编辑配置文件
vim /opt/kafka_2.13-2.6.0/bin/kafka-console-consumer.sh

# 注释掉下面内容
#exec $(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleProducer "$@"

# 新增下面内容
exec $(dirname $0)/kafka-run-class.sh -Djava.security.auth.login.config=/root/kafka_consumer_jaas.conf kafka.tools.ConsoleConsumer "$@"

创建topic测试

创建名为test1的topic用来测试

kafka-topics.sh -create --zookeeper kafka1-33529:2181 -replication-factor 3 --partitions 3  --topic test1

生产消息

kafka-console-producer.sh --bootstrap-server kafka1-33529:9092 --topic test1 --producer.config /opt/kafka_2.13-2.6.0/config/producer.properties

提示没有权限对topic1进行操作:
image.png
对生产者证书进行acl授权:

kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer \
--authorizer-properties zookeeper.connect=kafka1-33529:2181 \
--add --allow-principal User:producer --operation Write --topic test1 

再次生产消息,可以正常生产消息了:
image.png
消费消息

kafka-console-consumer.sh --bootstrap-server kafka1-33529:9092 --topic test1 --from-beginning --consumer.config /opt/kafka_2.13-2.6.0/config/consumer.properties

提示没权限消费消息:
image.png
对消费者证书进行acl授权,一定要增加–group,否则当前消费者组没有权限,会报Not authorized to access group: test-consumer-group错误

kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=kafka1-33529:2181 \
--add --allow-principal User:consumer --operation Read --topic test1  --group test-consumer-group

再次消费消息即可获取到消息:
image.png

<think>好的,我现在需要帮助用户理解Kafka中的SASL_PLAINTEXT模式的含义、原理和使用场景。根据用户提供的引用内容,我需要整合这些信息,并结合之前的回答,给出一个清晰的解释。 首先,用户的问题是关于SASL_PLAINTEXT在Kafka中的含义、原理和使用场景。用户之前遇到了Kafka Producer构建失败的问题,现在想深入理解其中涉及的安全认证机制。 根据引用中的内容,多个引用提到了SASL_PLAINTEXT的配置,比如引用1和4提到了使用PlainLoginModule配置用户名和密码,引用2和3涉及ZooKeeper和KafkaSASL配置。这说明SASL_PLAINTEXT主要用于身份验证,并且通常与PLAIN机制结合使用,可能是在非加密的通道上进行认证。 接下来需要确定SASL_PLAINTEXT的原理。SASL是负责认证的框架,而PLAINTEXT指的是传输层不使用SSL加密。因此,SASL_PLAINTEXT应该是在不加密的连接上使用SASL进行认证,比如使用明文传输用户名和密码。但根据引用中的配置,比如使用PlainLoginModule,可能PLAIN机制在这里是Base64编码的,但仍然是明文传输,所以安全性较低,适合内部网络环境。 使用场景方面,用户提供的引用中有Docker Compose配置、ZooKeeper集成等,可能适用于测试环境或内部受信任的网络,不需要高强度的加密,但需要基本的认证。比如引用3提到在docker-compose中配置SASL_PLAINTEXT,可能用于开发或测试环境的快速搭建。 需要区分SASL_PLAINTEXT和SASL_SSL的区别,前者没有加密,后者使用SSL/TLS加密通道。同时,需要提到PLAIN机制的具体实现,比如如何配置JAAS文件,以及相关的安全风险。 另外,用户之前的回答中提到了SASL/SSL的配置,这里需要对比说明SASL_PLAINTEXT的不同之处,强调其适用场景和安全性考虑。可能还需要提到其他SASL机制,如SCRAM,但用户的问题主要集中在PLAIN和SASL_PLAINTEXT的组合上。 需要确保回答结构清晰,分点说明含义、工作原理、使用场景和配置示例,并给出安全建议。同时,根据用户提供的引用,引用中的配置示例可以作为配置步骤的一部分,比如JAAS文件的创建和Kafka broker的配置参数。 最后,生成的相关问题需要围绕用户可能进一步想知道的内容,比如配置步骤、与其他模式的对比、安全性提升方法等。</think>#### Kafka SASL_PLAINTEXT 模式详解 --- ### **一、基本含义** **SASL_PLAINTEXT** 是 Kafka 中基于 SASL(Simple Authentication and Security Layer)框架的认证协议,**通过明文传输身份凭证**(如用户名/密码)实现客户端与服务端的安全认证。其核心特点包括: 1. **SASL**:负责身份验证的通用框架,支持多种认证机制(如 `PLAIN`、`SCRAM`)。 2. **PLAINTEXT**:表示传输层**未启用 SSL/TLS 加密**,数据以明文形式传输[^1][^4]。 --- ### **二、工作原理** #### 1. **认证流程** - **客户端**:发送包含用户名和密码的认证请求(如 `PLAIN` 机制下直接明文传输凭证)。 - **服务端**:验证凭证的有效性(如检查 JAAS 配置文件中的用户列表)。 - **认证通过**:建立通信连接;**失败**则拒绝连接[^1][^4]。 #### 2. **PLAIN 机制实现** - **JAAS 配置文件**:定义合法用户及其密码,例如: ```properties KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin-secret" user_admin="admin-secret"; // 允许访问的用户列表 }; ``` - **客户端配置**:需与服务端 JAAS 文件中的用户名密码一致[^2][^3]。 #### 3. **协议交互** ```mermaid sequenceDiagram Client->>Kafka Broker: 发送SASL_PLAINTEXT连接请求 Kafka Broker->>Client: 要求提供身份凭证 Client->>Kafka Broker: 明文传输用户名/密码 Kafka Broker-->>JAAS配置: 校验凭证 alt 验证成功 Kafka Broker->>Client: 允许通信 else 验证失败 Kafka Broker->>Client: 断开连接 end ``` --- ### **三、使用场景** 1. **内部可信网络** 适用于**无需加密**但需基础认证的环境(如企业内网、开发测试环境)。 *示例*:开发团队通过 Docker Compose 快速搭建含认证的 Kafka 集群[^3]。 2. **与其他组件的集成** 需与 ZooKeeper 或其他服务共享认证配置时(如 `user_admin` 需在 Kafka 和 ZooKeeper 的 JAAS 文件中保持一致)[^2]。 3. **轻量级安全需求** 对性能敏感且安全性要求较低的场景(明文传输省去加密开销)。 --- ### **四、配置示例(Kafka Broker)** ```shell # 修改 server.properties security.inter.broker.protocol=SASL_PLAINTEXT sasl.mechanism.inter.broker.protocol=PLAIN sasl.enabled.mechanisms=PLAIN listeners=SASL_PLAINTEXT://:9092 ``` --- ### **五、与 SASL_SSL 对比** | 特性 | SASL_PLAINTEXT | SASL_SSL | |---------------------|----------------------|----------------------| | **传输加密** | ❌ 明文传输 | ✅ TLS/SSL 加密 | | **性能开销** | 低 | 较高(加解密计算) | | **适用场景** | 内部可信网络 | 公网或敏感数据环境 | --- ### **六、安全建议** 1. **仅限内部网络使用**:避免在公网暴露 SASL_PLAINTEXT 端口。 2. **定期更换密码**:防止凭证泄露导致未授权访问。 3. **结合 ACL 使用**:通过 Kafka ACL 细化权限控制(如 `kafka-acls.sh`)。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

4935同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值