【Kafka】docker 中配置带 Kerberos 认证的 Kafka 环境(全过程)

1. 准备 docker

  • 下载镜像 docker pull centos/systemd,该镜像是基于 centos7 增加了 systemd 的功能,可以更方便启动后台服务

  • 启动镜像

    • 使用 systemd 功能需要权限,如果是模拟 gitlab services 就不要使用 systemd 的方式启动

    • 如果不使用 systemd 功能 docker run -itd --name kafka_kerberos -p 9092:9092 centos/systemd

    • 如果使用 systemd 功能 docker run -itd --name kafka_kerberos -p 9092:9092 --privileged=true centos/systemd /usr/sbin/init

  • 根据需求清空 /etc/resolv.conf,内网环境中自动添加的 8.8.8.8 会影响网络

  • 启动 sshd /usr/sbin/sshd -D &

2. 配置 kerberos

服务端
  • 安装服务端 yum install krb5-server

  • 配置 /etc/hosts

    • 根据需要配置,配置下面 /etc/krb5.conf 文件中 TEST.COM 里的域名对应的 IP
  • 配置 /etc/krb5.conf

    • 对下面的行进行修改,其它行不变

      default_realm = TEST.COM
      default_ccache_name = /tmp/krb5cc_%{uid}
      dns_lookup_realm = false
      dns_lookup_kdc = false
      rdns = false
      # 这行注释掉
      # renew_lifetime=...[realms]
      TEST.COM = {kdc = kafka_kerberosadmin_server = kafka_kerberos
      }[domain_realm]
      .test.com = TEST.COM
      test.com = TEST.COM
      
  • 配置 /var/kerberos/krb5kdc/kdc.conf,将 EXAMPLE.COM 修改为 TEST.COM

  • 配置 /var/kerberos/krb5kdc/kadm5.acl,配置对 Kerberos 数据库的访问权限的,我只将 EXAMPLE.COM 改为了 TEST.COM,有权限需要可以找资料学习配置

  • 初始化 Kerberos 数据库

    • kdb5_util create -s -r TEST.COM

    • 键入密码,个人输入 kerberos,记录在此,以免忘记

  • 启动 kerberos 服务

    • 不使用 systemd 启动 (不带 systemd 的 docker 镜像需要用这种方式启动)

      /usr/sbin/krb5kdc -P /var/run/krb5kdc.pid -r TEST.COM
      /usr/sbin/kadmind -P /var/run/kadmind.pid -r TEST.COM
      
    • 使用 systemd 启动

      systemctl start krb5kdc
      systemctl start kadmin
      
  • kerberos 服务端使用 kadmin.local 进行管理,创建 root 的 principal (默认是 {当前用户}/admin@TEST.COM)

    • kadmin.local -q "add_principal root/admin@TEST.COM"
    • 输入密码,个人输入密码 root,记录在此,以免忘记
客户端
  • 安装客户端 yum install krb5-workstation

  • 配置 /etc/krb5,将服务端的文件拷贝覆盖

  • 在客户端使用 kadmin 管理

  • 认证用户

    kinit root/admin@TEST.COM

  • 查看当前认证的用户

    klist

  • 清空当前认证缓存

    kdestroy

3. 配置 kafka 环境

