草庐IT

为 Kafka 配置 SASL 和 SSL

bilibili_877b 2023-03-28 原文

SASL配置

使用 SASL/PLAIN 进行身份验证

SASL/PLAIN 是一种简单的用户名/密码认证机制。 Kafka 支持 SASL/PLAIN 的默认实现,下面将详细描述如何为Kafka配置SASL/PLAIN。

  1. 在每个 Kafka Broker 的配置目录中(例如:/home/chen/kafka_2.12-0.11.0.0/config,后文将使用{KAFKA_HOME}代表/home/chen/kafka_2.12-0.11.0.0)添加一个经过适当修改的 JAAS 文件,类似于下面的文件,我们将其命名为 kafka_server_jaas.conf 以用于本示例:
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin-secret"
user_admin="admin-secret"
user_alice="alice-secret";
};

此配置定义了两个用户(admin 和 alice)。 KafkaServer中的属性usernamepassword由Broker用于启动与其他Broker的连接。 在本例中,admin 是Broker间通信的用户。 属性集 user_username 定义了连接到Broker的所有用户的密码,Broker使用这些属性验证所有客户端连接,包括来自其他Broker的连接。

  1. 将 JAAS 配置文件位置作为 JVM 参数传递给每个 Kafka Broker
export KAFKA_OPTS="-Djava.security.auth.login.config={KAFKA_HOME}/config/kafka_server_jaas.conf"
  1. server.properties 中配置 SASL 端口和 SASL 机制。 例如:
