随着互联网技术的发展,Web应用已经成为企业和个人的重要信息资产。然而,网络攻击的频繁发生使得Web应用的安全问题日益凸显。为了保障Web应用的安全,许多企业已经开始使用Web应用防火墙(WAF)来防御各种网络攻击。其中,云WAF模式的WAF已经成为业内的主流选择,其分布式部署特点使得全网的攻击日志、访问日志进行实时聚合分析成为一个常见需求。
现有的云WAF日志处理方案通常采用中心化的方式进行日志收集和处理,但由于云WAF场景的日志具有数据量大、全国分布分散、实时性要求高等特点,往往导致处理效率低下,无法满足实时性的需求。
如图1所示为整体框架,本发明涉及的实时日志统计系统包括两个主要组件,分别是gather和broker。gather运行在每个引擎节点上,负责处理本地的安全日志和访问日志,并进行全网CC统计和带宽/QPS统计。broker运行在单独的中心服务器上,负责消费redis中的概览数据、分表汇聚并批量插入数据库等功能。
下面详细介绍gather组件功能,整体如图2所示:
gather组件运行在每个引擎节点上,与引擎共享同一个容器。
- 日志文件解析,如图3所示:
支持实时读取引擎节点的安全日志和访问日志;
支持记录读取状态,当gather重启(升级等情况)时可以恢复读取位置从而不丢失日志;
支持引擎日志切割;
支持按自定义分隔符读取每条日志(默认换行为分隔符)。
- 日志格式解析&统计:
支持并发解析每条日志;
支持按自定义分隔符或正则解析日志,获取日志各个字段, 支持去除无用字段仅保留有用字段;
支持对敏感字段进行脱敏;
支持在本地内存中缓存一定时间或者数量的日志,并批量统计上报到消息中间件(redis_cluster)。
- 全网CC攻击统计,如图4所示:
支持监听UNIX域套接字(由WAF写入),从套接字中读取最新cc配置并保存到内存中;
支持监听UDP 套接字(由WAF引擎写入),从套接字中读取cc规则匹配结果,在内存哈希表中按规则维度缓存聚合一定时间的结果;
支持将上述哈希表中缓存的批量数据写入到中心redis集群中,在中心redis里按时间进行滑窗统计;支持在redis中记录所有key在当前时间窗内统计总和,在每次刷新key记录时关联刷新时间窗总和(避免CC规则判断时每次都需要累加);
支持在往redis里插入完一条规则统计时,触发CC规则刷新流程:若超过阈值则写入WAF共享内存(若已经存在刷新访问时间避免超时清理),若小于阈值则清理WAF对应的共享内存;
写入redis中的key支持超时自动清理;写入WAF共享内存中的规则支持超时自动清理。
- 站点全网QPS/带宽统计,如图5所示:
支持监听UNIX域套接字(由WAF写入),从套接字中读取最新租户配置并保存到内存中;
支持按租户维度统计流量以及请求数,在哈希表中缓存累加一定时间的总数;
支持将上述哈希表中缓存的统计批量写入到中心redis集群中,在中心redis里按时间进行滑窗统计(默认5s时间窗,支持可配置);支持在redis中记录所有key在当前时间窗内统计总和,在每次刷新key记录时关联刷新时间窗总和(避免QPS或带宽判断时每次都需要累加);
支持在往redis里插入完一条统计时,触发租户带宽/QPS总包判断流程:若超过阈值则写入WAF共享内存(若已经存在刷新访问时间避免超时清理),若小于阈值则清理WAF对应的共享内存;
写入redis中的key支持超时自动清理;写入WAF共享内存中的规则支持超时自动清理。
下面详细介绍broker组件功能,整体如图6所示:
broker组件运行在单独的中心服务器上,方便弹性扩容,也不影响业务节点。主要负责以下功能:
支持消费消息中间件(redis_cluster)中的概览数据;
支持消费者组,支持多节点部署,不同消费者负载均衡消费消息;
支持按自定义纬度(如时间戳+用户+IP)汇聚全网节点的数据;
支持将汇聚数据在本地缓存,定期批量插入数据库;
支持定期转存并清理数据库中老旧数据。
除此之外,系统还具备资源限制、自动重启、服务监控等维护功能模块。
- 本申请相对现有技术而言,所具有的优点和效果。
本发明采用分布式的日志收集、预处理、预聚合、CC攻击统计、站点QPS/带宽限制等多个模块实现实时日志统计系统,具有数据量大、全国分布分散、实时性要求高等特点,能够实现轻量化的高效分布式云WAF日志实时统计需求。与现有技术相比,具有以下优点:。
- 高度模块化设计:gather和broker组件之间的解耦,以及两个组件内各模块间的解耦,使得系统更易于扩展和维护;
- 实时性和稳定性:通过缓存、批量插入、状态记录&恢复等机制,提高了日志处理的实时性、稳定性和高可用性;
- 通用性:通过提供通用日志解析、聚合统计功能,支持对不同类型的日志数据进行实时分析;
- 针对性:针对CC攻击,提供了相关的聚合统计与规则判断逻辑,提高了防御效果;
- 轻量级:整个系统仅引入redis作为消息中间件(相对其他MQ很轻量),其他两个模块均采用golang编写,gather和broker可以单独编译成可执行文件,方便部署和运维。
七、附图
图1:整体架构图
图2:gather整体架构图(CC和QPS除外)
图3:file_parse解析日志文件流程
图4:CC攻击统计模块
图5:站点QPS/带宽统计模块
图6:broker整体架构图