10.8.6 常见安全风险与防护措施

常见安全风险与防护措施#

原理草图:风险面与防护闭环

文章图片

1) 明文传输与中间人攻击#

防护示例:强制SSL + 禁用明文SASL

# /etc/kafka/server.properties
listeners=SSL://0.0.0.0:9093
advertised.listeners=SSL://kafka-1:9093
security.inter.broker.protocol=SSL

ssl.keystore.location=/etc/kafka/pki/broker.keystore.jks
ssl.keystore.password=changeit
ssl.truststore.location=/etc/kafka/pki/broker.truststore.jks
ssl.truststore.password=changeit
ssl.client.auth=required

命令解释与验证

# 1) 检查9093端口是否仅SSL
ss -lntp | grep 9093

# 2) 用openssl验证证书链与主机名
openssl s_client -connect kafka-1:9093 -servername kafka-1 -showcerts

# 3) 预期:显示服务器证书,握手成功(Verify return code: 0)

排错要点
- 若握手失败:检查 advertised.listeners 主机名与证书 CN/SAN 是否一致。
- 若客户端报错 SSLHandshakeException:确认 truststore 是否包含CA证书。


2) 弱口令与默认账号滥用#

防护示例:SASL/SCRAM + 强口令轮换

# 创建SCRAM用户(需要先开启authorizer与SASL)
/opt/kafka/bin/kafka-configs.sh \
  --bootstrap-server kafka-1:9093 \
  --alter --add-config 'SCRAM-SHA-512=[password=Str0ngP@ssw0rd]' \
  --entity-type users --entity-name app_user

命令解释
- --entity-type users 指定用户实体
- SCRAM-SHA-512 强哈希认证方式

排错要点
- 认证失败时查看 broker 日志中 Failed authentication 详细原因。


3) ACL配置不当导致越权#

防护示例:最小权限授权

# 仅允许app_user写入topic=order
/opt/kafka/bin/kafka-acls.sh \
  --bootstrap-server kafka-1:9093 \
  --add --allow-principal User:app_user \
  --operation Write --topic order

# 仅允许app_user消费group=order_cg
/opt/kafka/bin/kafka-acls.sh \
  --bootstrap-server kafka-1:9093 \
  --add --allow-principal User:app_user \
  --operation Read --group order_cg

排错要点
- TopicAuthorizationException:检查topic与group授权是否匹配。
- 使用 --list 审计:

/opt/kafka/bin/kafka-acls.sh --bootstrap-server kafka-1:9093 --list

4) Broker与ZK/KRaft暴露公网#

防护示例:防火墙限制端口

# 仅允许内网网段访问Kafka
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" \
source address="10.0.0.0/16" port protocol="tcp" port="9093" accept'
firewall-cmd --permanent --add-port=9092/tcp --remove-port=9092/tcp
firewall-cmd --reload

# 验证规则
firewall-cmd --list-all

5) 配置泄露与敏感信息明文存储#

防护示例:限制配置文件权限

chown kafka:kafka /etc/kafka/server.properties
chmod 600 /etc/kafka/server.properties

排错要点
- 权限过严导致服务无法读取:检查运行用户与权限匹配。


6) 日志与审计缺失#

防护示例:开启授权审计日志

# /etc/kafka/server.properties
authorizer.class.name=kafka.security.authorizer.AclAuthorizer
allow.everyone.if.no.acl.found=false
# 观察授权审计日志(不同发行版路径可能不同)
tail -f /var/log/kafka/server.log | grep -i "authorized"

7) 依赖组件漏洞(Kafka/JDK)#

防护示例:版本升级前检查

# 查看Kafka与JDK版本
/opt/kafka/bin/kafka-topics.sh --version
java -version

# 通过包管理器升级JDK(示例:Rocky/Alma)
dnf update -y java-11-openjdk

排错要点
- 升级后启动失败:检查 JVM 参数与旧版本兼容性。


8) 资源滥用与拒绝服务#

防护示例:启用配额

# /etc/kafka/server.properties
quota.producer.default=1048576   # 1MB/s
quota.consumer.default=2097152   # 2MB/s
# 动态配置某用户配额
/opt/kafka/bin/kafka-configs.sh \
  --bootstrap-server kafka-1:9093 \
  --alter --add-config 'producer_byte_rate=524288' \
  --entity-type users --entity-name app_user

9) 数据滞留与合规风险#

防护示例:保留策略与加密存储

# /etc/kafka/server.properties
log.retention.hours=72
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000

10) 备份与容灾薄弱#

防护示例:副本与跨机架

# /etc/kafka/server.properties
default.replication.factor=3
min.insync.replicas=2

安装与实践建议(安全组件)#

示例:安装OpenSSL与生成自签CA

# 安装openssl
dnf install -y openssl

# 生成CA
openssl req -x509 -newkey rsa:4096 -nodes -keyout ca.key -out ca.crt -days 365

预期:得到 ca.crt/ca.key 用于签发Broker/客户端证书。


快速排错清单#

  • 连接失败openssl s_client 检查证书链与主机名。
  • 无权限kafka-acls.sh --list 检查ACL。
  • 认证失败:检查用户是否存在及SCRAM密码是否更新。
  • 吞吐异常:查看配额是否触发,检查 broker 日志中的 Quota 关键字。

练习#

1) 为 topic=order 创建写权限用户并验证只写不读。
2) 配置SSL监听端口并用 openssl s_client 验证证书链。
3) 限制某用户生产速率为 512KB/s,观察客户端吞吐变化。