一、说明

在大数据处理和分析中 Apache Kafka 已经成为了一个核心组件。然而在生产环境中部署 Kafka 时,安全性是一个必须要考虑的重要因素。SASL(简单认证与安全层)和 SCRAM(基于密码的认证机制的盐化挑战响应认证机制)提供了一种方法来增强 Kafka 集群的安全性。

本文将从零开始部署 ZooKeeperKafka 并通过配置 SASL/SCRAMACL(访问控制列表)来增强 Kafka 的安全性。

二、Kafka 的安全机制

kafka 社区在 0.9.0.0 版本正式添加了安全特性,可以满足各种安全性的要求,包括:

  1. Kafka 与 ZooKeeper 之间的安全通信;
  2. Kafka 集群 ZooKeeper 之间的安全通信;
  3. 客户端与服务端之间的安全通信;
  4. 消息级别的权限控制,可以控制客户端(生产者或消费者)的读写操作权限。
认证方式 引入版本 适用场景
SSL 0.9.0 SSL做信道加密比较多,SSL认证不如SASL所以一般都会使用SSL来做通信加密。
SASL/GSSAPI 0.9.9 主要是给 Kerberos 使用的。如果你的公司已经做了 Kerberos 认证(比如使用 Active Directory),那么使用 GSSAPI 是最方便的了。因为你不需要额外地搭建 Kerberos,只要让你们的 Kerberos 管理员给每个 Broker 和要访问 Kafka 集群的操作系统用户申请 principal 就好了。
SASL/PLAIN 0.10.2 简单的用户名密码认证,通常与SSL结合使用,对于小公司来说,没必要搭建公司级别的Kerberos,使用它就比较合适。
SASL/SCRAM 0.10.2 PLAIN的加强版本,支持动态的用户增减。
Deleation Token 1.1 Delegation Token 是在 1.1 版本引入的,它是一种轻量级的认证机制,主要目的是补充现有的 SASL 或 SSL 认证。如果要使用 Delegation Token,你需要先配置好 SASL 认证,然后再利用 Kafka 提供的 API 去获取对应的 Delegation Token。这样 Broker 和客户端在做认证的时候,可以直接使用这个 token,不用每次都去 KDC 获取对应的 ticket(Kerberos 认证)或传输 Keystore 文件(SSL 认证)。
SASL/OAUTHBEARER 2.0 OAuth 2框架的集成。

三、环境和软件准备

Apache Kafka 官网 下载对应版本的 Kafka 并解压到你选择的目录。

确保已经安装 Java 才能运行 Kafka,可以通过运行 java -version 来检查 Java 环境。

四、部署 Zookeeper

使用 Kafka 内置的 Zookeeper

4.1. 启用 SASL 认证

进入 config 目录,修改 zookeeper.properties 配置文件增加以下内容:

authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=3600000
requireClientAuthScheme=sasl
zookeeper.sasl.client=true

4.2. 配置 JAAS

在 config 目录下创建 zk_jaas.conf 文件,内容如下:

Server {
org.apache.zookeeper.server.auth.DigestLoginModule required
username="admin"
password="admin"
user_admin="admin"
user_zkclient="zkclient";
};

其作用是创建了一个 Server 节点,其中

  • org.apache.zookeeper.server.auth.DigestLoginModule required 是认证逻辑的处理类;
  • username、password 是zookeeper之间通讯的用户名和密码;
  • user_admin="admin" 的结构是 user_[username]=[password] 定义 kafka-broker(zookeeper客户端)连接到 zookeeper 时用的用户名和密码。

注意:Server 内部最后一行的 ; 和 } 后的 ; 不能缺少!

4.3. 修改启动文件

进入 bin 目录,修改 zookeeper-server-start.sh 文件;

export KAFKA_HEAP_OPTS= 配置项的参数后添加 JAAS 的配置:

export KAFKA_HEAP_OPTS="-Xmx512M -Xms512M -Djava.security.auth.login.config=../config/zk_jaas.conf"

4.4. 启动 Zookeeper

执行命令:./zookeeper-server-start.sh -daemon ../config/zookeeper.properties

-daemon 参数配置后台运行

4.5. 测试

可以从官网 Apache ZooKeeper 下载对应版本的 ZooKeeper 并解压;