listeners=SASL_PLAINTEXT://{server_host}:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN
  1. 最后,通过Kafka Assistant ( http://www.redisant.cn/ka )进行连接
捕获3.PNG

使用 SASL/SCRAM-SHA-256 进行身份验证

TODO

使用 SASL/SCRAM-SHA-512 进行身份验证

TODO

SSL配置

为简单起见,我们将只设置一个代理和客户端,但我们还将在此过程中记录您需要为更复杂的配置做什么。

在您完成这些说明时,您需要多次指定代理 {server_hostname} 和客户端 {client_hostname} 机器的名称。 理想情况下,您将使用机器的完全限定域名 (Fully Qualified Domain Name, FQDN),但如果您尚未为机器分配主机名,则可以使用 IP 地址。 如果您只是在进行试验,并且打算在同一台机器上运行代理和客户端,那么两者都使用 localhost 或 127.0.0.1 也是可以的。

单向 SSL/TLS

  • 与网站的 HTTPS 连接完全相同的设置。
  • 客户端验证代理的身份——即客户端可以确定它正在与预期的代理进行通信,而不是冒充者,因此可以免受中间人攻击。
  • 通信是加密的。
  • 服务器不验证客户端的身份(不对客户端进行身份验证)——任何客户端都可以连接到服务器。

步骤:

第一步:为代理创建私钥/公钥证书对:

注意:您需要对集群中的每个代理重复此步骤。

注意:我们使用 Java 附带的 keytool 实用程序来执行此任务,因为它根据代理的要求将生成的密钥/证书对存储在 JKS 容器中。

keytool -keystore server.keystore.jks -alias {server_hostname} -validity 365 -genkey -keyalg RSA

这将:

  1. 在当前目录中创建一个新的密钥库 server.keystore.jks。

  2. 提示您输入密码以保护密钥库。

  3. 生成新的公钥/私钥对并提示您输入制作公钥证书所需的其他信息。 总的来说,此信息称为可分辨名称 (Distinguishing Name, DN)。

    1. 您需要将 CN(“What is your first and last name?”问题的答案)设置为 {server_hostname}。 其他信息对于我们的目的均不重要。
    2. 您还可以通过命令行 -dname 参数设置 DN,如下所示: -dname "cn={server_hostname}"
  4. 将私钥和自签名公钥证书存储在密钥库文件中的别名 {server_hostname} 下。

    1. 系统将提示您输入密码以保护密钥库中的此特定密钥/证书对。
    2. 或者,您可以使用 -storepass-keypass 命令行参数设置密码。

例如,我的{server_hostname}kago,那么在我机器上执行的命令实际为:

keytool -keystore server.keystore.jks -alias kago -validity 365 -genkey -keyalg RSA -dname "CN=kago, OU=IT, O=Redisant, L=XIAN, ST=SHANXI, C=CN"

第二步:创建证书颁发机构 (CA) 私钥/根证书:

重要提示:不要试图通过使用自签名证书(避免使用 CA)来简化配置过程 - 这不安全(容易受到中间人攻击)。

openssl req -nodes -new -x509 -keyout ca-root.key -out ca-root.crt -days 365

或者也可以生成.pem格式的证书

openssl req -nodes -new -x509 -keyout ca-root.key -out ca-root.pem -days 365

这将:

  1. 提示您输入 DN 信息以放入证书。 对于我们的目的,这些都不是必需的,但是,您可以使用 -subj 命令行参数来避免提示。 例如:-subj "/C=CN/ST=SHANXI/L=CHANGAN/O=Redisant/CN=Redisant"

  2. 创建一个私钥/自签名公钥证书对,其中私钥不受密码保护。

  3. 如果您想用密码保护私钥,请省略 -nodes 标志,系统将提示您输入密码。

例如,在我的机器上,这一步实际执行的命令为:

openssl req -new -x509 -keyout ca-root.key -out ca-root.crt -days 365 -subj "/C=CN/ST=SHANXI/L=CHANGAN/O=Redisant/CN=Redisant"

第三步:签署Broker公钥证书:

  1. 从您在步骤 1 中创建的位于服务器密钥库文件中的自签名证书生成证书签名请求 (CSR):
keytool -keystore server.keystore.jks -alias {server_hostname} -certreq -file {server_hostname}_server.csr
  1. 使用您在步骤 2 中生成的 CA 密钥对从您刚刚创建的 CSR 创建 CA 签名证书:
openssl x509 -req -CA ca-root.crt -CAkey ca-root.key -in {server_hostname}_server.csr -out {server_hostname}_server.crt -days 365 -CAcreateserial 
  1. 将此签名证书导入您的服务器密钥库(覆盖现有的自签名证书)。 在执行此操作之前,您还需要添加 CA 公钥证书:
keytool -keystore server.keystore.jks -alias CARoot -import -noprompt -file ca-root.crt
keytool -keystore server.keystore.jks -alias {server_hostname} -import -file {server_hostname}_server.crt

最后一步:配置Broker代理和客户端

您现在拥有配置代理和客户端所需的一切。

Broker配置:

listeners=PLAINTEXT://{server_hostname}:9092,SSL://{server_hostname}:9093
ssl.keystore.location=/path/to/keystore/file/server.keystore.jks
ssl.keystore.type=JKS
ssl.keystore.password=test1234
ssl.key.password=test1234

Kafka Assistant客户端配置:

捕获.PNG

注意,如果您创建的是ca-root.pem格式的证书,需要转换成.crt格式,Kafka Assistant才能识别:

openssl x509 -in ca-root.pem -out ca-root.crt

双向 SSL/TLS(单向 SSL/TLS + SSL 客户端身份验证)

  • 单向 SSL/TLS 提供的功能,以及:
  • 服务器验证客户端的身份(即客户端提供的公钥证书已由服务器信任的 CA 签名)。

步骤:

第一步:为客户端创建私钥/公钥证书对

Kafka Assistant客户端不是基于 Java 的,因此不使用 Java 的 JKS 容器格式来存储私钥和证书。 我们将使用 openssl 为客户端创建密钥/证书对,而不是像我们为代理创建的 keytool。

第一步是创建证书签名请求 (CSR)。 注意:不需要像我们为代理所做的那样首先显式创建自签名证书。

openssl req -newkey rsa:2048 -nodes -keyout {client_hostname}_client.key -out {client_hostname}_client.csr

这将提示您输入一组标准公钥证书字段值,这些对于我们的目的并不重要。

您还将被提示输入密码。 您可以在此处输入空白密码,或设置密码。

现在您有了 CSR,您可以生成 CA 签名证书,如下所示:

openssl x509 -req -CA ca-root.crt -CAkey ca-root.key -in {client_hostname}_client.csr -out {client_hostname}_client.crt -days 365 -CAcreateserial 

第二步:创建一个包含 ca-root.crt 的信任库

代理现在需要访问 CA 根证书,以检查客户端提供的证书的有效性。 创建包含 CA 根证书的信任库(另一个 JKS 容器文件),如下所示:

keytool -keystore server.truststore.jks -alias CARoot -import -file ca-root.crt

第三步:配置代理和客户端

代理配置:

listeners=PLAINTEXT://{server_hostname}:9092,SSL://{server_hostname}:9093
ssl.keystore.location=/path/to/keystore/file/server.keystore.jks
ssl.keystore.type=JKS
ssl.keystore.password=test1234
ssl.key.password=test1234
ssl.truststore.location=/path/to/truststore/file/server.truststore.jks
ssl.truststore.type=JKS
ssl.truststore.password=test1234
ssl.client.auth=required

Kafka Assistant客户端配置:

捕获2.PNG

SASL_SSL配置

TODO

有关为 Kafka 配置 SASL 和 SSL的更多相关文章

  1. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  2. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  3. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  4. 神州数码无线产品(AC+AP)配置 - 2

    注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配

  5. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  6. Ruby 默认将 IRB 配置为 Pretty_Inspect - 2

    我是ruby​​的新手,正在配置IRB。我喜欢pretty-print(需要'pp'),但总是输入pp来漂亮地打印它似乎很麻烦。我想做的是默认情况下让它漂亮地打印出来,所以如果我有一个var,比如说,'myvar',然后键入myvar,它会自动调用pretty_inspect而不是常规检查。我从哪里开始?理想情况下,我将能够向我的.irbrc文件添加一个自动调用的方法。有什么想法吗?谢谢! 最佳答案 irb中默认pretty-print对象正是hirb被迫去做。Theseposts解释hirb如何将几乎所有内容转换为ascii表。虽

  7. ruby - 是否可以将 IRB 提示配置为动态更改? - 2

    我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO

  8. ruby - 如何配置 Ruby Mechanize 代理以通过 Charles Web 代理工作? - 2

    我正在使用Ruby/Mechanize编写一个“自动填写表格”应用程序。它几乎可以工作。我可以使用精彩CharlesWeb代理以查看服务器和我的Firefox浏览器之间的交换。现在我想使用Charles查看服务器和我的应用程序之间的交换。Charles在端口8888上代理。假设服务器位于https://my.host.com。.一件不起作用的事情是:@agent||=Mechanize.newdo|agent|agent.set_proxy("my.host.com",8888)end这会导致Net::HTTP::Persistent::Error:...lib/net/http/pe

  9. Ruby SSL 错误 - sslv3 警报意外消息 - 2

    我正在尝试在ruby​​脚本中连接到服务器https://www.xpiron.com/schedule。但是,当我尝试连接时:require'open-uri'doc=open('https://www.xpiron.com/schedule')我收到以下错误消息:OpenSSL::SSL::SSLError:SSL_connectreturned=1errno=0state=SSLv2/v3readserverhelloA:sslv3alertunexpectedmessagefrom/usr/local/lib/ruby/1.9.1/net/http.rb:678:in`conn

  10. ruby - 如何在非 SSL 或 http 网站上使用 Stripe? - 2

    我正在使用Rails3.2.6和Stipe进行支付。是否有可能在不购买ssl证书的情况下进行付款。我可以使用Stripe页面作为我的支付页面吗? 最佳答案 您可以使用stripe.js在技术上跳过SSL但我强烈建议您设置SSL。它所做的是将信用卡信息直接传递给stripe,然后stripe会给你一个token,用于实际进行收费。这样做意味着信用卡信息永远不会接触您的服务器,您不必担心PCI合规性。但是,您仍应设置SSL以防止中间人攻击。您可以在https://stripe.com/docs/tutorials/forms找到有关如何

随机推荐