在 kafka 官网下载一个可用版本
在服务端生成认证所需的密钥
# 创建 principal
kadmin.local -q "add_principal -randkey zookeeper/kafka_kerberos@TEST.COM"
kadmin.local -q "add_principal -randkey kafka/kafka_kerberos@TEST.COM"
kadmin.local -q "add_principal -randkey kafka-client@TEST.COM"# 生成密钥前必须要建立密钥放置的目录
mkdir /root/keytabs# 生成密钥文件
kadmin.local -q "xst -k /root/keytabs/zookeeper-server.keytab zookeeper/kafka_kerberos@TEST.COM"
kadmin.local -q "xst -k /root/keytabs/kafka-server.keytab kafka/kafka_kerberos@TEST.COM"
kadmin.local -q "xst -k /root/keytabs/kafka-client.keytab kafka-client@TEST.COM"# 测试是否能够认证成功
kinit -kt /root/keytabs/zookeeper-server.keytab zookeeper/kafka_kerberos@TEST.COM
klist
配置 java 环境
# 安装JDK安装包(先查,再下载development环境的)
yum install openjdk-devel# 配置JAVA的真实位置
which java # 找到java位置
ls -lr /usr/bin/java # 找到java链接的文件(上面执行的结果)
ls -lrt /etc/alternatives/java # 找到链接文件的真实地址(上面执行的结果)# 配置JAVA_HOME (上面执行的结果,截取到系统版本号)
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64
export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
开始配置 kafka 环境
  • 配置 zookeeper 相关文件

    • 创建 config/kerberos/zookeeper-server-jaas.conf 文件,注意下面内容有两个分号

      Server {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truestoreKey=trueuseTicketCache=falsekeyTab="/root/keytabs/zookeeper-server.keytab"principal="zookeeper/kafka_kerberos@TEST.COM";
      };
      
    • 拷贝 config/zookeeper.properties 到 config/zookeeper-kerberos.properties,在末尾添加以下内容

      # 根据需要配置 dataDir
      dataDir=/root/kafka_data/zookeeperauthProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
      jaasLoginRenew=3600000
      sessionRequireClientSASLAuth=true
      
    • 创建启动脚本 zookeeper_start.sh

      export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/zookeeper-server-jaas.conf'
      ./bin/zookeeper-server-start.sh -daemon config/zookeeper-kerberos.properties
      
    • 创建停止脚本 zookeeper_stop.sh

      ./bin/zookeeper-server-stop.sh config/zookeeper.properties
      
  • 配置 kafka 相关文件

    • 创建 config/kerberos/kafka-server.jaas.conf 文件,注意下面内容有两个分号

      KafkaServer {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truestoreKey=trueuseTicketCache=falsekeyTab="/root/keytabs/kafka-server.keytab"principal="kafka/kafka_kerberos@TEST.COM";
      };Client {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truestoreKey=trueuseTicketCache=falsekeyTab="/root/keytabs/kafka-server.keytab"principal="kafka/kafka_kerberos@TEST.COM";
      };
      
    • 拷贝 config/server.properties 到 config/server-kerberos.properties,在末尾添加以下内容

      # 根据需要配置 log.dirs
      log.dirs=/root/kafka_data/kafka-logs# 这里要将 localhost 改为 principal 中的值,与 zookeeper/kafka_kerberos 对应
      zookeeper.connect=kafka_kerberos:2181
      listeners=SASL_PLAINTEXT://0.0.0.0:9092
      advertised.listeners=SASL_PLAINTEXT://kafka_kerberos:9092
      security.inter.broker.protocol=SASL_PLAINTEXT
      sasl.mechanism.inter.broker.protocol=GSSAPI
      sasl.enabled.mechanisms=GSSAPI# 需要和 principal 相同
      sasl.kerberos.service.name=kafka
      
    • 创建启动脚本 kafka_start.sh

      export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-server-jaas.conf'
      ./bin/kafka-server-start.sh -daemon config/server-kerberos.properties
      
    • 创建停止脚本 kafka_stop.sh

      ./bin/kafka-server-stop.sh config/server-kerberos.properties
      
    • 创建 topic_list.sh 脚本

      export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-server-jaas.conf'
      ./bin/kafka-topics.sh --zookeeper kafka_kerberos:2181 --list
      
    • 创建 create_topic.sh 脚本

      export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-server-jaas.conf'
      ./bin/kafka-topics.sh --create --zookeeper kafka_kerberos:2181 --replication-factor 1 --partitions 1 --topic $1
      
    • 创建 delete_topic.sh 脚本

      export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-server-jaas.conf'
      ./bin/kafka-topics.sh --delete --zookeeper kafka_kerberos:2181 --topic $1
      
  • 配置 kafka 客户端相关文件

    • 创建 config/kerberos/kafka-client-jaas.conf 文件,注意下面内容有两个分号

      KafkaClient {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truestoreKey=trueuseTicketCache=falsekeyTab="/root/keytabs/kafka-client.keytab"principal="kafka-client@TEST.COM";
      };
      
    • 创建 config/client-kerberos.properties 文件

      security.protocol=SASL_PLAINTEXT
      sasl.mechanism=GSSAPI
      sasl.kerberos.service.name=kafka
      
    • 创建 producer.sh 脚本

      export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-client-jaas.conf'
      ./bin/kafka-console-producer.sh --broker-list kafka_kerberos:9092 --topic $1 --producer.config config/client-kerberos.properties
      
    • 创建 consumer.sh 脚本

      export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-client-jaas.conf'
      ./bin/kafka-console-consumer.sh --bootstrap-server kafka_kerberos:9092 --topic $1 --from-beginning --consumer.config config/client-kerberos.properties
      
