介绍
Apache Kafka 支持多种安全协议和身份验证流程,以确保只有授权人员和应用程序才能连接到集群。在默认配置下,Kafka 允许所有人访问,但未启用任何安全检查。虽然这对于探索和开发非常有用,但在生产环境中部署时,必须进行适当的安全保护,才能将其暴露给外部网络。此外,还必须监控此类环境,以确保其平稳运行并防止潜在故障。.
在本教程中,您将通过配置 TLS 流量加密和 SASL 身份验证来增强 Kafka 安装,从而提供标准的用户名和密码登录流程。您将了解如何配置提供的生产者和消费者脚本以连接到安全集群。然后,您将学习如何导出 Kafka 指标并在 Grafana 中可视化它们。您还将学习如何通过 AKHQ 提供的易于使用的 Web 界面访问集群节点和主题。.
先决条件
- 至少需要 4GB 内存和 2 个处理器的服务器。对于 Ubuntu Server,请按照初始服务器设置说明进行操作。.
- Apache Kafka 已安装并配置在您的 Droplet 上。有关设置说明,请参阅 Kafka 入门教程。您只需完成步骤 1 和步骤 2 即可。.
- 了解 Java 如何管理密钥和证书。更多信息,请参阅 Java Keytool Essentials:使用 Java 密钥库教程。.
- Grafana 已安装在您的服务器或本地计算机上。请参阅 Ubuntu 上 Grafana 安装和安全配置教程以获取详细步骤。您只需完成前四个步骤即可。.
- 一个已完全注册的域名指向您的服务器实例。本教程通篇使用 `your_domain`,它指向 Grafana 所需的同一个域名。您可以在 Namecheap 购买域名,在 Freenom 免费获取域名,或者使用您选择的任何域名注册商。.
第一步 – 配置 Kafka 安全协议
Kafka 的默认配置允许任何人连接,而无需检查请求来源。这意味着默认情况下,所有人都可以访问您的集群。虽然这对于测试来说很有利,因为它减轻了本地机器和私有部署的维护负担,但生产环境和公共级别的 Kafka 部署应该启用安全功能,以防止未经授权的访问。.
在此步骤中,您将配置 Kafka broker,使其对 broker 和消费者之间的流量使用 TLS 加密。您还将设置 SASL 作为连接到集群时的身份验证框架。.
TLS证书生成和存储
要生成设置 TLS 所需的证书和密钥,您将使用 Confluent Platform Security Tools 存储库中提供的脚本。首先,运行以下命令将其克隆到您的主目录:
git clone https://github.com/confluentinc/confluent-platform-security-tools.git ~/kafka-ssl去吧:
cd ~/kafka-ssl您使用的脚本名为 kafka-generate-ssl-automatic.sh,它会要求您提供国家/地区、州/省、组织和城市作为环境变量。这些参数用于生成证书,但其内容并不重要。您还需要提供一个密码,该密码用于保护创建的 Java 信任和密钥库。.
要设置所需的环境变量,请运行以下命令,并将 your_tls_password 替换为您所需的值:
export COUNTRY=US
export STATE=NY
export ORGANIZATION_UNIT=SE
export CITY=New York
export PASSWORD=your_tls_password请注意,密码必须至少为六个字符。.
运行以下命令,赋予脚本可执行权限:
chmod +x kafka-generate-ssl-automatic.sh然后运行它以生成所需文件:
./kafka-generate-ssl-automatic.sh将会生成大量输出。完成后,请列出目录中的文件:
ls -l输出结果应如下所示:
Outputrw-rw-r-- 1 kafka kafka 964 May 13 09:33 README.md
-rw-rw-r-- 1 kafka kafka 1063 May 13 09:34 cert-file
-rw-rw-r-- 1 kafka kafka 1159 May 13 09:34 cert-signed
-rwxrw-r-- 1 kafka kafka 6016 May 13 09:33 kafka-generate-ssl-automatic.sh
-rwxrwxr-x 1 kafka kafka 7382 May 13 09:33 kafka-generate-ssl.sh
drwxrwxr-x 2 kafka kafka 4096 May 13 09:34 keystore
-rw-rw-r-- 1 kafka kafka 184929 May 13 09:33 single-trust-store-diagram.pages
-rw-rw-r-- 1 kafka kafka 36980 May 13 09:33 single-trust-store-diagram.pdf
drwxrwxr-x 2 kafka kafka 4096 May 13 09:34 truststore您会看到证书、信任关系和密钥库都已成功创建。.
配置 Kafka 以支持 TLS 和 SASL
现在您已经拥有启用 TLS 加密所需的必要文件,接下来您将配置 Kafka 来使用这些文件,并使用 SASL 对用户进行身份验证。.
您需要修改安装目录下 config/kraft 部分的 server.properties 文件。作为先决条件的一部分,您已将其安装在您主目录下的 Kafka 目录中。运行以下命令即可访问该文件:
cd ~/kafka打开主配置文件进行编辑:
nano config/kraft/server.properties
找出下列各行:
...
listeners=PLAINTEXT://:9092,CONTROLLER://:9093
# Name of listener used for communication between brokers.
inter.broker.listener.name=PLAINTEXT
# Listener name, hostname and port the broker will advertise to clients.
# If not set, it uses the value for "listeners".
advertised.listeners=PLAINTEXT://localhost:9092请将它们更改为以下内容,并将 PLAINTEXT 替换为 BROKER:
...
listeners=BROKER://:9092,CONTROLLER://:9093
# Name of listener used for communication between brokers.
inter.broker.listener.name=BROKER
# Listener name, hostname and port the broker will advertise to clients.
# If not set, it uses the value for "listeners".
advertised.listeners=BROKER://localhost:9092然后找到 listener.security.protocol.map 这行:
# Maps listener names to security protocols, the default is for them to be the same. See the config documentation for more details
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL将 BROKER 映射到 SASL_SSL,方法是将定义嵌入到以下值中:
# Maps listener names to security protocols, the default is for them to be the same. See the config documentation for more details
listener.security.protocol.map=BROKER:SASL_SSL,CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL在这里,您添加了在监听器中使用的 BROKER 别名定义,并将其映射到 SASL_SSL,这表明应该同时使用 SSL(TLS 的旧称)和 SASL。.
然后转到文件末尾,添加以下几行:
ssl.truststore.location=/home/kafka/kafka-ssl/truststore/kafka.truststore.jks
ssl.truststore.password=your_tls_password
ssl.keystore.location=/home/kafka/kafka-ssl/keystore/kafka.keystore.jks
ssl.keystore.password=your_tls_password
ssl.key.password=your_tls_password
ssl.client.auth=required
sasl.enabled.mechanisms=PLAIN
sasl.mechanism.controller.protocol=PLAIN
sasl.mechanism.inter.broker.protocol=PLAIN
authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer
allow.everyone.if.no.acl.found=false
super.users=User:admin首先,您需要定义已创建的信任库和密钥库的位置和密码。将 `ssl.client.auth` 参数设置为 `required`,指示 Kafka 拒绝任何未提供有效 TLS 证书的连接。然后,将 SASL 机制设置为 `PLAIN` 以启用它。`PLAIN` 与 `PLAINTEXT` 的区别在于,它需要使用加密连接,并且两者都依赖于用户名和密码组合。.
最后,将授权器类设置为 StandardAuthorizer,该类会根据您稍后创建的配置文件检查凭据。接下来,将 allow.everyone.if.no.acl.found 参数设置为 false,以限制使用不正确凭据的连接访问。此外,您还选择 admin 用户作为超级用户,因为集群上至少需要一个超级用户才能执行管理任务。.
别忘了将 your_tls_password 替换为你在上一节脚本中输入的密码,然后保存并关闭文件。.
Kafka 配置完成后,您需要创建一个文件来定义连接允许的凭据。Kafka 支持 Java 身份验证和授权服务 (JAAS),这是一个用于实现身份验证工作流的框架,并且接受 JAAS 格式的凭据定义。.
您需要将它们存储在 config/kraft 目录下的 kafka-server-jaas.conf 文件中。运行以下命令创建并打开该文件进行编辑:
nano config/kraft/kafka-server-jaas.conf添加以下几行:
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin"
user_admin="admin";
};用户名和密码指定了集群中多个节点上代理之间通信的主要凭据。user_admin 行定义了一个用户名和密码均为 admin 的用户,该用户可以从外部连接到代理。完成后,保存并关闭文件。.
Kafka 需要识别 kafka-server-jaas.conf 文件,因为它完成了主配置。您需要修改 kafka systemd 服务的配置,并传入对该文件。运行以下命令打开服务进行编辑:
sudo systemctl edit --full kafka传递 `--full` 参数将访问服务的全部内容。找到 `ExecStart` 行:
...
User=kafka
ExecStart=/bin/sh -c '/home/kafka/kafka/bin/kafka-server-start.sh /home/kafka/kafka/config/kraft/server.properties > /home/kafka/kafka/kafka.log 2>&1'
...在其上方添加以下一行,使其看起来像这样:
...
User=kafka
Environment="KAFKA_OPTS=-Djava.security.auth.login.config=/home/kafka/kafka/config/kraft/kafka-server-jaas.conf"
ExecStart=/bin/sh -c '/home/kafka/kafka/bin/kafka-server-start.sh /home/kafka/kafka/config/kraft/server.properties > /home/kafka/kafka/kafka.log 2>&1'
...这将把配置中的 `java.security.auth.login.config` 参数设置为 JAAS 配置文件的路径,使其与 Kafka 主配置分离。完成后,保存并关闭文件。运行以下命令重新加载服务定义:
sudo systemctl daemon-reload然后,重启 Kafka:
sudo systemctl restart kafka您现在已经为 Kafka 安装配置了 TLS 加密和 SASL 身份验证,现在您将学习如何使用提供的控制台脚本连接到它。.
步骤 2 – 连接到安全集群
在本步骤中,您将学习如何使用提供的控制台脚本和 JAAS 配置文件连接到安全的 Kafka 集群。.
用于操作消息生成和消费主题的脚本也在内部使用 Java,因此接受 JAAS 配置,该配置描述了信任和密钥存储的位置以及 SASL 身份验证。.
您需要将此配置保存在您主目录下的名为 client-jaas.conf 的文件中。创建并打开该文件进行编辑:
nano ~/client-jaas.conf添加以下几行:
security.protocol=SASL_SSL ssl.truststore.location=/home/kafka/kafka-ssl/truststore/kafka.truststore.jks ssl.truststore.password=your_tls_password ssl.keystore.location=/home/kafka/kafka-ssl/keystore/kafka.keystore.jks ssl.keystore.password=your_tls_password sasl.mechanism=PLAIN sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin"; ssl.endpoint.identification.algorithm=
与之前一样,您将协议设置为 SASL_SSL,并提供您创建的密钥库和信任库的路径和密码。然后,您将 SASL 机制设置为 PLAIN,并提供管理员用户的凭据。您需要显式清除 ssl.endpoint.identification.algorithm 参数以避免连接问题,因为初始脚本会将运行所在机器的主机名设置为证书端点,而这可能不正确。.
将 your_tls_password 替换为相应的值,然后保存并关闭文件。.
要将此文件传递给脚本,可以使用 `--command-config` 参数。使用以下命令在集群中创建一个新主题:
bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic new_topic --command-config ~/client-jaas.conf该命令应该能够成功运行:
Output...
Created topic new_topic.要验证它是否已创建,请运行以下命令列出集群中的所有线程:
bin/kafka-topics.sh --bootstrap-server localhost:9092 --list --command-config ~/client-jaas.conf输出结果将显示 new_topic 存在:
Output__consumer_offsets
new_topic
...在本节中,您已配置 Kafka 安装,使其使用 TLS 加密流量,并使用 SASL 通过用户名和密码组合进行身份验证。现在,您将学习如何使用 Prometheus 通过 JMX 导出各种 Kafka 指标。.
步骤 3 – 使用 Prometheus 监控 Kafka JMX 指标
在本节中,您将使用 Prometheus 收集 Kafka 指标,并将其导入 Grafana 进行查询。这需要为 Kafka 设置 JMX 导出器并将其连接到 Prometheus。.
Java 管理扩展 (JMX) 是一个 Java 应用程序框架,它允许开发人员以标准格式在运行时收集有关应用程序性能的通用和自定义指标。由于 Kafka 是用 Java 编写的,因此它支持 JMX 协议,并通过该协议公开其自定义指标,例如主题和代理的状态。.配置 Kafka 和 Prometheus
在继续之前,您需要安装 Prometheus。在 Ubuntu 系统上,您可以使用 apt 来安装其软件源,运行以下命令:
sudo apt update然后,安装 Prometheus:
sudo apt install prometheus -y其他平台请按照官方网站上的安装说明进行操作。.
安装完成后,您需要将 Prometheus 的 JMX 导出器库添加到 Kafka 安装目录中。前往版本页面,选择名称中包含“javaagent”的最新版本。撰写本文时,最新版本为 0.20.0。使用以下命令将其下载到 Kafka 安装目录下的 libs/ 目录中:
curl https://repo.maven.apache.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.20.0/jmx_prometheus_javaagent-0.20.0.jar -o ~/kafka/libs/jmx_prometheus_javaagent.jarKafka 现在将选择 JMX 导出库。.
启用导出器之前,您需要指定它将向 Prometheus 报告哪些指标,并将此配置保存在 Kafka 安装目录下的 config/ 文件夹中的 jmx-exporter.yml 文件中。JMX 导出器项目提供了一个合适的默认配置,因此请运行以下命令将其保存为 Kafka 安装目录下的 config/ 文件夹中的 jmx-exporter.yml 文件:
curl https://raw.githubusercontent.com/prometheus/jmx_exporter/main/example_configs/kafka-2_0_0.yml -o ~/kafka/config/jmx-exporter.yml接下来,您需要修改 Kafka systemd 服务以启用导出器。您需要修改 KAFKA_OPTS 环境变量,使其包含导出器及其配置。运行以下命令来编辑该服务:
sudo systemctl edit --full kafka将环境变量行更改为以下内容:
Environment="KAFKA_OPTS=-Djava.security.auth.login.config=/home/kafka/kafka/config/kraft/kafka-server-jaas.conf -javaagent:/home/kafka/kafka/libs/jmx_prometheus_javaagent.jar=7075:/home/kafka/kafka/config/jmx-exporter.yml"
在这里,您可以使用 -javaagent 参数来初始化 JMX 导出器及其配置。.
完成后,保存并关闭文件,然后运行以下命令启动 Kafka:
sudo systemctl restart kafka一分钟后,检查 JMX 导出器是否正在运行,方法是查询端口 7075 是否正在使用:
sudo ss -tunelp | grep 7075输出结果应如下所示:
Outputtcp LISTEN 0 3 *:7075 *:* users:(("java",pid=6311,fd=137)) uid:1000 ino:48151 sk:8 cgroup:/system.slice/kafka.service v6only:0 <->该行表示端口 7075 被 Kafka 服务启动的 Java 进程使用,该进程指向 JMX 导出器。.
现在您需要配置 Prometheus 来监控导出的 JMX 指标。其主配置文件位于 /etc/prometheus/prometheus.yml,请打开该文件进行编辑:
sudo nano /etc/prometheus/prometheus.yml找出下列各行:
...
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s
scrape_timeout: 5s
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
- job_name: node
# If prometheus-node-exporter is installed, grab stats about the local
# machine by default.
static_configs:
- targets: ['localhost:9100']在指定 Prometheus 应该监视哪些端点的 scrape_configs 部分中,添加一个用于抓取 Kafka 指标的新部分:
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s
scrape_timeout: 5s
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
- job_name: node
# If prometheus-node-exporter is installed, grab stats about the local
# machine by default.
static_configs:
- targets: ['localhost:9100']
- job_name: 'kafka'
static_configs:
- targets: ['your_domain:7075']Kafka 作业有一个指向 JMX 导出端点的目标。.
请记住将 `your_domain` 替换为您的域名,然后保存并关闭文件。接下来,运行以下命令启动 Prometheus:
sudo systemctl restart prometheus在浏览器中,访问您域名的 9090 端口。您将进入 Prometheus 界面。在“状态”部分,点击“目标”以列出作业:
请注意,Prometheus 已接管 Kafka 的任务并开始抓取其指标。现在您将学习如何在 Grafana 中访问这些指标。.
在 Grafana 中查询指标
作为前提条件之一,您已在 Droplet 上安装了 Grafana 并将其放置在您的域名下。在浏览器中访问 Grafana,在侧边栏的“连接”部分,点击“添加新连接”,然后在搜索字段中输入“Prometheus”。.
点击 Prometheus,然后点击右上角的“添加新数据源”按钮。系统会提示您填写 Prometheus 实例的地址:
输入 http://your_domain_name:9090,替换成您的实际域名,然后向下滚动并点击“保存并测试”。您应该会看到成功消息:
Prometheus 连接已添加到 Grafana。点击侧边栏中的“探索”,系统会提示您选择指标。您可以输入 kafka_ 来列出与集群相关的所有指标,如下所示:
例如,选择 kafka_log_log_size 指标,该指标显示每个分区中内部磁盘日志的大小,然后点击右上角的“运行查询”。您将看到每个可用主题随时间变化的日志大小:
至此,您已设置好 Kafka 提供的 JMX 导出器指标,并配置了 Prometheus 来抓取这些指标。然后,您已从 Grafana 连接到 Kafka 并执行了指标查询。接下来,您将学习如何使用 Web 界面管理 Kafka 集群。.
步骤 4 – 使用 AKHQ 管理 Kafka 集群
在本步骤中,您将学习如何设置和使用 AKHQ,这是一个用于管理 Kafka 集群的 Web 应用程序。它允许您列出和操作主题、分区、消费者组和配置参数,以及从单个位置生成和消费主题中的消息。.
您需要将可执行文件及其配置文件保存在名为 akhq 的目录中。您可以通过运行以下命令在您的用户主目录中创建该目录:
mkdir ~/akhq去吧:
cd ~/akhq在浏览器中访问官方发布页面,复制最新 JAR 文件的链接。撰写本文时,最新版本为 0.24.0。运行以下命令将其下载到您的主目录:
curl -L https://github.com/tchiotludo/akhq/releases/download/0.24.0/akhq-0.24.0-all.jar -o ~/akhq/akhq.jar您已下载 AKHQ,现在可以配置其以连接到集群。配置将保存在名为 akhq-config.yml 的文件中。运行以下命令创建并打开该文件进行编辑:
nano ~/akhq/akhq-config.yml添加以下几行:
akhq:
connections:
localhost-sasl:
properties:
bootstrap.servers: "localhost:9092"
security.protocol: SASL_SSL
sasl.mechanism: PLAIN
sasl.jaas.config: org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin";
ssl.truststore.location: /home/kafka/kafka-ssl/truststore/kafka.truststore.jks
ssl.truststore.password: secret
ssl.keystore.location: /home/kafka/kafka-ssl/keystore/kafka.keystore.jks
ssl.keystore.password: secret
ssl.key.password: secret
ssl.endpoint.identification.algorithm: ""这是一个基本的 AKHQ 配置,它指定了位于 localhost:9092 的集群,并指定了 SASL 和 TLS 参数。AKHQ 也支持同时管理多个集群,您可以根据需要定义任意数量的连接。这使得 AKHQ 非常适合 Kafka 管理。配置完成后,请保存并关闭文件。.
接下来,您需要定义一个 systemd 服务来在后台运行 AKHQ。systemd 服务可以持续地启动、停止和重启。.
您需要将服务配置存储在名为 code-server.service 的文件中,该文件位于 /lib/systemd/system 目录下,systemd 会将服务存储在该目录中。请使用文本编辑器创建该文件:
sudo nano /etc/systemd/system/akhq.service添加以下几行:
[Unit]
Description=akhq
[Service]
Type=simple
User=kafka
ExecStart=/bin/sh -c 'java -Dmicronaut.config.files=/home/kafka/akhq/akhq-config.yml -jar /home/kafka/akhq/akhq.jar'
Restart=on-abnormal
[Install]
WantedBy=multi-user.target首先,您需要指定服务描述。然后在 [Service] 字段中定义服务类型(简单表示命令将以简单方式执行),并提供要执行的命令。您还需要指定运行该服务的用户为 kafka,并且如果服务退出,则应自动重启。.
[安装] 部分指示系统在您能够登录服务器时启动此服务。完成后,保存并关闭文件。.
运行以下命令加载服务设置:
sudo systemctl daemon-reload运行以下命令启动 AKHQ 服务:
sudo systemctl start akhq然后,查看其状态以确认它是否已正确启动:
sudo systemctl status akhq输出结果应如下所示:
Output● akhq.service - akhq
Loaded: loaded (/etc/systemd/system/akhq.service; disabled; vendor preset: enabled)
Active: active (running) since Wed 2024-05-15 07:37:10 UTC; 3s ago
Main PID: 3241 (sh)
Tasks: 21 (limit: 4647)
Memory: 123.3M
CPU: 4.474s
CGroup: /system.slice/akhq.service
├─3241 /bin/sh -c "java -Dmicronaut.config.files=/home/kafka/akhq/akhq-config.yml -jar /home/kafka/akhq/akhq.jar"
└─3242 java -Dmicronaut.config.files=/home/kafka/akhq/akhq-config.yml -jar /home/kafka/akhq/akhq.jarAKHQ 现在正在后台运行。默认情况下,它显示在 8080 端口上。在浏览器中,使用相应的端口号访问您的域名即可。您将看到默认视图,其中显示了主题列表:
您可以双击表格中包含该主题的行,以查看详细信息:
AKHQ 允许您查看主题中的消息,以及分区、消费者组及其配置。您还可以使用右下角的按钮清空或复制主题。.
由于 new_topic 主题为空,请按“生成主题”按钮,这将打开用于选择新消息参数的界面:
AKHQ 会自动为您填写主题名称。在“值”字段中输入“Hello World!”,然后点击“生成”。消息将发送到 Kafka,您可以在“数据”选项卡中看到它:
由于邮件内容可能很长,AKHQ 只显示第一行。要查看完整邮件,请点击该行后面的深色区域。.
在左侧边栏中,点击“节点”即可列出集群中的代理。目前,该集群仅包含一个节点:
双击节点即可打开其配置,允许您远程更改任何设置:
修改完成后,您可以点击右下角的“更新配置”按钮应用更改。同样,您也可以访问各个主题,然后转到“配置”选项卡来查看和更改每个主题的配置。.
在本节中,您已设置好 AKHQ,这是一个 Web 应用程序,它提供了一个易于使用的界面,用于远程管理和查看 Kafka 节点和主题。它允许您在主题中生成和消费消息,并动态更新主题和节点的配置参数。.
结果
在本教程中,您通过配置 TLS 加密和 SASL 用户身份验证来保护 Kafka 安装。您还使用 Prometheus 设置了指标导出,并在 Grafana 中将其可视化。接下来,您学习了如何使用 AKHQ,这是一个用于管理 Kafka 集群的 Web 应用程序。.





















