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

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

相关推荐
Micro麦可乐16 分钟前
最新Spring Security实战教程(十八)安全日志与审计:关键操作追踪与风险预警
java·spring boot·后端·安全·spring·安全审计
galaxylove22 分钟前
Gartner发布新的网络安全运营模型:决定安全运营的9个组件
网络·安全·web安全
Edingbrugh.南空22 分钟前
Kafka Connect生产实践:性能优化与高可用架构构建
性能优化·架构·kafka
HhhDreamof_23 分钟前
安全生产台账系统
安全
C++ 老炮儿的技术栈1 小时前
VSCode -配置为中文界面
大数据·c语言·c++·ide·vscode·算法·编辑器
90wunch1 小时前
更进一步深入的研究ObRegisterCallBack
c++·windows·安全
白鲸开源1 小时前
SQL Server CDC 机制全解:如何用 SeaTunnel 构建高效实时数据同步方案
大数据
小巫程序Demo日记1 小时前
Spark简介脑图
大数据·笔记·spark
武子康1 小时前
大数据-14-Hive HQL 表连接查询 HDFS导入导出 逻辑运算 函数查询 全表查询
大数据·后端·apache hive
春马与夏2 小时前
Spark on yarn的作业提交流程
大数据·分布式·spark