过程中报错处理
  • 报错 Server not found in Kerberos database

    • 查看 /var/log/krb5kdc.log 中报错,找不到 zookeeper/localhost@TEST.COM

    • 原因:配置 server-kerberos.properties 文件时,需要更改连接 zookeeper 的 host

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

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

相关文章

用Python构建一个可扩展的多网盘聚合管理工具 (以阿里云盘为例)

摘要 本文旨在从开发者视角,探讨并实践如何构建一个命令行界面的、支持多网盘聚合管理的工具。我们将以阿里云盘为例,深入解析其API认证与核心操作,并用Python从零开始实现文件列表、重命名、分享等功能。更重要的是,本文将重点讨…

筑牢网络安全屏障

在数字化浪潮席卷全球的今天,网络空间已成为继陆、海、空、天之后的 “第五疆域”,深刻影响着国家政治、经济、军事等各个领域。“没有网络安全就没有国家安全”,这句论断精准道出了网络安全与国家安全之间密不可分的关系。​ 网络安全关乎国…

计算机网络(一)层

一、分层 分层的意义:简化复杂性、提高灵活性、促进标准化 (1)法律上国际标准——OSI体系结构 (2)事实上的网络标准——TCP/IP体系结构 TCP:运输层的协议 IP:网际层的一个协议 网络接口层&…

STM32 rs485实现中断DMA模式收发不定长数据

