Kafka 认证一:PlainLoginModule 认证及 Java 连接测试-程序员宅基地

技术标签: java  安全认证  项目开发问题  kafka  

背景

项目需求是:通过 Web 页面配置 Kafka 信息并存储,且支持安全认证模式。

本文介绍 Kafka 帐号密码认证的完整实践流程,自己实践一遍,才能穿起各个概念。Kafka 的 Plain 简单文本认证方式比较简单,只需要 Kafka 服务端维护用户列表,客户端同样的安全认证配置即可。

本文的实践过程中,Kafka 版本为 kafka_2.11-2.3.1 ,只对 Kafka 服务做安全认证;Zookeeper 使用自带的,不做安全认证。

关键配置列表:

  1. Kafka 服务配置文件 server.propertis,配置认证协议及认证实现类;
  2. Kafka 的 jaas.config 认证配置文件,登录类,超管密码和管理的帐号密码列表;
  3. Kafka 服务启动脚本 kafka-start-server.sh,设置安全认证环境变量;
  4. Kafka 客户端连接配置认证属性。

0、知识预备,了解几个概念

首先,需要了解Kafka 有三种认证模式:Kerberos、Plain【简单帐号密码模式】、SSL 模式。

其次,Plain,简单帐号密码模式。它又分为 SASL/SCRAMSASL/PLAIN 两种方式。区别是:SASL/SCRAM 可以在 Kafka 服务启动之后,动态的新增用户分并配权限,在业务变动频繁,开发人员多的情况下比 SASL/PLAIN 方法更加灵活。

第三,SASL,全称:Simple Authentication Security Layer, 用于安全认证,又分为 GSSAPI 、Kerberos、NTLM。

第四,JAAS,全称:Java Authentication and Authorization Service,Java 提供的安全认证服务,Kafka 使用 SASL 协议时,通过 JAAS 实现认证,需要配置 jaas 认证文件。

1、Kafka 服务配置文件

进入 kafka 应用的 config 目录,修改 server.properties 文件,在尾部添加认证协议配置:

# 修改listeners
listeners=SASL_PLAINTEXT://:9092

# 权限配置
allow.everyone.if.no.acl.found=true
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN
super.users=User:admin

配置说明:

  1. listeners=SASL_PLAINTEXT ,指定认证协议,默认无安全认证。
  2. 检查 advertised.listeners 的协议类型也需要跟步骤 1 的协议类型一致。
  3. ACL 权限未配置时,是否允许访问,默认为 false,如果用户读写一个 Topic,但是没有配置 ACL 权限,客户端会包认证失败错误。
  4. security.inter.broker.protocol ,代理间通信所使用的安全协议。
  5. sasl.mechanism.inter.broker.protocol,代理直接 SASL 安全认证协议类型。
  6. sasl.enabled.mechanisms,Kafka 服务器的 SASL 安全认证协议类型 PLAIN
  7. super.users,超管用户名。

2、Kafka jaas 认证配置文件

在 config 目录下创建一个 jaas 配置文件 kafka-server-jaas-plain.conf ,使用简单帐号密码方式,配置内容如下:

KafkaServer {
    
  org.apache.kafka.common.security.plain.PlainLoginModule required
  username="admin"
  password="admin"
  user_admin="admin"
  user_test1="test1"
  user_test2="test2"
  user_test3="test3"
  user_test4="test4";
};

基本语法注意事项:

  1. 第一行:固定名称指定 KafkaServer 端的配置。
  2. 第二行:安全认证类名为 PlainLoginModule,与 Kafka 属性文件中的协议类型一致。此外,这个认证类也可以设置为 org.apache.kafka.common.security.scram.ScramLoginModule与 SCRAM 的认证类一致也能正常连接。
  3. 第三、四行:服务端使用的帐号和密码。
  4. 第五行,超管帐号的密码。
  5. 后面都是预设普通帐号认证信息,语法为 user_真正的用户名=''密码"
  6. 最后一行用户名密码定义后,必须以分号 ; 结尾。

3、Kafka 启动脚本添加认证文件路径的环境变量

Kafka 安全认证可以直接通过环境变量 -Djava.security.auth.login.config 设置,修改 Kafka 启动脚本 kafka-start-server.sh 文件最后一行,增加一个参数指向第二步的 jaas 配置文件的绝对路径:

exec $base_dir/kafka-run-class.sh $EXTRA_ARGS -Djava.security.auth.login.config=/Downloads/kafka_2.11-2.3.1/config/kafka-server-jaas-plain.conf kafka.Kafka "$@"

4、启动 Kafka

第一步,启动 Zookeeper

bin/zookeeper-server-start.sh config/zookeeper.properties

第二步,启动 Kafka

bin/kafka-server-start.sh config/server.properties

5、Kafka 连接客户端认证配置

用户 Java 编写一个 Kafka 消费者,用帐号 test1/test1 进行安全认证,主要代码如下:

//默认是30000ms
kafkaProps.put(DataShareConstant.REQUEST_TIMEOUT, "5000");
kafkaProps.put("transaction.timeout.ms", "5000");
kafkaProps.put("max.block.ms", "5000"); // 该属性决定连接超时的
kafkaProps.setProperty("security.protocol", SecurityProtocol.SASL_PLAINTEXT.name);
kafkaProps.put(SaslConfigs.SASL_MECHANISM, "PLAIN");
kafkaProps.put(SaslConfigs.SASL_JAAS_CONFIG, "org.apache.kafka.common.security.plain.PlainLoginModule required username=\"test1\" password=\"test1\";");

注意,这里设置 JAAS 属性需要与 Kafka Server 中的属性一致:

  1. 安全认证协议类型:security.protocol = SASL_PLAINTEXT
  2. SASL 的认证机制 = PLAIN
  3. SASL 认证配置信息,PlainLoginModule,帐号密码来自第二步配置预设的帐号。

值得注意的是,在做 Kafka 连通性测试时,因为 Kafka 存在失败重试机制,建议用同步请求,配置 max.block.ms 设置连接超时时间,迅速获取连接结果。

它默认是一分钟,如果需要通过页面配置 Kafka 信息,这个默认时间是不友好的。

启示录

Plain 模式的 SASL 安全认证实践起来比较容易,主要就是注意客户端和服务端协议类型的一致。

有几个常见问题:

1、如果服务器配置是 PLAIN,而客户端使用 SCRAM,则会报异常:

org.apache.kafka.common.errors.UnsupportedSaslMechanismException: Client SASL mechanism 'SCRAM-SHA-256' not enabled in the server, enabled mechanisms are [PLAIN]

2、客户端使用普通帐号,没有配置 ACL 权限时,默认写入 Kafka 时会报认证失败错误:Invalid username or password,这时帐号密码没问题的话,需要检查 ACL 权限。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wojiushiwo945you/article/details/127452193

智能推荐

【神经网络】BP算法解决XOR异或问题MATLAB版_bp-xor-程序员宅基地

文章浏览阅读499次。【神经网络】BP算法解决XOR异或问题MATLAB版_bp-xor

oracle 数据字典-程序员宅基地

文章浏览阅读91次。user_recyclebin drop 一个表后,实际上并没有真正删除,放在回收上中,通过user_recyclebin可以进行恢复。具体用法如下: select * from user_recyclebin;flashback table "BIN$1ygq8CJTQQm2mzqm90N/rg==$0" to before drop ;...

探索 Raylib-CPP:一个简洁高效的C++游戏开发库-程序员宅基地

文章浏览阅读291次,点赞3次,收藏8次。探索 Raylib-CPP:一个简洁高效的C++游戏开发库项目地址:https://gitcode.com/RobLoach/raylib-cppRaylib-CPP 是 Rob Loach 创建的一个开源项目,它为 C++ 开发者提供了一个简单、易用且高性能的游戏和图形应用开发框架。如果你正在寻找一个轻量级且易于上手的库来开启你的游戏编程之旅,那么 Raylib-CPP 绝对值得你关注。项..._raylib后台渲染

[Z]ubuntu12.04搭建android开发环境-程序员宅基地

文章浏览阅读55次。一直准备学一点Linux的东西,一直没有付诸行动,这个周末准备安装一下,做了将近半年的android开发,准备学一点关于框架和源码的东西。。。安装之前也百度谷歌了很多次,也看了网上不少的资料,总结一点,就是对于像我这种入门级的人来说,还是不够明确,结合网上的资料,本人在此再做完善一下,希望对后来之人有所帮助,于我也算是一种学习吧。首先是安装ubuntu,这个在ubuntu官方网站http:...

