Kafka 认证三:添加 Kerberos 认证详细流程

news2024/11/24 17:42:59

背景

上一章节介绍了 Kerberos 服务端和客户端的部署过程,本章节继续介绍 Kafka 添加 Kerberos 认证的部署流程,及 Java API 操作的注意事项。

sasl.kerberos.service.name 配置的含义

Kafka 添加 Kerberos 部署的核心是 Kafka 服务端的 Principal 配置,它的 primary 部分必须配置在 properties 文件的 sasl.kerberos.service.name 属性中,而主机名部分必须保证 Kafka IP 的域名在 /etc/hosts 文件中存在。

对 Kafka 客户端来说,合起来就是,sasl.kerberos.service.name 的值/Kafka IP 或者 Kafka IP 对应的主机名称@Realm 这三项拼接的成目标服务的 Principal,必须保证它在 KDC 数据库中。

搜了好久都没有看到这个配置项的解释,反复操作后终于理解了这个属性的含义。

例如,请求目标 Kafka IP 是 192.168.xx.1 ,Kafka 客户端发起 Kerberos 认证时,向 KDC 发送 AS_REQ,目标服务的 Principal 的计算过程如下:

1)如果 /etc/hosts 文件中存在目标主机的域名,那么请求服务的 Principal 就是
sasl.kerberos.service.name/主机名称@Realm

2) 如果 /etc/hosts 文件中不存在目标主机的域名,那么请求服务的 Principal 就是
sasl.kerberos.service.name/目标IP@Realm

从 KDC 的日志看到这个结果:

在这里插入图片描述

例如,我这个请求过程,Client 端主机配置了目标 Kafka IP 的的域名为 oracle ,这里Kerberos 票据认证过程就是这个。

结论就是, 针对客户端和服务端,这两个配置的含义分别是:

1、Kafka 客户端最重要的 sasl.kerberos.service.name + 目标 IP 的域名必须存在 KDC 认证数据库中。

2、Kafka 服务端 sasl.kerberos.service.name + 本机域名,必须是 jaas.config 文件中的 KafkaServer 的 principal 的值。

主机域名准备

Kerberos 的 Principals 组成规则是:

username/fully.qualified.domain.name@YOUR_REALM.COM

作为服务端一般都是需要配置域名的,最好是客户端和服务端都配置服务器 IP 的域名,且必须统一,才能保证 Kerberos 认证流程正确,否则很容易出现 Not found in Kerberos database 的问题。

对于Kafka 集群来说,集群主机的 Principal 的 username 相同,但是主机域名不同,客户端维护集群节点的域名,sasl.kerberos.service.name 配置就是各节点的 username

Kafka Kerberos 认证环境搭建之前,必须先在客户端和服务器端的 /etc/hosts 文件中配置 Kafka Server IP 的域名。网上很多搭建教程,都是 Kafka 客户端和 Kafka 服务同主机,所以不会出现域名配置导致的问题。

角色IPPrincipal
Client192.168.10.101hello-kafka-client@MY_KDC.COM
Server192.168.10.102hello-kafka-server/oracle@MY_KDC.COM

这里 IP 随便写的,Kafka Client 的 IP 不需要配置域名,在 192.168.10.101 上维护目标服务器的域名,添加在 /etc/hosts 文件中,参考如下:

192.168.10.102 oracle

在 Kafka 客户端主机上部署一份 kafka ,用于启动消费者应用;服务端正常部署 Kafka ,且在 kafka 主目录下创建一个 kerberos 文件夹,放 Kerberos 认证相关的配置文件。

KDC 注册客户端和服务端

第零步,拷贝 krb5.conf。

拷贝 KDC 认证中心的 krb5.conf 文件到全部的 Kerberos 客户端,客户端最重要的系统环境变量就是 krb5.conf 文件的路径。所以,每个 KDC 的客户端都需要维护与 KDC 服务器端一致的 krb5.conf 文件,拷贝命令为:

scp /etc/krb5.conf root@192.168.10.101:/opt/kafka-1.0.2/kerberos/krb5.conf

scp /etc/krb5.conf root@192.168.10.102:/opt/kafka-1.0.2/kerberos/krb5.conf

Java API 添加 Kerberos 认证的代码为:

System.setProperty("java.security.krb5.conf", krb5Conf);

第一步,注册 Kerberos 帐号。

