安全地使用 Docker 和 Systemctl 部署 Kafka 的综合指南

news/2024/12/20 17:09:24/

引言

在现代数据架构中,Kafka 作为一种高性能的消息队列系统,已被广泛应用于处理实时数据流。在企业级部署中,保证数据传输的安全性以及服务的稳定性变得尤为重要。本文将详细介绍如何在 Docker 环境下部署 Kafka 服务,并使用 Systemctl 进行管理,特别注重在部署过程中安全性的处理,包括密码的加密存储与日志的安全输出的完整流程

当前部署方式

当前环境使用docker docker-compose 部署raft模式的kafka三节点集群,某一个节点的docker-compose.yaml配置文件如下:


version: "3"
services:kafka:image: 'bitnami/kafka:3.7.0'network_mode: "host"ports:- '9092:9092'- '9093:9093'- '9999:9999'privileged: trueenvironment:- KAFKA_CFG_NODE_ID=0- TZ=Asia/Shanghai- KAFKA_CFG_PROCESS_ROLES=controller,broker- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@192.168.0.10:9093,1@192.168.0.13:9093,2@192.168.0.11:9093- KAFKA_KRAFT_CLUSTER_ID=metabank- KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.0.10:9092- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:SASL_PLAINTEXT,CONTROLLER:SASL_PLAINTEXT- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT- KAFKA_CLIENT_USERS=vuser- KAFKA_CLIENT_PASSWORDS=vuserpwd123- KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL=PLAIN- KAFKA_CONTROLLER_USER=vuser- KAFKA_CONTROLLER_PASSWORD=vuserpwd123- KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL=PLAIN- KAFKA_INTER_BROKER_USER=vuser- KAFKA_INTER_BROKER_PASSWORD=vuserpwd123- KAFKA_CFG_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM=- KAFKA_CFG_SASL_ENABLED_MECHANISMS=PLAIN,SCRAM-SHA-512- KAFKA_TLS_TYPE=JKS- KAFKA_JMX_ENABLED=true - KAFKA_JMX_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.rmi.port=9999 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
volumes:- ./kafka_data:/bitnami/kafka

系统服务使用**systemctl ** 管理:

[Unit]
Description=kafka Service
Requires=docker.service
After=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
User=apppub
Group=apppub
WorkingDirectory=/app/metabank/kafka
ExecStart=/usr/bin/docker-compose up -d
ExecStop=/usr/bin/docker-compose down
TimeoutStartSec=0
[Install]
WantedBy=multi-user.target

服务的启停管理使用systemctl ** start|stop|status **参数管理kafka服务

安全需求

最新需求密码不得以明文形式在任何配置文件或命令行中出现。
Kafka 的运行日志需要被安全地记录并存储。

解决方案设计

密码的加密存储和使用

考虑到安全性,我们将使用 OpenSSL 工具为 Kafka 的密码生成密钥,并进行 AES-256 加密,确保即使在配置文件被泄露的情况下,敏感信息也不会直接暴露。

生成和管理加密密钥

您应该生成一个强加密密钥,并将其存储在安全的位置。这个密钥将用于加密和解密 Kafka 配置中的密码。

mkdir /app/metabank/kafka/secrets/
openssl rand -hex 16 > /app/metabank/kafka/secrets/encryption_key
chmod 400 /app/metabank/kafka/secrets/encryption_key
chown apppub:apppub /app/metabank/kafka/secrets/encryption_key

密码加密脚本

创建一个脚本 encrypt_kafka_password.sh 来加密 Kafka 的密码:

#!/bin/bashENCRYPTION_KEY=$(cat /app/metabank/kafka/secrets/encryption_key)encrypt_password() {local password=$1echo -n "$password" | openssl enc -aes-256-cbc -base64 -pbkdf2 -salt -k "$ENCRYPTION_KEY" 2>/dev/null
}echo "Enter Kafka client password:"
read -s password
ENCRYPTED_CLIENT_PASSWORD=$(encrypt_password "$password")
echo -e "\nEnter Kafka controller password:"
read -s password
ENCRYPTED_CONTROLLER_PASSWORD=$(encrypt_password "$password")
echo -e "\nEnter Kafka broker password:"
read -s password
ENCRYPTED_BROKER_PASSWORD=$(encrypt_password "$password")# 将加密后的密码写入环境变量文件
cat > /app/metabank/kafka/secrets/kafka_passwords.env << EOF
ENCRYPTED_CLIENT_PASSWORD='${ENCRYPTED_CLIENT_PASSWORD}'
ENCRYPTED_CONTROLLER_PASSWORD='${ENCRYPTED_CONTROLLER_PASSWORD}'
ENCRYPTED_BROKER_PASSWORD='${ENCRYPTED_BROKER_PASSWORD}'
EOFecho -e "\nPasswords have been encrypted and saved to kafka_passwords.env"