Linux设备树 .dtb文件,查看“第二课:设备树的规范(dts和dtb)”的源代码-程序员宅基地

文章浏览阅读840次。因为以下原因,您没有权限编辑本页:您所请求的操作仅限于该用户组的用户使用:用户您可以查看与复制此页面的源代码。= 第01节_DTS格式=dts文件通过编译生成dtb格式文件[[File:ldd_devicetree_chapter2_1_001.jpg|800px]]==属性的定义==value取值类型属性名=值只有三种取值#第一种 <1 0x3 0x123> (一个或多个32位数据..._dts与dtb

二、ORB-SLAM3编译安装和运行(Ubuntu22.04)_ubuntu22.04安装orb-slam3-程序员宅基地

文章浏览阅读1.1k次,点赞26次,收藏23次。(一条一条的)执行脚本中每条指令,并根据自己虚拟机分配的核数选择make后面的核数进行编译【首先尝试原来的脚本命令,运行不动到自动结束进程的地步的话改成make -j4,还运行不动直接改成make,这样会运行的慢一些但至少不卡,慢慢等吧,我的是Sophus运行那一块和最后一句指令卡住了,吐槽一下:天啦噜,运行不动啊真的会哭】”“无法打开虚拟机,是否从库中移除××”?还是这句话:我遇到的问题写在了后面,如果安装遇到问题可以先看看其中是否有相同的问题,是否有其解决方法。对于我年纪大了点的电脑太不容易了啊!_ubuntu22.04安装orb-slam3

随便推点

redis常见问题及解决方案-程序员宅基地

文章浏览阅读5k次,点赞3次,收藏21次。redis的性能并不受CPU的运行速度,影响redis性能的是网络带宽和内存大小。redis常见问题及对应解决方案:一、缓存穿透:就是查询一个压根就不存在的数据,即缓存中没有,数据库中也没有解决方案:使用布隆过滤器,把数据先加载到布隆过滤器中,访问前先判断是否存在于布隆过滤器中,不存在代表这笔数据压根就不存在。缺点:布隆过滤器是不可变的,可能一开始过滤器和数据库数据时一致的,后面数据库数据变了,或变多或变少,而对应的布隆过滤器的数据也要改变,这时会比较麻烦。二、缓存击穿:数据库中_redis常见问题及解决方案

MySQL批量导入数据时,为何表空间膨胀了N倍-程序员宅基地

文章浏览阅读417次。本文目录问题缘起排查思路问题发现问题缘起同事在客户现场利用DTS工具,从A实例将数据迁移到B实例过程中,发现几乎稍大点的表在迁移完成后,目标端表空间大小差不多都是源端的3倍,也就是说表空间膨胀了2倍。排查思路对这篇文章《叶问》第16期有印象的话,应该还能记得,数据迁移(导入导出)过程中,也包括主从复制场景,导致表空间膨胀的原因有几种:MySQL表默认是InnoDB引擎且目前索引只支持B+树索引..._mysql csv 导入后 体积变大

java/php/node.js/python乡村互助二手交易平台【2024年毕设】-程序员宅基地

文章浏览阅读25次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。

部署LAMP,在WEB服务器上部署ecshop网站_lamp + ecshop-程序员宅基地

文章浏览阅读486次。安装mysqlMySQL是一个开放源码的小型关联型数据库管理系统,可以从MySQL :: MySQL Downloads官网下载最新版本。如下所示具体安装步骤如下:使用SecureFX工具将上面三个文件上传到Linux服务器中,放在属主目录下,如图:先确认系统中是否已经安装过MySQL了,如果已经安装过,则会出现冲突。所以先用rpm命令遍历一下所有mysql已经安装的包:如果安装过,需要将已经安装的三个包依次删除:注意:删除三个包的时候,如果全..._lamp + ecshop

Linux下的vim如何保存并退出_linux vim保存退出命令-程序员宅基地

文章浏览阅读7.2k次,点赞3次,收藏16次。按键盘左上角的esc退出insert模式,vim filename进入文件之后。保存并退出,也可以按:p保存退出。_linux vim保存退出命令

如何通过navicat连接SQL Server数据库_navicat连接sqlserver-程序员宅基地

文章浏览阅读1w次,点赞16次,收藏39次。本文介绍如何通过Navicat 连接SQL Server数据库。_navicat连接sqlserver

推荐文章

热门文章

相关标签