在 Debian 上配置 Kafka 的安全基线
以下清单覆盖从传输加密、身份认证、访问控制到系统加固的关键步骤,适用于常见的 Debian 部署场景。
一 基础与网络加固
- 更新系统与软件包,最小化安装,禁用不必要的内核模块与服务,仅开放必要端口(如 SSH 22、Kafka 监听器端口)。
- 使用 UFW 或 iptables 限制访问来源,仅允许受控网段访问 Kafka 端口(示例:sudo ufw allow 9093/tcp)。
- 以最小权限运行 Kafka:创建专用系统用户与组(如 kafka:kafka),数据目录与配置文件设置 chown/chmod 600/700,避免使用 root 启动。
- 将日志目录与存储目录分离,开启日志轮转,限制日志保留周期,避免敏感数据长期留存。
二 传输加密 SSL TLS
- 使用 Java keytool 生成服务器密钥库与信任库(JKS),并为 Broker 与客户端分别配置证书与信任链:
- 生成服务器密钥库:
keytool -genkey -alias kafka-server -keyalg RSA -keystore server.jks -storepass 密码 -validity 3650 -keysize 2048
- 导出服务器证书:
keytool -export -alias kafka-server -file server.crt -keystore server.jks -storepass 密码
- 生成客户端密钥库(可选,双向 TLS 时使用):
keytool -genkey -alias kafka-client -keyalg RSA -keystore client.jks -storepass 密码 -validity 3650 -keysize 2048
- 在 server.properties 启用监听器与 SSL:
- 仅加密:listeners=SSL://:9093;security.inter.broker.protocol=SSL
- 加密+认证:listeners=SASL_SSL://:9093;security.inter.broker.protocol=SASL_SSL
- 关键 SSL 参数:
- ssl.keystore.location=/path/server.jks;ssl.keystore.password=密码
- ssl.key.password=密码(若与 keystore 密码不同)
- ssl.truststore.location=/path/truststore.jks;ssl.truststore.password=密码
- ssl.enabled.protocols=TLSv1.2,TLSv1.3
- ssl.cipher.suites=TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384
- 客户端需配置相同的 security.protocol=SSL 或 SASL_SSL、信任库路径与密码,双向 TLS 时还需配置客户端密钥库。
三 身份认证 SASL
- 选择机制:推荐 SCRAM-SHA-256/512(密码不落地、可动态变更),兼容性与安全性优于 PLAIN。
- 在 server.properties 启用 SASL:
- sasl.enabled.mechanisms=SCRAM-SHA-256(可按需增加)
- sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
- 监听器与协议:listeners=SASL_SSL://:9093;security.inter.broker.protocol=SASL_SSL
- 配置 JAAS(示例为 SCRAM):/etc/kafka/kafka_server_jaas.conf
- KafkaServer {
org.apache.kafka.common.security.scram.ScramLoginModule required
username=“admin” password=“admin-secret”;
};
- 启动参数注入 JAAS(systemd 示例):
- ExecStart=/usr/bin/java … -Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf
- 客户端示例(producer/consumer 通用):
- bootstrap.servers=host:9093
- security.protocol=SASL_SSL
- sasl.mechanism=SCRAM-SHA-256
- sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username=“admin” password=“admin-secret”;
- 如需 PLAIN,将机制替换为 PLAIN 并使用相应的 JAAS 配置,但务必配合 SSL/TLS 防止明文口令泄露。
四 授权与 ACL
- 启用 ACL(基于 Principal 的访问控制),对 Topic、Group、Cluster 等资源进行细粒度授权。
- 使用 kafka-acls.sh 创建 ACL(示例):
- 允许 admin 对 test-topic 读/写:
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 \
–add --allow-principal User:admin --operation Read --operation Write --topic test-topic
- 查看 ACL:
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 \
–list --topic test-topic
- 客户端连接时指定 Principal(与 ACL 中一致),未授权操作将被拒绝。
五 高可用与周边组件安全
- 如仍使用 Zookeeper:为 Zookeeper 启用 SASL/Digest 认证,配置 JAAS、限制四字命令白名单,并仅在内网开放 2181 等必要端口。
- 自 Kafka 2.8.0 起可使用 KRaft 模式(去 Zookeeper),建议在新部署中优先采用 KRaft,减少外部依赖面。
- 持续监控与审计:开启 安全相关日志(如登录、ACL 变更),定期轮换密钥与凭据,使用配置管理工具管理密钥与证书,避免硬编码。