需要到 Kerberos 数据库中注册 Kafka 的客户端和服务端,按刚刚表里面的 Principal 注册到默认域名 MY_KDC.COM 中。

在 Kerberos 服务器上,执行 kadmin.local 命令,输入下面操作,注册帐号:

addprinc hello-kafka-client
addprinc hello-kafka-server/oracle

操作结果如下:

在这里插入图片描述

第二步,生成帐号的 keytab 文件。 对上面添加的两个 Kerberos 帐号,导出 keytab 文件:

kadmin.local -q "xst -norandkey -k  /root/hello-kafka-client.keytab hello-kafka-client@MY_KDC.COM"

kadmin.local -q "xst -norandkey -k  /root/hello-kafka-server.keytab hello-kafka-server/oracle@MY_KDC.COM"

利用控制台命令 kadmin.local 导出 keytab 文件,客户端 keytab :

在这里插入图片描述
服务端 keytab 如下:

在这里插入图片描述

第三步,传输 keytab 文件。 将帐号的 keytab 文件远程传输到 Kafka 客户端和服务端,就是前面的 101 和 102 两台主机上。

scp /root/hello-kafka-client.keytab root@192.168.10.101:/opt/kafka-1.0.2/kerberos/hello-kafka-client.keytab

scp /root/hello-kafka-server.keytab root@192.168.10.102:/opt/kafka-1.0.2/kerberos/hello-kafka-server.keytab

Kafka 服务器部署 Kerberos

第一步,准备 server-kerberos.properties 文件。 拷贝 Kafka config 目录下的 server.properties 文件,命名为 kerberos-server.properties ,编辑认证配置相关的内容:

listeners=SASL_PLAINTEXT://192.168.10.102:9092
advertised.listeners=SASL_PLAINTEXT://192.168.10.102:9092

security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=GSSAPI
sasl.enabled.mechanisms=GSSAPI
sasl.kerberos.service.name=hello-kafka-server

主要就是上面的几项配置, sasl.kerberos.service.name=hello-kafka-server 就是当前 Kafka 的 keytab 文件中的 Principal 的 username 部分。

第二步,准备 server-jaas.conf 配置文件。 kerberos 目录下,创建文件 kafka-server-jaas.conf,编辑内容如下:

KafkaServer {
   com.sun.security.auth.module.Krb5LoginModule required
   useKeyTab=true
   //不同的主机,需修改成不同的keytab文件
   keyTab="/opt/kafka-1.0.2/kerberos/hello-kafka-server.keytab"
   storeKey=true
   useTicketCache=false
   // Kafka Server 在 KDC 中的用户名全称
   principal="hello-kafka-server/oracle@MY_KDC.COM";
};

第三步,准备 kafka-server-kerberos-start.sh 文件,添加 Kerberos 认证配置。 拷贝 bin/kafka-server-start.sh 脚本,命名为 kafka-server-kerberos-start.sh,编辑最后一行,在最后一行代码之前,添加 Krb5 环境变量和 jaas.conf 配置信息:

export KAFKA_OPTS="-Dzookeeper.sasl.client=false -Dzookeeper.sasl.client.username=zk-server 
-Djava.security.krb5.conf=/opt/kafka-1.0.2/kerberos/krb5.conf 
-Djava.security.auth.login.config=/opt/kafka-1.0.2/kerberos/kafka-server-jaas.conf"

在这里插入图片描述

第四步,启动 Kafka 服务。 用新建的脚本 kafka-server-kerberos-start.sh 和 配置 kerberos-server.properties 启动 Kafka :

bin/kafka-server-start-kerberos.sh -daemon kerberos/kerberos-server.properties

Kafka 客户端部署 Kerberos

第一步,准备 client-kerberos.properties 文件。 拷贝 Kafka config 目录下的 consumer.properties 文件,命名为 client-kerberos.properties ,编辑认证配置相关的内容:

bootstrap.servers=192.168.10.102:9092
group.id=test-consumer-group001
curity.protocol=SASL_PLAINTEXT
sasl.mechanism=GSSAPI
sasl.kerberos.service.name=hello-kafka-server

第二步,准备 client-jaas.conf 配置文件。 kerberos 目录下,创建文件 kafka-client-jaas.conf,编辑内容如下:

KafkaClient {
   com.sun.security.auth.module.Krb5LoginModule required
   useKeyTab=true
   //不同的主机,需修改成不同的keytab文件
   keyTab="/opt/kafka-1.0.2/kerberos/hello-kafka-client.keytab"
   storeKey=true
   useTicketCache=false
   // Client 在KDC中的帐号
   principal="hello-kafka-client@MY_KDC.COM";
};

第三步,准备 kafka-server-kerberos-start.sh 文件,添加 Kerberos 认证配置。 拷贝 bin/kafka-console-consumer.sh 脚本,命名为 kerberos-kafka-console-consumer.sh,编辑最后一行,在最后一行代码之前,添加 Krb5 环境变量和 jaas.conf 配置信息:

export KAFKA_OPTS="-Djava.security.krb5.conf=/opt/kafka-1.0.2/kerberos/krb5.conf 
-Djava.security.auth.login.config=/opt/kafka-1.0.2/kerberos/kafka-client-jaas.conf"

第四步,用第一步的配置文件,进行带认证的消费:

bin/kerberos-kafka-console-consumer.sh --bootstrap-server 192.168.10.102:9092 --topic  my-topic --consumer.config=kerberos/client-kerberos.properties --from-beginning

在这里插入图片描述

KDC 日志查看认证过程

KDC 服务中心的日志文件是 /var/log/krb5kdc.log ,每次 Kerberos 认证都对应两条日志信息:

在这里插入图片描述
如果 Kafka 服务启动或者客户端启动失败,也可以查看该日志文件,常见的错误就是主机和域名、服务名称配置不一致,导致 Server not found in Kerberos database 异常。

另外,多域名问题,还没有找到解决办法。如果一个客户端的 krb5.conf 文件中配置多个 Realm ,默认只能有一个 Realm ,但是对于需要同时访问多个 Kafka 、多套认证 Realm 的应用来说,到底该怎么配置呢?

启示录

官方 Kerberos 资料,没有耐心看下去,网络上搜到的,照猫画虎实践下来,其实也能部署下来的,关键是 kerberos.service.name 这个属性,想了两天才想明白,还有主机域名配置等基础支持等,零零碎碎,以此留存网络笔记。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/14128.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于gensim实现word2vec模型(附案例实战)

目录 什么是word2vec? Word2Vec的原理 gensim实现word2vec模型(实战) 什么是word2vec? Word2Vec是google在2013年推出的一个NLP工具,它的特点是能够将单词转化为向量来表示,这样词与词之间就可以定量的…

20+个很棒的 Python 脚本的集合(迷你项目)

💂 个人网站:【海拥】【摸鱼小游戏】【神级源码资源网站】🤟 风趣幽默的前端学习课程:👉28个案例趣学前端💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】💬 免费且实用的 前…

【软件分析第17讲-学习笔记】程序综合 Program Synthesis

文章目录前言正文程序综合枚举法CEGIS:基于反例的优化约束求解法启发式搜索法统计法基于组件的程序综合 Component-Based Synthesis小结参考文献前言 创作开始时间: 如题,学习一下程序综合 Program Synthesis的相关知识。参考:熊…

AUTOSAR-Fee模块

(73条消息) AUTOSAR-Fee模块_一ye残雪的博客-CSDN博客_fee 配置 0 前言 Fee模块全称Flash EEPROM Emulation Module,属于ECU抽象层 Fee模块本身是脱离硬件的,但是Fee模块可能会引用的Fls模块定制API,所以只能算半抽象 本文中,由于…

数据库高级 III

数据库高级 III 二叉排序树在极端情况下存在的问题 二叉排序树在极端情况下会产生失衡二叉树 失衡二叉树其实是不希望存在的,因为它失去了二叉排序树的查询优势,现在这种失衡二叉树的查询效率和单向链表一样,此时它就是单向链表 数据结构…

14.4、SpringWebFlux-1

14.4、SpringWebFlux-1 14.4.1、前置知识 SpringMVC,SpringBoot,Maven,Java8 新特性 14.4.2、基本介绍 官方文档 Web on Reactive Stack (spring.io) 是 Spring5 添加新的模块,用于 web 开发的,功能 SpringMVC 类…

网络热传App鉴定 |「得物」疑私删用户视频?从技术角度还原事件始末

声明:本文更注重于原理知识的普及,因此文中不会有大量实际代码的展示,如果想从代码层面上了解「应用存储分区」的内容,欢迎阅读我两年前写过的技术文章《Android 10 应用分区存储适配实践》 近日,有网友爆料&#xff0…