该脚本读取原始密码,利用预存的密钥进行加密,并输出加密后的密码。

密码解密脚本

#!/bin/bashENCRYPTION_KEY=$(cat /app/metabank/kafka/secrets/encryption_key)decrypt_password() {local encrypted_password=$1# 移除可能的引号encrypted_password="${encrypted_password//\'/}"echo "$encrypted_password" | openssl enc -aes-256-cbc -base64 -pbkdf2 -salt -d -k "$ENCRYPTION_KEY" 2>/dev/null
}# 从环境变量文件读取加密密码
if [ -f "/app/metabank/kafka/secrets/kafka_passwords.env" ]; then# 使用 source 命令加载环境变量source /app/metabank/kafka/secrets/kafka_passwords.env# 解密并导出密码export KAFKA_CLIENT_PASSWORDS=$(decrypt_password "$ENCRYPTED_CLIENT_PASSWORD")export KAFKA_CONTROLLER_PASSWORD=$(decrypt_password "$ENCRYPTED_CONTROLLER_PASSWORD")export KAFKA_INTER_BROKER_PASSWORD=$(decrypt_password "$ENCRYPTED_BROKER_PASSWORD")# 验证解密是否成功(可选)if [ -n "$KAFKA_CLIENT_PASSWORDS" ] && [ -n "$KAFKA_CONTROLLER_PASSWORD" ] && [ -n "$KAFKA_INTER_BROKER_PASSWORD" ]; thenecho "Passwords decrypted successfully"elseecho "Error: Failed to decrypt one or more passwords"exit 1fi
elseecho "Error: kafka_passwords.env file not found"exit 1
fi

启动脚本与安全日志处理

将 Kafka 的日志输出到特定目录,并确保这些日志文件的访问权限受到严格控制。

#!/bin/bash
# start-kafka.shsource ./decrypt_kafka_passwords.sh
# 检查解密是否成功
if [ $? -ne 0 ]; thenecho "Failed to decrypt passwords"exit 1
fiexec /usr/bin/docker-compose up & 
sleep 5 
/usr/bin/docker-compose logs -f kafka >> /app/metabank/kafka/kafka_logs/kafka.log 2>&1

使用 Systemctl 管理 Kafka 服务

创建一个名为 kafka.service 的 Systemctl 单元文件,提供了 Kafka 服务的启动和停止命令,并能够让服务在系统启动时自动启动。

[Unit]
Description=kafka Service
Requires=docker.service
After=docker.service[Service]
Type=simple
User=apppub
Group=apppub
WorkingDirectory=/app/metabank/kafka
ExecStart=/bin/bash /app/metabank/kafka/start-kafka-service.sh
ExecStop=/bin/bash -c '/usr/bin/docker-compose down'
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target

其他日志切割与回收

由于我七天内的日志可能会查看,我启用了延迟压缩:

/app/metabank/kafka/kafka_logs/kafka.log {su apppub apppubdailyrotate 30            # 增大rotate值以确保能保留足够的日志dateextdateformat -%Y%m%ddelaycompress        # 延迟压缩maxage 7            # 7天后才压缩missingoknotifemptycreate 0640 apppub apppubsharedscripts
}

注意:配置文件中不能添加注释,这里只做演示,配置文件记得自己去除配置!

使用如下命令测试日志切割:

touch -d "yesterday" /app/metabank/kafka/kafka_logs/*.log
logrotate -f /etc/logrotate.d/kafka

另外journalctl中这样日志的量级会比较大,还很烦人:

我需要处理一下:

修改了kafka.service

[Unit]
Description=kafka Service
Requires=docker.service
After=docker.service[Service]
Type=simple
User=apppub
Group=apppub
WorkingDirectory=/app/metabank/kafka
ExecStart=/bin/bash /app/metabank/kafka/start-kafka-service.sh
ExecStop=/bin/bash -c '/usr/bin/docker-compose down'
Restart=always
RestartSec=10
StandardOutput=null
StandardError=null[Install]
WantedBy=multi-user.target

嗯查看了一下journalctl 总算没有那么多烦人的日志了

实施步骤

安装必要的软件:确保系统已安装 Docker、Docker Compose 和 OpenSSL。
配置 Kafka 的 Docker Compose:根据需求配置 Kafka,并注意在环境变量中使用加密密码。
创建并部署加密脚本:将 encrypt_kafka_password.sh 部署到服务器上,保证其执行权限并对密码进行加密。
配置 Systemctl 服务:部署 kafka.service 文件至 /etc/systemd/system/ 目录。
启动服务:使用 systemctl start kafka.service 启动服务。
验证:确保 Kafka 运行正常,加密脚本工作良好,且日志按预期记录。

其他可以完善的

总结

通过本教程,您可以实现一个安全、可靠的 Kafka 服务部署。通过加密关键配置和细心设计日志存储,显著提升整个系统的安全性。日常运维中,请注意定期检查和更新安全设置,修改密码,确保系统能防范新的安全威胁。


http://www.ppmy.cn/news/1556685.html

相关文章

初学stm32 --- 外部中断

目录 STM32 IO 口中断基础知识 相关库函数&#xff1a; 使用 IO 口外部中断的一般步骤 STM32 IO 口中断基础知识 STM32 的每个 IO 都可以作为外部中断的中断输入口。STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位&#xff0c;每个中断/事件都有独立…

电商数据API接口的未来趋势:智能化与自动化

在数字化时代&#xff0c;电商行业正以前所未有的速度蓬勃发展&#xff0c;成为经济增长的重要引擎。API&#xff08;应用程序编程接口&#xff09;接口作为电商领域的重要组成部分&#xff0c;其应用和发展趋势也日益受到关注。本文将深入探讨电商数据API接口的未来趋势&#…

使用k6进行kafka负载测试

1.安装环境 kafka环境 参考Docker搭建kafka环境-CSDN博客 xk6-kafka环境 ./xk6 build --with github.com/mostafa/xk6-kafkalatest 查看安装情况 2.编写脚本 test_kafka.js // Either import the module object import * as kafka from "k6/x/kafka";// Or in…

c# iis 解决跨域问题

该错误是一个典型的跨域问题&#xff0c;说明从 http://www.fuc.com 发起的请求被目标服务器&#xff08;https://aip.baidubce.com&#xff09;拒绝&#xff0c;原因是目标服务器未返回正确的 AccessControlAllowOrigin 响应头。 解决方法 1. 了解问题的本质 CORS&#xff08…

网络安全(4)_网络层安全IPSec

5. 网络层安全IPSec 5.1 IPSec协议 &#xff08;1&#xff09;前面使用Outlook进行数字签名和数字加密是应用层实现的安全。安全套接字实现的安全是在应用层和传输层之间插入了一层来实现数据通信安全。而IPSec是网络层实现的安全。不需要应用程序的支持&#xff0c;只要配置…

环境变量的知识

目录 1. 环境变量的概念 2. 命令行参数 2.1 2.2 创建 code.c 文件 2.3 对比 ./code 执行和直接 code 执行 2.4 怎么可以不带 ./ 2.4.1 把我们的二进制文件拷贝到 usr/bin 路径下&#xff0c;也不用带 ./ 了 2.4.2 把我们自己的路径添加到环境变量里 3. 认识PATH 3.…

lvs介绍和DR模式

lvs的概念 系统性能的扩展方式 集群的类型 系统的可靠性指标 lvs集群的术语 lvs负载均衡的方式 ipvsadm的操作命令 nginx调度配置 安装ipvsadm apt -y install ipvsadm 修改网卡配置 ipvsadm -A -t 12.0.0.10:80 -s rr ipvsadm -a -t 12.0.0.10:80 -r 192.168.32.62:80 -g …

Serverless集成和扩展性概述

Serverless架构的一个关键优势是其灵活性和可扩展性。开发者可以轻松集成各种第三方服务和平台,以扩展应用的功能。以下是一些关键的集成和扩展性策略: 第三方API集成:集成第三方API来增强应用功能,如支付处理、地图服务等。微服务架构:采用微服务架构来构建可扩展的Serve…