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,观察客户端吞吐变化。