Ubuntu上Kafka安全设置实操指南
一 核心安全目标与总体架构
- 在生产环境中建议同时启用:
- 认证:优先使用SASL/SCRAM-SHA-256/512(可动态管理用户、无需重启),避免明文密码的SASL/PLAIN;高安全场景可用SASL/OAUTHBEARER或Kerberos。
- 加密:启用SSL/TLS,生产环境使用SASL_SSL或SSL;必要时开启双向认证 mTLS。
- 授权:启用ACL细粒度控制(Topic/Group/Cluster 等资源的读、写、创建等)。
- 网络与系统:仅开放必要端口(如9093/9092/2181),使用UFW/安全组做来源白名单;以非 root运行,限制配置与数据目录权限;开启审计与监控。
二 快速落地配置示例 SASL_SSL + SCRAM-SHA-512
- 前提:安装OpenJDK 11+,下载解压 Kafka(如**/opt/kafka_2.13-3.8.0**)。
- 步骤1 生成 SCRAM 用户(Broker 启动后可动态新增,无需重启)
- 示例创建管理员与业务用户(迭代次数建议≥8192):
- bin/kafka-configs.sh --bootstrap-server localhost:9093 --alter --add-config “SCRAM-SHA-256=[iterations=8192,password=AdminPass]” --entity-type users --entity-name admin
- bin/kafka-configs.sh --bootstrap-server localhost:9093 --alter --add-config “SCRAM-SHA-256=[iterations=8192,password=AppPass]” --entity-type users --entity-name app
- 步骤2 配置 server.properties(仅保留安全监听器)
- listeners=SASL_SSL://0.0.0.0:9093
- advertised.listeners=SASL_SSL://<broker_public_ip_or_fqdn>:9093
- inter.broker.listener.name=SASL_SSL
- security.inter.broker.protocol=SASL_SSL
- sasl.enabled.mechanisms=SCRAM-SHA-256
- sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
- 可选(按监听器设置 JAAS,避免全局明文 JAAS):
- listener.name.sasl_ssl.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username=“admin” password=“AdminPass”;
- 步骤3 启动参数加载 JAAS(若未使用“按监听器”JAAS)
- 在 kafka-server-start.sh 顶部加入:export KAFKA_OPTS=“-Djava.security.auth.login.config=/opt/kafka_2.13-3.8.0/config/kafka_server_jaas.conf”
- 步骤4 生成证书并配置 SSL(示例自签 CA,生产建议企业 CA)
- 生成 CA:
- mkdir -p config/certificates && cd config/certificates
- openssl req -newkey rsa:2048 -nodes -keyout ca-key.pem -out ca-cert.pem -x509 -days 3650
- 生成 Broker 证书并签发:
- openssl req -newkey rsa:2048 -nodes -keyout broker-key.pem -out broker-req.pem -subj “/CN=localhost”
- openssl x509 -req -in broker-req.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out broker-cert.pem -days 3650
- 导入到 JKS(Broker 信任 CA;客户端需信任 Broker 证书):
- keytool -import -alias ca -file ca-cert.pem -keystore truststore.jks -storepass changeit -noprompt
- openssl pkcs12 -export -in broker-cert.pem -inkey broker-key.pem -out broker.p12 -name kafka -CAfile ca-cert.pem -caname root -password pass:changeit
- keytool -importkeystore -deststorepass changeit -destkeypass changeit -destkeystore keystore.jks -srckeystore broker.p12 -srcstoretype PKCS12 -srcstorepass changeit -alias kafka
- server.properties 增加 SSL 项:
- ssl.keystore.location=config/certificates/keystore.jks
- ssl.keystore.password=changeit
- ssl.key.password=changeit
- ssl.truststore.location=config/certificates/truststore.jks
- ssl.truststore.password=changeit
- ssl.client.auth=required(开启 mTLS;如仅服务端校验可设为 requested)
- ssl.enabled.protocols=TLSv1.2,TLSv1.3
- 步骤5 客户端配置(producer.properties/consumer.properties)
- security.protocol=SASL_SSL
- sasl.mechanism=SCRAM-SHA-256
- ssl.truststore.location=config/certificates/truststore.jks
- ssl.truststore.password=changeit
-
mTLS 时增加:
- ssl.keystore.location=config/certificates/client-keystore.jks
- ssl.keystore.password=changeit
- ssl.key.password=changeit
- sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username=“app” password=“AppPass”;
- 步骤6 创建测试 Topic 与 ACL
- bin/kafka-topics.sh --create --bootstrap-server localhost:9093 --replication-factor 1 --partitions 1 --topic test_topic
- bin/kafka-acls.sh --bootstrap-server localhost:9093 --add --allow-principal User:app --operation Read --operation Write --topic test_topic
- 步骤7 验证
- 生产消息:bin/kafka-console-producer.sh --bootstrap-server <SASL_SSL_ADDR>:9093 --topic test_topic --producer.config config/producer.properties
- 消费消息:bin/kafka-console-consumer.sh --bootstrap-server <SASL_SSL_ADDR>:9093 --topic test_topic --from-beginning --consumer.config config/consumer.properties
- 未授权用户应被拒绝;必要时用 tcpdump 确认链路加密。
三 防火墙与系统加固
- 防火墙最小化开放:仅放通9093(SASL_SSL),必要时放通2181(ZooKeeper,建议内网隔离)。
- sudo ufw allow 9093/tcp
- sudo ufw enable
- 以非 root运行 Kafka,目录权限最小化:
- sudo useradd -r -m -d /opt/kafka_2.13-3.8.0 -s /sbin/nologin kafka
- sudo chown -R kafka:kafka /opt/kafka_2.13-3.8.0
- sudo chmod -R 750 /opt/kafka_2.13-3.8.0/config /opt/kafka_2.13-3.8.0/data
- 禁用明文端口:生产环境不要保留PLAINTEXT监听,仅保留SASL_SSL/SSL。
四 可选认证与扩展
- SASL/PLAIN:实现简单,但密码在配置中明文存储,务必仅与TLS一起使用;适合测试或配合外部回调/凭据管理。
- SASL/OAUTHBEARER:适配OAuth 2.0生态,适合与现有身份体系集成;默认实现仅用于非生产,生产需接入有效 Token 服务。
- Kerberos(GSSAPI):适用于企业统一认证(AD/LDAP),集成复杂度较高,安全性强。
五 证书与 ACL 运维要点
- 证书管理:
- 使用企业 CA签发证书;定期轮换(建议周期≤365天);妥善管控keystore/truststore口令;公网或自签 CA 场景,客户端可能需要将ssl.endpoint.identification.algorithm=(置空)以关闭主机名校验(仅测试或受控网络)。
- ACL 最佳实践:
- 遵循最小权限原则;按应用/团队/环境分主体(如User:app、User:monitor);定期审计与回收无用权限;对Cluster与Topic分别授权。
- 监控与审计:
- 关注失败认证、ACL 变更、异常连接等指标与日志;结合SIEM进行告警;证书轮换、ACL 调整先在测试环境验证再上线。