温馨提示×

kafka在ubuntu如何保障安全

小樊
36
2025-12-19 06:48:48
栏目: 智能运维

在 Ubuntu 上保障 Kafka 安全的实用方案

一 安全架构与最小原则

  • 采用“加密传输 + 强认证 + 细粒度授权 + 网络最小暴露”的组合:优先使用 SASL/SCRAMSASL/SSL 做认证,配合 ACL 做授权,仅开放必要端口,并限制来源网段与访问主体。
  • 如仍使用 Zookeeper,建议为其启用 SASL,避免明文凭据在内部网络裸奔;Kafka 与客户端、以及 Broker 之间的通信都走认证通道。
  • Kafka 2.8 起可禁用 PLAINTEXT 端口,仅保留 SASL/SSL,显著降低误用风险。

二 传输加密与认证配置

  • 方案A SASL/SCRAM(推荐,动态用户管理)
    • 生成 JAAS 配置(示例:/opt/kafka/conf/kafka_server_jaas.conf)
      KafkaServer {
        org.apache.kafka.common.security.scram.ScramLoginModule required
        username="admin"
        password="Admin@Sec2025"
        user_admin="Admin@Sec2025"
        user_producer="Prod@Sec2025"
        user_consumer="Cons@Sec2025";
      };
      
    • server.properties 关键项
      listeners=SASL_PLAINTEXT://:9092
      advertised.listeners=SASL_PLAINTEXT://<your-hostname-or-ip>:9092
      security.inter.broker.protocol=SASL_PLAINTEXT
      sasl.enabled.mechanisms=SCRAM-SHA-256
      sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
      listener.name.sasl_plaintext.scram-sha-256.sasl.jaas.config=file:/opt/kafka/conf/kafka_server_jaas.conf
      
    • 创建 SCRAM 用户(Kafka 2.x 使用 Zookeeper;Kafka 3.x 使用 --bootstrap-server)
      # Kafka 2.x
      bin/kafka-configs.sh --zookeeper localhost:2181 --alter \
        --add-config 'SCRAM-SHA-256=[password=Prod@Sec2025]' --entity-type users --entity-name producer
      bin/kafka-configs.sh --zookeeper localhost:2181 --alter \
        --add-config 'SCRAM-SHA-256=[password=Cons@Sec2025]' --entity-type users --entity-name consumer
      
      # Kafka 3.x
      bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter \
        --add-config 'SCRAM-SHA-256=[password=Prod@Sec2025]' --entity-type users --entity-name producer
      bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter \
        --add-config 'SCRAM-SHA-256=[password=Cons@Sec2025]' --entity-type users --entity-name consumer
      
    • 客户端示例(生产/消费)
      bin/kafka-console-producer.sh --bootstrap-server <host>:9092 --topic test-topic \
        --producer-property security.protocol=SASL_PLAINTEXT \
        --producer-property sasl.mechanism=SCRAM-SHA-256 \
        --producer-property sasl.jaas.config='org.apache.kafka.common.security.scram.ScramLoginModule required username="producer" password="Prod@Sec2025";'
      
      bin/kafka-console-consumer.sh --bootstrap-server <host>:9092 --topic test-topic \
        --from-beginning \
        --consumer-property security.protocol=SASL_PLAINTEXT \
        --consumer-property sasl.mechanism=SCRAM-SHA-256 \
        --consumer-property sasl.jaas.config='org.apache.kafka.common.security.scram.ScramLoginModule required username="consumer" password="Cons@Sec2025";'
      
  • 方案B SSL/TLS 加密(与 SASL 组合为 SASL_SSL 更佳)
    • 生成密钥库与信任库(JKS,示例)
      keytool -genkey -alias kafka -keyalg RSA -keystore kafka.server.keystore.jks -validity 3650
      keytool -export  -alias kafka -file kafka.server.crt -keystore kafka.server.keystore.jks
      keytool -import  -alias kafka -file kafka.server.crt -keystore kafka.client.truststore.jks
      
    • server.properties 关键项(与 SASL 组合)
      listeners=SASL_SSL://:9093
      advertised.listeners=SASL_SSL://<your-hostname-or-ip>:9093
      security.inter.broker.protocol=SASL_SSL
      sasl.enabled.mechanisms=SCRAM-SHA-256
      sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
      listener.name.sasl_ssl.scram-sha-256.sasl.jaas.config=file:/opt/kafka/conf/kafka_server_jaas.conf
      
      ssl.keystore.location=/opt/kafka/security/kafka.server.keystore.jks
      ssl.keystore.password=<keystore-pass>
      ssl.key.password=<key-pass>
      ssl.truststore.location=/opt/kafka/security/kafka.client.truststore.jks
      ssl.truststore.password=<truststore-pass>
      
    • 客户端需设置:security.protocol=SASL_SSL、sasl.mechanism=SCRAM-SHA-256 与对应 JAAS/用户名密码。

三 授权与访问控制

  • 启用 ACL(示例)
    # 创建主题
    bin/kafka-topics.sh --create --topic sensitive-data --bootstrap-server <host>:9092 --partitions 3 --replication-factor 1
    
    # 授予生产者写权限(Kafka 2.x 使用 --zookeeper;3.x 使用 --bootstrap-server)
    bin/kafka-acls.sh --bootstrap-server <host>:9092 --add --allow-principal User:producer \
      --operation Write --operation Create --topic sensitive-data
    
    # 授予消费者组读权限
    bin/kafka-acls.sh --bootstrap-server <host>:9092 --add --allow-principal User:consumer \
      --operation Read --operation Describe --group console-consumer
    
    # 查看 ACL
    bin/kafka-acls.sh --bootstrap-server <host>:9092 --list --topic sensitive-data
    
  • 原则:按“最小权限”分配,区分 Topic/Group/Cluster 操作,定期审计 ACL 变更。

四 网络安全与系统加固

  • 防火墙与网络分段
    • 仅开放必要端口(如 9092/9093),并限制来源网段;在云环境配合 安全组/VPC 做白名单。
      sudo ufw allow from <app-subnet> to any port 9093 proto tcp
      sudo ufw deny 9092/tcp   # 禁用明文端口
      sudo ufw enable && sudo ufw status verbose
      
  • 操作系统与进程安全
    • 非 root专用用户运行 Kafka,限制目录权限(如 log.dirs、配置目录仅属 kafka:kafka)。
    • 开启 日志审计(访问日志、错误日志),并接入 SIEM 进行实时监控与告警。
    • 定期更新补丁与依赖,设置 资源限制(如 systemd 的 CPU/内存/文件句柄),并进行定期备份

五 快速核查清单

  • 已禁用 PLAINTEXT,仅开放 SASL_PLAINTEXT/SASL_SSL 端口,来源 IP 白名单受控。
  • 使用 SCRAM-SHA-256Kerberos,凭据集中管理,支持动态新增用户(SCRAM)。
  • ACL 已按 Topic/Group/Cluster 粒度配置,并定期审计。
  • Zookeeper 已启用 SASL,内部通信不再明文。
  • JKS 证书与密码受控,证书轮换流程已就位;客户端信任链正确。
  • UFW/安全组 最小化放行,系统用户与目录权限最小化,日志与监控告警正常。

0