CentOS 下 Kafka 安全配置指南
一 安全目标与总体架构
- 启用传输加密:优先使用 SSL/TLS 加密客户端与 Broker、以及 Broker 之间的通信,禁用明文 PLAINTEXT。
- 启用身份认证:使用 SASL 机制,推荐 SCRAM-SHA-256/512;如为内网且临时过渡可用 SASL/PLAIN,但必须与 TLS 同时使用。
- 网络与系统加固:仅开放必要端口(如 9093/9094),使用 firewalld 管理规则;Broker 与客户端配置最小权限与凭据隔离。
- 版本建议:生产环境建议使用 Kafka 3.x 与 Java 11+,以获得更好的安全特性与修复。
二 生成证书与密钥库
- 准备目录与权限:证书与密钥库建议统一放在 /etc/kafka/certs,权限 600,属主 kafka:kafka。
- 生成 Broker 密钥库(JKS):
keytool -genkey -alias kafka-server -keyalg RSA -keystore /etc/kafka/certs/kafka.server.keystore.jks -storepass YourKeystorePass -validity 365 -keysize 2048 -dname “CN=your.broker.hostname”
- 导出并分发证书:
keytool -export -alias kafka-server -file /etc/kafka/certs/kafka.server.crt -keystore /etc/kafka/certs/kafka.server.keystore.jks -storepass YourKeystorePass
- 生成客户端信任库并导入 Broker 证书:
keytool -import -alias kafka-server -file /etc/kafka/certs/kafka.server.crt -keystore /etc/kafka/certs/kafka.client.truststore.jks -storepass YourTruststorePass -noprompt
- 说明:自签名证书便于起步;生产建议使用 企业 CA/PKI 签发证书,并在所有 Broker 与客户端导入根/中间 CA 证书。
三 服务端配置 server.properties
- 推荐同时启用加密与认证(SASL_SSL):
listeners=SASL_SSL://:9093
advertised.listeners=SASL_SSL://your.broker.fqdn:9093
security.inter.broker.protocol=SASL_SSL
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512
sasl.enabled.mechanisms=SCRAM-SHA-512
listener.name.sasl_ssl.scram-sha-512.sasl.jaas.config=file:/etc/kafka/jaas/kafka_server_jaas.conf
SSL 参数
ssl.keystore.location=/etc/kafka/certs/kafka.server.keystore.jks
ssl.keystore.password=YourKeystorePass
ssl.key.password=YourKeyPass
ssl.truststore.location=/etc/kafka/certs/kafka.server.truststore.jks
ssl.truststore.password=YourTruststorePass
ssl.client.auth=required
ssl.enabled.protocols=TLSv1.2,TLSv1.3
ssl.cipher.suites=TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- 如暂无法启用 TLS,可先用 SASL_PLAINTEXT(仅内网):
listeners=SASL_PLAINTEXT://:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN
listener.name.sasl_plaintext.plain.sasl.jaas.config=file:/etc/kafka/jaas/kafka_server_jaas.conf
- 说明:SASL/PLAIN 明文凭据必须叠加 TLS;SCRAM 支持动态用户管理,更适合生产。
四 JAAS 与用户管理
- 服务端 JAAS(/etc/kafka/jaas/kafka_server_jaas.conf):
KafkaServer {
org.apache.kafka.common.security.scram.ScramLoginModule required
username=“admin”
password=“AdminSecret”
user_admin=“AdminSecret”
user_producer=“ProducerSecret”
user_consumer=“ConsumerSecret”;
};
- 启动加载 JAAS(systemd 示例,Environment 或 EnvironmentFile 均可):
Environment=“KAFKA_OPTS=-Djava.security.auth.login.config=/etc/kafka/jaas/kafka_server_jaas.conf”
- 创建 SCRAM 用户(Kafka ≥ 2.6 推荐用 --bootstrap-server):
kafka-configs.sh --bootstrap-server localhost:9093 --alter --add-config ‘SCRAM-SHA-512=[password=ProducerSecret]’ --entity-type users --entity-name producer
kafka-configs.sh --bootstrap-server localhost:9093 --alter --add-config ‘SCRAM-SHA-512=[password=ConsumerSecret]’ --entity-type users --entity-name consumer
- 验证用户:
kafka-configs.sh --bootstrap-server localhost:9093 --describe --entity-type users --entity-name producer
- 说明:SCRAM 用户可在不重启 Broker 的情况下增删改;PLAIN 需在 JAAS 中预置用户。
五 客户端配置与连通性测试
- 客户端 JAAS(/etc/kafka/jaas/kafka_client_jaas.conf):
KafkaClient {
org.apache.kafka.common.security.scram.ScramLoginModule required
username=“producer”
password=“ProducerSecret”;
};
- 生产端示例(–command-config 指向客户端配置文件):
cat > /etc/kafka/client-producer.properties <<EOF
security.protocol=SASL_SSL
sasl.mechanism=SCRAM-SHA-512
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username=“producer” password=“ProducerSecret”;
ssl.truststore.location=/etc/kafka/certs/kafka.client.truststore.jks
ssl.truststore.password=YourTruststorePass
EOF
kafka-console-producer.sh --bootstrap-server your.broker.fqdn:9093 --topic test-topic --producer.config /etc/kafka/client-producer.properties
- 消费端示例:
cat > /etc/kafka/client-consumer.properties <<EOF
security.protocol=SASL_SSL
sasl.mechanism=SCRAM-SHA-512
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username=“consumer” password=“ConsumerSecret”;
ssl.truststore.location=/etc/kafka/certs/kafka.client.truststore.jks
ssl.truststore.password=YourTruststorePass
group.id=test-group
EOF
kafka-console-consumer.sh --bootstrap-server your.broker.fqdn:9093 --topic test-topic --from-beginning --consumer.config /etc/kafka/client-consumer.properties
- 说明:若服务端开启 ssl.client.auth=required,客户端需提供有效证书或信任服务端证书;命令行的 sasl.jaas.config 仅示例,生产建议用文件方式加载。
六 防火墙 服务与运维要点
- 防火墙放行端口:
firewall-cmd --permanent --zone=public --add-port=9093/tcp
firewall-cmd --reload
- systemd 服务示例(/etc/systemd/system/kafka.service):
[Unit]
Description=Apache Kafka
After=network.target zookeeper.service
[Service]
Type=simple
User=kafka
Group=kafka
Environment=“KAFKA_OPTS=-Djava.security.auth.login.config=/etc/kafka/jaas/kafka_server_jaas.conf”
ExecStart=/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties
ExecStop=/opt/kafka/bin/kafka-server-stop.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
- 运维要点:
- 证书轮换:更新 keystore/truststore 后滚动重启 Broker;
- 权限控制:结合 ACL 限制 Topic/Group/Cluster 操作;
- 监控与告警:关注 UnderReplicatedPartitions、请求耗时、认证失败日志;
- 版本与依赖:保持 Kafka 与依赖组件 的安全补丁更新。