在STM32F103上使用TD301D485H模块通过USB转485/422串口线与电脑通信 TXD (TD301D485H) -> PA2 (STM32F103)RXD (TD301D485H) -> PA3 (STM32F103)CON (TD301D485H) -> PA1 (STM32F103) 由于485是半双工通信,需要在发送和接收时控制方向引脚(CO…

DDL-8-小结

DDL 小结 DDL 小结 DDL 小结DDL - 数据库操作DDL - 表操作 DDL - 数据库操作 查看当前有哪些数据库 SHOW DATABASES;新建数据库 CREATE DATABASE 数据库名;使用数据库 USE 数据库名;查询当前数据库 SELECT DATABASE();删除数据库 DROP DATABASE 数据库名;DDL - 表操作 查看当前…

Redis 安装使用教程

一、Redis 简介 Redis 是一个开源(BSD 许可)、内存数据结构存储系统,可以用作数据库、缓存和消息中间件。支持字符串、哈希、列表、集合、有序集合等数据类型,广泛应用于分布式缓存、排行榜、实时数据分析等场景。 二、下载安装…

Go语言测试与调试:单元测试与基准测试

以下是《Go语言实战指南》中关于 测试与调试:单元测试与基准测试 的详细内容,涵盖测试编写、运行、覆盖率分析与性能测试,适用于实际项目开发与性能优化阶段。 一、Go 的测试体系概览 Go 提供原生的测试工具包 testing,无需第三方…

数字FIR-I型滤波器设计(窗函数法)

目录 一、实验目的 二、实验原理 2.1 概念辨析 2.2 代码实现逻辑与工具函数 三、实验内容 3.1 设计带通滤波器(电平组合法,(理想宽带低通-理想窄带低通)x窗函数) 3.2 高通滤波器(…

RHCSA认证题目练习一(配置网络设置)

一. 题目 配置网络设置 解题过程&#xff1a; 注意&#xff1a;不可以在xshell中完成&#xff0c;否则会直接断联 这里用图形化解题&#xff0c;更加简单防止命令记错 1. 打开图形化视图 命令&#xff1a;nmtui 按回车确认 按回车确认 2.首先把IPv4配置 <自动> 改成 …

STL简介+string模拟实现

STL简介string模拟实现 1. 什么是STL2. STL的版本3. STL的六大组件4.STL的缺陷5. string5.1 C语言中的字符串5.2 1个OJ题 6.标准库中的string类6.1 string类(了解)6.2 string类的常用接口说明1.string类对象的常见构造函数2.析构函数(~string())3.赋值函数 (operator) 6.3 stri…

golang实现一个mysql中随机获取cookies的API

之前用FASTAPI写了一个随机cookies请求的接口,现在尝试用golang实现同样的效果 1.编写go代码 package mainimport ("database/sql""encoding/json""fmt"_ "github.com/go-sql-driver/mysql""log""net/http"&quo…

[Vue2组件]三角形角标

[Vue2组件]三角形角标 <template><div class"ys-subscript" :style"svgStyle"><svg width"200" height"200" viewBox"0 0 200 200" xmlns"http://www.w3.org/2000/svg"><!-- 三角形背景 - 右…

洛谷刷题4

B4354 [GESP202506 一级] 假期阅读 题目传送门 B4354 难度&#xff1a;入门 很简单的题&#xff0c;如果小A看的页数≤这本书的页数&#xff0c;输出他看的页数 否则&#xff0c;输出这本书的页数 AC代码&#xff1a; #include <iostream> using namespace std; in…

【基于Echarts的地图可视化】

<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>中国牛只分布可视化</title><script src"https://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js"></script><script src"h…

系统架构设计师备考之架构设计基础

1.计算机系统基础知识 1.1.计算机系统概述 计算机系统的定义与组成 计算机系统是指用于数据管理的计算机硬件、软件及网络组成的系统。 计算机系统可划分为硬件和软件两部分。硬件由机械、电子元器件、磁介质和光介质等物理实体构成&#xff1b; 软件是一系列按照特定顺序组织…

针对华为云服务器使用率过大

从这两张监控图可以看出&#xff0c;服务器在大约上午 10:30 前后经历了一次明显的负载变化&#xff1a; 1. 图表解读 CPU 使用率 从凌晨到上午约 10:00 前&#xff0c;CPU 基本处于 0–2% 的闲置状态。10:00–14:00 之间&#xff0c;CPU 利用率逐步攀升&#xff0c;多次冲击 3…

记dwz(JUI)前端框架使用之--服务端响应提示框

目录 前言 一、DWZ服务器端响应种类 二、如何增加info级别的消息提示 1.打开项目的BaseController.java类 2.打开项目的dwz.min.js文件 3.最后在前端DWZ的主加载页面或者js文件中添加如下代码&#xff1a; 前言 本篇文章没有讲太多东西&#xff0c;主要是个人工作记录保…

leetcode 295. 数据流的中位数

时间复杂度分析&#xff1a;为什么你的中位数查找方案会超时&#xff1f; 分析你提供的MedianFinder实现&#xff0c;其时间复杂度较高的原因主要在于findMedian函数的实现方式。让我详细解释&#xff1a; 代码时间复杂度分析 你的代码中两个主要函数的时间复杂度如下&#…

大语言模型介绍

随着2022年底 ChatGPT 再一次刷新 NLP 的能力上限&#xff0c;大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;开始接替传统的预训练语言模型&#xff08;Pre-trained Language Model&#xff0c;PLM&#xff09; 成为 NLP 的主流方向&#xff0c;基于…

STM32 CCR寄存器

​1. CCR寄存器在输入捕获模式下的特性​ ​只读属性​&#xff1a; 当定时器通道配置为输入捕获模式&#xff08;如捕获上升沿/下降沿&#xff09;时&#xff0c;CCR寄存器硬件自动变为只读​。软件写入操作无效&#xff0c;只能在捕获事件发生时由硬件自动更新为当前CNT值。…