MySQL 分库分表

MySQL分库分表 概念 读写分离优化了互联网读多写少场景下的性能问题,考虑一个业务场景,如果读库的数据规模非常大,除了增加多个从库之外,还有其他的手段吗?实现数据库高可用,还有另外一个撒手锏&#xff…

Python性能优化指南--让你的Python代码快x3倍的秘诀

Python性能优化指南 Python最为人诟病的就是其执行速度。如何让Python程序跑得更快一直是Python核心团队和社区努力的方向。作为Python开发者,我们同样可以采用某些原则和技巧,写出性能更好的Python代码。本文将带大家深入探讨Python程序性能优化方法。…

99页4万字XX大数据湖项目建设方案

目 录 1. 项目综述 1.1. 项目背景 1.2. 项目目标 1.3. 项目建设路线 2 需求分析 2.1功能需求 2.1.1 统一数据接入 2.1.2 数据迁移 2.1.3 数据范围与ETL 2.1.4 报表平台 2.1.5 安全管理 2.1.6 数据治理 2.2非功能需求 2.2.1运维保障需求 2.2.2可用性需求 2.2.3可…

MQTT 具备那些特征?

目录 1、MQTT 中的 QoS(消息服务质量) (1)为什么服务质量(QoS)很重要? (2)QoS 在 MQTT 中是如何工作的? (3)如何选择正确的 QoS 级别 (4&a…

Java开发中Word转PDF文件5种方案横向评测

Java开发中Word转PDF文件5种方案横向评测 前段时间接了个项目,需要各种处理Word模板、转PDF、签章等等,非常头疼,其中光是一个word转PDF就折磨我好久,实现转换很简单,但是效果总是达不到满意,于是我把市面…

【Linux】关于普通用户无法使用sudo指令的解决方案

文章目录前言解决方案结语前言 在这篇博客中,测试 rm -rf 删除文件时无视权限暴力删除的效果时,使用了 sudo 指令。 但是sudo指令是不能直接使用的,需要修改一些设置。 当时我遇到这个问题时,困惑了许久,查找解决方…

JVM执行引擎

文章目录学习资料执行引擎概述工作过程Java代码编译和执行的过程什么是解释器(Interpreter),什么是JIT编译器?为什么说Java是半编译半解释型语言?机器码、指令、汇编语言、高级语言机器码指令指令集汇编语言高级语言字…

UE5实现PS图层样式投影效果

一、PS图层样式投影效果 1、创建材质函数 MF_PS_Style_Shadow 公开到库(可选) 定义 function input。 Shadow代码: /** PS图层样式投影效果param {UVs} texture coordinateparam {TextureObject} texture objectparam {TextureSize} …

十、children的深入用法-React.Children对象上的方法

目标 理解什么是children掌握React.Children对象上的方法 知识点 什么是children上图中我们看到了,我们之前学过的React.createElement方法,现在大家发现jsx的内容,全部都体现在了该方法上;那么React.createElement其实是有三个…

专精特新企业数据集两份数据

专精特新企业数据集 一、三批专精特新上市、非上市公司数据分布 1、时间截止至2021年8月 2、区域范围:上市和非上市公司两大板块,涵盖申万一级行业 3、指标说明: 包含如下内容:专精特新上市公司名单汇总、第一批专精特新上市公…

opencv 入门学习

opencv 演示 输入说明 原图在顶层后然后再去按键,不然会失效(未知原因) 1.roberts 边缘检测 2.sobel算子 3.Canny算子 4.Laplace算子 5.Canny算子,轮廓显示 空格 人脸检测准备一张图片效果 默认显示原图和灰阶图 roberts 边缘…

MySQL版本号6和7去哪了

问题 MySQL版本号6和7去哪了 详细问题 笔者起初误以为MySQL版本号6和7可能由于存在诟病不受欢迎或由于MySQL版本迭代过快导致未能在市场上流行 但是在浏览MySQL官网注意到 MySQL在2017年发布了新的版本8.0,但是在此之前的上一一个版本是5.7,40,那么中间的6和7去哪…

并发编程永远绕不开的难题,跟着大牛带你Java并发编程从入门到精通

我们知道,很多框架或者自研组件的底层,都或多或少涉及到并发编程方面的技术点。 比如:在一些本地缓存组件中,当本地缓存过期后,需要从数据库加载数据,这个阶段中就会涉及到线程并发请求的处理;在…