添加 JAAS 配置,在 confi 目录下创建 zk_client_jaas.conf 文件:

Client{
org.apache.zookeeper.server.auth.DigestLoginModule required
username="zkclient"
password="zkclient";
};

修改 bin 目录下的 zkCli.sh 文件,在启动命令中增加 JAAS 的配置:

"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "-Dzookeeper.log.file=${ZOO_LOG_FILE}" \
-cp "$CLASSPATH" $CLIENT_JVMFLAGS $JVMFLAGS \
"-Djava.security.auth.login.config=../conf/zk_client_jaas.conf" \
org.apache.zookeeper.ZooKeeperMain "$@"

执行 zkCli.sh 连接本机已经启动好的 ZooKeeper

进入 Kafka 的 log 目录,查看内置 zk 的日志 zookeeper.out 显示以下内容:

INFO adding SASL authorization for authorizationID: zkclient (org.apache.zookeeper.server.ZooKeeperServer)

代表 ZooKeeper 的 SASL 认证已经配置成功。

五、部署 Kafka

5.1. 配置 Kafka Broker

进入 config 目录,修改 server.properties 配置文件增加以下内容:

listeners=SASL_PLAINTEXT://:9092
advertised.listeners=SASL_PLAINTEXT://localhost:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
sasl.enabled.mechanisms=SCRAM-SHA-256
authorizer.class.name=kafka.security.authorizer.AclAuthorizer
allow.everyone.if.no.acl.found=false
super.users=User:admin
  • authorizer.class.name 开启 ACL 授权机制并指定实现类;
  • allow.everyone.if.no.acl.found 如果没有找到ACL(访问控制列表)配置,是否允许任何操作;这里设置为 false 指除了超级管理员,其他用户必须配置 ACL 才能访问资源;
  • super.users 超级管理员,无需配置 ACL 拥有所有权限的用户。

5.2. 配置 JAAS

在 config 目录下创建 kafka_server_jaas.conf 文件,内容如下:

KafkaServer {
org.apache.kafka.common.security.scram.ScramLoginModule required
username="admin"
password="admin";
}; Client{
org.apache.kafka.common.security.plain.PlainLoginModule required
username="zkclient"
password="zkclient";
};
  • KafkaServer 中的 username,password 用于 Kafka 集群 Broker 节点之间通信用的账号密码;
  • KafkaServer 中的 user_test="test" 用于 Kafka 客户端(producer,consumer)连接broker时,用该配置下user_[username]=[password]结构配置的账号密码登录;
  • Client 用于 broker 和 zookeeper 之间的认证,对应 zk_jaas.conf 中的 【user_zkclient="zkclient"】 配置;
  • user_admin="admin" 的结构是 user_[username]=[password] 定义 kafka-broker(zookeeper客户端)连接到 zookeeper 时用的用户名和密码。

5.3. 修改启动文件

进入 bin 目录,修改 kafka-server-start.sh 文件;

export KAFKA_HEAP_OPTS= 配置项的参数后添加 JAAS 的配置:

export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G -Djava.security.auth.login.config=../config/kafka_server_jaas.conf"

5.4. 创建 SCRAM 用户

在启动 Kafka 之前需要先创建好用户,在 bin 目录下执行以下内容:

分别创建 admin(超级管理员) 和 test(客户端用户)

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

./kafka-configs.sh --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[password=test]' --entity-type users --entity-name test

SASL/SCRAM 认证的用户信息是动态创建存储在 ZooKeeper 中, 由于上面的配置 kafka_server_jaas.conf 中 Broker 之间的通信是通过 admin 用户的,如果该用户不存在会 启动报错

5.5. 启动 Kafka

执行命令:./kafka-server-start.sh -daemon ../config/server.properties

-daemon 参数配置后台运行

六、验证 SASL/SCRAM 鉴权

6.1. 客户端认证配置

6.1.1. 管理员配置

进入 config 目录创建 cmd.properties 内容如下:

security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="admin";

配置认证的类型以及登录逻辑的处理类和用户,使用超级管理员 admin

注意 最后的 ; 是必须加上的。

6.1.2. 生产者配置

修改 config 目录下的 producer.properties 增加以下内容:

security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="admin";

生产者也使用超级管理员 admin 来发送消息。

