Kafka安全认证机制详解之SASL_SCRAM

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

shell 复制代码
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

shell 复制代码
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 不加则查看所有证书

shell 复制代码
kafka-configs.sh --zookeeper localhost:2181 --describe --entity-type users --entity-name tly

删除证书

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

二、服务端配置

创建配置文件

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

nginx 复制代码
KafkaServer {
        org.apache.kafka.common.security.scram.ScramLoginModule required
        username="admin"
        password="admin"
        user_admin="admin"
        password="admin";
};

分发脚本

shell 复制代码
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是用来做消费者的

shell 复制代码
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

查看证书清单:

shell 复制代码
kafka-configs.sh --zookeeper kafka1-33529:2181 --describe --entity-type users 

创建kafka_server_jaas.conf配置文件

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

shell 复制代码
vim kafka_server_jaas.conf

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

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

shell 复制代码
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文件添加到对应的环境中;

shell 复制代码
# 编辑启动脚本
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 "$@"

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

shell 复制代码
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控制权限等设置

shell 复制代码
# 编辑配置文件
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

重启服务

每个节点都要重启

shell 复制代码
# 重启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服务没有挂掉

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

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

shell 复制代码
# 修改生产者配置文件
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文件

shell 复制代码
# 新建生产者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文件到启动脚本中

shell 复制代码
# 编辑配置文件
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文件到启动脚本中

shell 复制代码
# 编辑配置文件
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用来测试

shell 复制代码
kafka-topics.sh -create --zookeeper kafka1-33529:2181 -replication-factor 3 --partitions 3  --topic test1

生产消息

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

提示没有权限对topic1进行操作:

对生产者证书进行acl授权:

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

再次生产消息,可以正常生产消息了:

消费消息

shell 复制代码
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

提示没权限消费消息:

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

shell 复制代码
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

再次消费消息即可获取到消息:

相关推荐
初次攀爬者32 分钟前
Kafka的Rebalance基础介绍
后端·kafka
字节跳动数据平台3 小时前
5000 字技术向拆解 | 火山引擎多模态数据湖如何释放模思智能的算法生产力
大数据
武子康9 小时前
大数据-239 离线数仓 - 广告业务实战:Flume 导入日志到 HDFS,并完成 Hive ODS/DWD 分层加载
大数据·后端·apache hive
用户962377954481 天前
DVWA 靶场实验报告 (High Level)
安全
初次攀爬者1 天前
Kafka + KRaft模式架构基础介绍
后端·kafka
初次攀爬者1 天前
Kafka + ZooKeeper架构基础介绍
后端·zookeeper·kafka
初次攀爬者1 天前
Kafka 基础介绍
spring boot·kafka·消息队列
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954481 天前
DVWA 靶场实验报告 (Medium Level)
安全