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

智能推荐

MapReduce自定义InputFormat异常:Caused by: java.lang.ClassCastException: org.apache.hadoop.io.LongWritable-程序员宅基地

文章浏览阅读1.3k次。异常信息:Caused by: java.lang.ClassCastException: org.apache.hadoop.io.LongWritable异常来源:在使用MapReduce自定义InputFormat后,运行程序抛出该异常。异常抛出后,一开始认为可能是代码中涉及类型转换出现问题。反复排查后,此可能被排除异常分析:以下是异常发生前书写的代码:自定义 InputFo..._caused by: java.lang.classcastexception: org.apache.hadoop.io.longwritable c

WINCE 6.0 5.0 区别_win ce5.0 ce6.0区别-程序员宅基地

文章浏览阅读2.6k次。CE 6.0 R2对CE 6.0的功能增加:1 Core OS2 IE3 Media Player4 RDP 对于从事廋客房端开发的人员有很大的帮助5 VoIP6 Web Services一) CE OS的改变,只有两次1 2.0->3.02 5.0->6.0但是4.2到5.0驱动变化较大,导致从4.2到5.0的移植需要很长的时间二) CE 6.0与5.0的主要区别1 CE6.0的Ker_win ce5.0 ce6.0区别

图像meta信息中XMP[drone-dji]如何获取_xmp.drone-dji.lrftargetdistance-程序员宅基地

文章浏览阅读1.4k次。在处理大疆无人机拍的图像时,官方给的图像处理指南里出现了这么一句:于是去网上查找如何读取图像meta信息,找到了许多花里胡哨的方法,比如python代码、java代码、网站代查之类,最终我发现,最简便的方法就是:用写字板的方式打开图像,然后查找”xmp“ ,需要的参数就全能找到了。唯一的不足就是这个方法的效率太低了,写字板打开tif文件奇慢无比。..._xmp.drone-dji.lrftargetdistance

云服务器(阿里云)安装kafka及相关报错处理(WARN Connection request from old client /58.247.201.56:31365; will be dropp)-程序员宅基地

文章浏览阅读4.2k次。云服务器安装kafka,部署zookeeper时有如下注意点:1、在云服务器安全组中开放:2181、9092端口2、zookeeper.connect改成公网IP3、listeners=PLAINTEXT:// 必须填内网IPlisteners=PLAINTEXT://**.**.**.**:90924、配置外部代理地址必须填公网IPadvertised.listeners=PLAINTEXT://**.**.**.**:9092advertised.host.name=*.._connection request from old client

【连接池】-从源码到适配(上),你遇到过数据库连接池的问题吗?This connection has been closed_failed to initialize pool: this connection has bee-程序员宅基地

文章浏览阅读1.2k次,点赞19次,收藏22次。本文从项目需求出发到项目最终发版提测,讲述一下项目中遇到的问题(MyBatis数据库厂商适配、查看数据库链接、连接池失效等)以及打怪升级过程(思路),文章中会提到涉及到的坑以及解决办法。相信看完,多少会给你提供一些价值。_failed to initialize pool: this connection has been closed.

android listpreference 自定义,自定义android preference组件-程序员宅基地

文章浏览阅读179次。e() {return mDisableDependentsState;}public void setDisableDependentsState(boolean disableDependentsState) {mDisableDependentsState = disableDependentsState;}@Overrideprotected Object onGetDefaultValu..._android 自定义listpreference

随便推点

macOS m1---jenkins---系统配置_m1配置jerkings-程序员宅基地

文章浏览阅读414次。填写自己的邮箱和授权码 ,点击应用,点击保存。_m1配置jerkings

bcdedit-程序员宅基地

文章浏览阅读1.5k次。bcdedit_bcdedit

java日期工具类、日期格式校验、日期格式化_java校验日期格式-程序员宅基地

文章浏览阅读6.8k次,点赞4次,收藏22次。java项目中经常会使用到对日期进行格式校验、格式化日期、LocalDate与Date互转等等,以下整理一份经常会使用到的日期操作相关的方法。_java校验日期格式

【TCP/IP】 以太网流量控制------pause流控_流控 pause 发送时机 计算-程序员宅基地

文章浏览阅读7.4k次,点赞10次,收藏94次。文章目录一、以太网的流量控制二、pause流控的原理和实现1.pause流控原理2.pause消息格式3.pause流控处理逻辑4.pause流控芯片上的实现三、pause流控的作用与副作用1.pause流控的作用2.pause流控的副作用四、pause流控对性能的影响分析1.性能影响2.风险评估最近定位了一个pause流控引发的产品问题,对pause流控进行了详细的研究,由于网上关于pause流控的相关资料非常少,这里将所有pause流控相关的知识总结整理一下,供大家参考。一、以太网的流量控制以_流控 pause 发送时机 计算

对linux下各种profiling工具的心得_profiling的工作-程序员宅基地

文章浏览阅读4k次。第一次写博_profiling的工作

tf.nn.dropout() 警报信息处理_please use `rate` instead of `keep_prob`. rate sho-程序员宅基地

文章浏览阅读8.2k次,点赞11次,收藏23次。WARNING: Logging before flag parsing goes to stderr.calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.Instructions for updatin..._please use `rate` instead of `keep_prob`. rate should be set to `rate = 1 -