6.1.3. 消费者配置

修改 config 目录下的 consumer.properties 增加以下内容:

security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="test" password="test";

消费者使用 test 用户来接收消息。

6.2. 创建topic

在 bin 目录下执行以下命令:

./kafka-topics.sh --bootstrap-server localhost:9092 --create --topic test --partitions 1 --replication-factor 1 --command-config ../config/cmd.properties
  • bootstrap-server 配置 Kafka 服务端的地址
  • topic 指定topic名称
  • command-config 指定命令的认证配置,这里使用上面创建的 管理员配置

创建成功后可以通过以下命令查看存在的 topic 清单:

./kafka-topics.sh --bootstrap-server localhost:9092 --list --command-config ../config/cmd.properties

6.3. 创建消费者

6.3.1. 执行 kafka-console-consumer

在 bin 目录下执行以下命令:

./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --consumer.config ../config/consumer.properties

执行命令后会发现以下 报错 信息:

ERROR Error processing message, terminating consumer process:  (kafka.tools.ConsoleConsumer$)
org.apache.kafka.common.errors.SaslAuthenticationException: Authentication failed during authentication due to invalid credentials with SASL mechanism SCRAM-SHA-256
Processed a total of 0 messages

Authentication failed 认证失败,由于消费者的认证使用的是 test 用户,而该用户还未配置任何 ACL 权限。

6.3.2. 配置用户 ACL 权限

Kafka 的 ACL (Access Control Lists) 允许你定义哪些用户可以访问哪些主题,并且可以执行哪些操作(如读、写、创建、删除等)。

执行以下命令:

./kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:test --operation Read --topic test --group test-consumer-group

为 test 用户在资源 topic[test] 下分配只读权限

执行成功,可以通过以下命令查看资源所分配的所有 ACL 清单:

./kafka-acls.sh --bootstrap-server localhost:9092 --topic test --list --command-config ../config/cmd.properties

重新创建消费者:

./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --consumer.config ../config/consumer.properties

执行成功后该 shell 窗口会一直阻塞等待消息。

6.4. 创建生产者

新开一个 shell 窗口 在 bin 目录下执行以下命令:

./kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test --producer.config ../config/producer.properties

由于生产者的认证使用的是 admin 为 超级管理员 所以无需配置 ACL 权限。

执行成功后会出现 > 符号,输入内容之后,切换到 消费者 窗口就可以看到了。

基于 SASL/SCRAM 让 Kafka 实现动态授权认证的更多相关文章

  1. Kafka SASL/SCRAM+ACL实现动态创建用户及权限控制

    kafka系列文章 第一章 linux单机安装kafka 第二章 kafka--集群安裝部署(自带zookeeper) 第三章 Kafka SASL/SCRAM+ACL实现动态创建用户及权限控制 Ka ...

  2. MVC AuthorizeAttribute 动态授权

    开发中经常会遇到权限功能的设计,而在MVC 下我们便可以使用重写 AuthorizeAttribute 类来实现自定义的权限认证 首先我们的了解 AuthorizeAttribute 下面3个主要的方 ...

  3. 基于FPGA的OLED真彩色动态图像显示的实现

    源:基于FPGA的OLED真彩色动态图像显示的实现 作为第3代显示器,有机电致发光器件(Organic Light Emitting Diode,OLED)由于其主动发光.响应快.高亮度.全视角.直流 ...

  4. Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录

    1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...

  5. Python 基于pykafka简单实现KAFKA消费者

    基于pykafka简单实现KAFKA消费者   By: 授客 QQ:1033553122         1.测试环境 python 3.4 zookeeper-3.4.13.tar.gz 下载地址1 ...

  6. 【Docker】数据库动态授权组件在Kubernetes集群下的测试过程记录

    背景 我们都知道出于安全性考虑,生产环境的权限一般都是要做最小化控制,尤其是数据库的操作授权,更是重中之重. 博主所在公司使用的是Kubernetes(k8s)进行的集群容器管理,因为容器发布时的IP ...

  7. 业务逻辑:五、完成认证用户的动态授权功能 六、完成Shiro整合Ehcache缓存权限数据

    一. 完成认证用户的动态授权功能 提示:根据当前认证用户查询数据库,获取其对应的权限,为其授权 操作步骤: 在realm的授权方法中通过使用principals对象获取到当前登录用户 创建一个授权信息 ...

  8. 【VS开发】【图像处理】基于灰度世界、完美反射、动态阈值等图像自动白平衡算法的原理、实现及效果

    基于灰度世界.完美反射.动态阈值等图像自动白平衡算法的原理.实现及效果      白平衡是电视摄像领域一个非常重要的概念,通过它可以解决色彩还原和色调处理的一系列问题.白平衡是随着电子影像再现色彩真实 ...

  9. 你还不了解基于session的授权认证吗?

    前言 在漫长的开发过程中,权限认证是一个永恒不变的话题,随着技术的发展,从以前的基于sessionId的方式,变为如今的token方式.session常用于单体应用,后来由于微服务的兴起,分布式应用占 ...

  10. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(四)

    在上一讲中,我们已经完成了一个完整的案例,在这个案例中,我们可以通过Angular单页面应用(SPA)进行登录,然后通过后端的Ocelot API网关整合IdentityServer4完成身份认证.在 ...

随机推荐

  1. Flask-Limit详细说明:接口限流

    速率限制通常作为服务的防御措施予以实施.服务需要保护自身以免过度使用(无论是有意还是无意),从而保持服务可用性.在Flask项目开发过程中,遇到了需要对接口进行限制的需求,又不想去造轮子,这时候就需要 ...

  2. 8.4考试总结(NOIP模拟30)[毛一琛·毛二琛·毛三琛]

    最有名的莫过于想死一次吗. 前言 至今都不知道题目是个啥... T1 毛一琛 解题思路 \(\mathcal{Meet\;In\;The\;Middle}\) 其实就是一个爆搜... 把整个区间分为两 ...

  3. Github Markdown 指定图片在光亮或暗黑模式展示

    Github 根据系统配置不同的主题模式: 如果想要在光亮模式和暗黑模式显示不同的主题的图片,比如以下就是同一个图片在暗黑模式和光亮模式下展示: 解决方案 在markdon 的图片链接后添加#gh-d ...

  4. 微信支付(付款码支付,条码支付,刷卡支付)左上角LOGO显示

    微信支付(付款码支付,条码支付,刷卡支付)左上角LOGO显示 如果你上送的sub_appid 公众号(小程序),优先显示你公众号(小程序)的LOGO,如果你的公众号(小程序)未设置LOGO,会显示上游 ...

  5. 项目管理--PMBOK 读书笔记(3)【项目经理的角色 】

    思维导图软件工具:https://www.xmind.cn/ 源文件地址:https://files-cdn.cnblogs.com/files/zj19940610/项目经理的角色.zip

  6. Django Paginatior分页,页码过多,动态返回页码,页码正常显示

    问题: 当返回数据较多,如设置每页展示10条,数据接近200条,返回页码范围1~20,前端每个页码都显示的话,就会出现页码超出当前页面,被遮挡的页码无法操作和显示不美观: 代码优化: 在使用pagin ...

  7. 呼吁 《上海市卫生健康“信息技术应用创新白皮书》改正 C# 被认定为A 组件是错误认知

    近日,<上海市卫生健康"信息技术应用创新"白皮书>(以下简称<白皮书>)正式发布,介绍了"医疗信创核心应用适配方法.公立医院信息系统及全民健康信息 ...

  8. 开源一个RAG大模型本地知识库问答机器人

    弹指间,2009年大学毕业到现在2024年,已经15年过去了. 前2天,看到自己14年在博客园写的一个博客,哪个时候是工作之余创业 感兴趣的朋友可以看看我10年前发的一篇博客https://www.c ...

  9. Linux 驱动:LED子系统

    Linux 驱动:LED子系统 背景 在调试aw9523的时候,为了实现客户要的一个效果.需要修改驱动,但是大概看了一下驱动,但是因为不太熟悉LED子系统,所以有点云里雾里. 参考: https:// ...

  10. Xilinux PS与PL交互:裸机程序读写FPGA-REG

    背景 当时在搞ZYNQ驱动的时候,出于TDD的思想,从最简单的功能开始验证.因此就涉及到了下面的需求. PL侧会提供寄存器地址供PS端读写,这部分的寄存器在PL侧作为Avalon的IP,对PS端来说, ...