开源WAF的建设架构说明与应急预案
字数 2808 2025-08-18 11:39:15

开源WAF建设架构与应急预案详解

一、ModSecurity WAF简介

ModSecurity是一个开源的Web应用程序防火墙(WAF)引擎,主要用于Web应用程序的入侵检测与防御。主要功能包括:

  • 实时监控、日志记录和访问控制
  • 防御OWASP TOP 10漏洞:
    • SQL注入(SQLi)
    • 跨站点脚本(XSS)
    • 本地/远程文件包含(LFI/RFI)
    • 远程执行代码(RCE)
    • PHP代码注入
    • HTTPoxy
    • Shellshock
    • 会话固定
    • 扫描程序检测
    • 元数据/错误泄漏
  • 其他防御能力:
    • GeoIP国家/地区阻止
    • XXE攻击防御
    • 命令注入防御
    • 反序列化攻击防御
    • 被动攻击防御(DDoS、CC攻击等)

二、配置环境

1. 服务器部署架构

IDC环境:

  • 主服务器:192.168.99.17
  • 备服务器:192.168.99.18
  • ELK服务器:192.168.105.18
  • 灾备措施:双机热备(keepalive VIP: 192.168.99.240)

阿里云环境:

  • 主服务器:172.19.135.151
  • 备服务器:172.19.135.152
  • ELK服务器:172.19.135.153
  • 灾备措施:SLB负载均衡
  • 映射关系:192.168.99.240:443 <=> 公网IP:443

2. 主要组件及版本

  • Nginx:1.15.5

    • 位置:/usr/local/nginx/*
    • 占用端口:80, 443
  • ModSecurity:3.0.2

    • 配置位置:/usr/local/nginx/conf/modsecurity.conf
    • 规则位置:/usr/local/nginx/conf/owasp-modsecurity-crs/rules/*.conf
    • 日志位置:/opt/modsecurity/data///*
  • Elasticsearch:5.x

    • 位置:/usr/local/elasticsearch*/* 和 /opt/elasticsearch*/*
    • 占用端口:9200
  • Logstash:5.x

    • 位置:/usr/local/logstash*/* 和 /opt/logstash*/*
    • 规则位置:/usr/local/logstash*/waf/.conf 和 /opt/logstash/waf/*.conf
  • Kibana:5.x

    • 位置:/usr/share/kibana/*
    • 配置位置:/etc/kibana/*
    • 占用端口:5601
  • Filebeat:5.x

    • 位置:/opt/filebeat*/
    • 占用端口:5044
  • elasticsearch-head

    • 位置:/opt/elasticsearch-head/*
    • 占用端口:9100

三、系统启动与配置

1. 启动顺序

  1. Nginx + ModSecurity
  2. Elasticsearch + Kibana
  3. elasticsearch-head
  4. Logstash
  5. Filebeat

2. 各组件启动方法

  • Nginx

    • 配置了service
    • 确保nginx.conf中参数:
      ModSecurityEnabled on;
      ModSecurityConfig modsecurity.conf;
      
    • 随nginx启动而启动
  • Elasticsearch

    • 使用els用户运行:
      /usr/local/elasticsearch/bin/elasticsearch
      
  • Kibana

    • 配置了service
  • Elasticsearch-head

    /opt/elasticsearch-head/node_modules/grunt/bin/grunt server
    
  • Logstash

    /usr/local/logstash/bin/logstash -f /usr/local/logstash/waf/
    

3. Kibana使用说明

访问5601端口后可进行以下操作:

  • 时间区域调整:在右上角调整时间区域显示
  • 重点模块
    • Visualize:创建数据可视化模板
    • Dashboard:展示通过Visualize创建的图形界面

四、日志分析与使用方法

1. 日志参数说明

  1. time:事件传输时间
  2. client_ip:源地址(攻击者IP)
  3. geoip.city:攻击地点
  4. geoip.region_name:攻击城市
  5. geoip.country_name:攻击国家
  6. requestHeaders.Host:攻击者访问的域名
  7. requestedUri:攻击者访问的URL
  8. responseStatus:服务器状态码
  9. httpMethod:服务器请求方法
  10. transaction.messages:匹配到的攻击规则(如为空则认定为非攻击性请求)
  11. requestHeaders.Referer:此条URL源
  12. requestBody:POST请求时的数据内容

2. 日志筛选方法

  • 可根据时间和攻击类型筛选(模板前两块)
  • 筛选阻断日志记录:
    transaction.messages:*
    

五、调试方法

ModSecurity策略调试

  1. 在msg字段中查看所属策略的策略文件
  2. 定位line查看正则匹配
  3. 更改正则至想要结果

六、性能说明与优化

  1. 性能测试结果

    • 能抗住研发部测试组的压力测试包
    • ELK经过优化可抗住压力测试包
    • 可抗住1000线程的DDoS测试包1分钟(累计数据包达10W+)
    • CPU使用率保持在10%以下
  2. 日志管理

    • 当日志达到100W条(约5G)且存在大量未分割数据(如图片)时,日志筛选会变慢甚至超时
    • 解决方案:
      • 清除过早的elasticsearch索引
      • 限制上传包大小
  3. 索引删除命令

    • 执行删除索引命令后,右侧返回true表示成功
    • 日志量过大时响应会变慢,切勿重复点击执行
    • 注意:删除为高危命令,执行前需仔细核对
  4. 空日志处理

    • 检查哪个进程挂掉并重新挂载
    • 如果仍无数据:
      • 检查各组件日志
      • 如果filebeat显示一直等待进程:
        • 删除registry文件(yum安装路径为/var/lib/filebeat/registry)
        • 重启filebeat会重新导入全部日志
        • 注意:日志量过大时需先清理或导出部分日志,否则可能导致搜索崩溃

七、应急方案

1. 应急等级划分

  • 低级应急

    • 现象:测试数据阻断,返回码403
    • 处理步骤:
      1. 手动分析数据包中传递参数是否合理
      2. 如果参数合理:
        • 寻找对应规则文件
        • 修改正则匹配或注释整体规则
      3. 如果参数不合理:
        • 与研发沟通进行报文调整
  • 中级应急

    • 现象:大量长期数据阻断,返回码403
    • 处理步骤:
      1. 切换WAF工作模式为仅检测:
        SecRuleEngine DetectionOnly
        
      2. 观察数据包是否恢复正常:
        • 如果恢复正常:按低级应急方案处理
        • 如果仍不正常:按高级应急方案处理
  • 高级应急

    • 现象:中级应急方案无效
    • 处理步骤:
      1. 手动关闭nginx安全模块:
        modsecurity off
        
      2. 确保数据正常后再进一步排查问题

八、总结与最佳实践

  1. 架构设计考虑

    • 设计使用手册和应急预案时应全面考虑架构设计问题和可能的链路问题
    • 多思考各种可能情况,做到遇事不慌
  2. 调试记录

    • 生产级开源WAF需要经常调试
    • 做好详细的调试记录可显著提高工作效率
  3. 持续优化

    • 定期检查系统性能
    • 根据实际使用情况调整规则和配置
    • 保持各组件版本更新
  4. 日志管理

    • 建立定期日志清理机制
    • 对大容量日志进行合理分割和归档
    • 确保日志分析系统的高效运行
开源WAF建设架构与应急预案详解 一、ModSecurity WAF简介 ModSecurity是一个开源的Web应用程序防火墙(WAF)引擎,主要用于Web应用程序的入侵检测与防御。主要功能包括: 实时监控、日志记录和访问控制 防御OWASP TOP 10漏洞: SQL注入(SQLi) 跨站点脚本(XSS) 本地/远程文件包含(LFI/RFI) 远程执行代码(RCE) PHP代码注入 HTTPoxy Shellshock 会话固定 扫描程序检测 元数据/错误泄漏 其他防御能力: GeoIP国家/地区阻止 XXE攻击防御 命令注入防御 反序列化攻击防御 被动攻击防御(DDoS、CC攻击等) 二、配置环境 1. 服务器部署架构 IDC环境: 主服务器:192.168.99.17 备服务器:192.168.99.18 ELK服务器:192.168.105.18 灾备措施:双机热备(keepalive VIP: 192.168.99.240) 阿里云环境: 主服务器:172.19.135.151 备服务器:172.19.135.152 ELK服务器:172.19.135.153 灾备措施:SLB负载均衡 映射关系:192.168.99.240:443 <=> 公网IP:443 2. 主要组件及版本 Nginx :1.15.5 位置:/usr/local/nginx/* 占用端口:80, 443 ModSecurity :3.0.2 配置位置:/usr/local/nginx/conf/modsecurity.conf 规则位置:/usr/local/nginx/conf/owasp-modsecurity-crs/rules/* .conf 日志位置:/opt/modsecurity/data/ / /* Elasticsearch :5.x 位置:/usr/local/elasticsearch* /* 和 /opt/elasticsearch* /* 占用端口:9200 Logstash :5.x 位置:/usr/local/logstash* /* 和 /opt/logstash* /* 规则位置:/usr/local/logstash* /waf/ .conf 和 /opt/logstash /waf/* .conf Kibana :5.x 位置:/usr/share/kibana/* 配置位置:/etc/kibana/* 占用端口:5601 Filebeat :5.x 位置:/opt/filebeat* / 占用端口:5044 elasticsearch-head 位置:/opt/elasticsearch-head/* 占用端口:9100 三、系统启动与配置 1. 启动顺序 Nginx + ModSecurity Elasticsearch + Kibana elasticsearch-head Logstash Filebeat 2. 各组件启动方法 Nginx : 配置了service 确保nginx.conf中参数: 随nginx启动而启动 Elasticsearch : 使用els用户运行: Kibana : 配置了service Elasticsearch-head : Logstash : 3. Kibana使用说明 访问5601端口后可进行以下操作: 时间区域调整 :在右上角调整时间区域显示 重点模块 : Visualize :创建数据可视化模板 Dashboard :展示通过Visualize创建的图形界面 四、日志分析与使用方法 1. 日志参数说明 time :事件传输时间 client_ ip :源地址(攻击者IP) geoip.city :攻击地点 geoip.region_ name :攻击城市 geoip.country_ name :攻击国家 requestHeaders.Host :攻击者访问的域名 requestedUri :攻击者访问的URL responseStatus :服务器状态码 httpMethod :服务器请求方法 transaction.messages :匹配到的攻击规则(如为空则认定为非攻击性请求) requestHeaders.Referer :此条URL源 requestBody :POST请求时的数据内容 2. 日志筛选方法 可根据时间和攻击类型筛选(模板前两块) 筛选阻断日志记录: 五、调试方法 ModSecurity策略调试 在msg字段中查看所属策略的策略文件 定位line查看正则匹配 更改正则至想要结果 六、性能说明与优化 性能测试结果 : 能抗住研发部测试组的压力测试包 ELK经过优化可抗住压力测试包 可抗住1000线程的DDoS测试包1分钟(累计数据包达10W+) CPU使用率保持在10%以下 日志管理 : 当日志达到100W条(约5G)且存在大量未分割数据(如图片)时,日志筛选会变慢甚至超时 解决方案: 清除过早的elasticsearch索引 限制上传包大小 索引删除命令 : 执行删除索引命令后,右侧返回true表示成功 日志量过大时响应会变慢,切勿重复点击执行 注意:删除为高危命令,执行前需仔细核对 空日志处理 : 检查哪个进程挂掉并重新挂载 如果仍无数据: 检查各组件日志 如果filebeat显示一直等待进程: 删除registry文件(yum安装路径为/var/lib/filebeat/registry) 重启filebeat会重新导入全部日志 注意:日志量过大时需先清理或导出部分日志,否则可能导致搜索崩溃 七、应急方案 1. 应急等级划分 低级应急 : 现象:测试数据阻断,返回码403 处理步骤: 手动分析数据包中传递参数是否合理 如果参数合理: 寻找对应规则文件 修改正则匹配或注释整体规则 如果参数不合理: 与研发沟通进行报文调整 中级应急 : 现象:大量长期数据阻断,返回码403 处理步骤: 切换WAF工作模式为仅检测: 观察数据包是否恢复正常: 如果恢复正常:按低级应急方案处理 如果仍不正常:按高级应急方案处理 高级应急 : 现象:中级应急方案无效 处理步骤: 手动关闭nginx安全模块: 确保数据正常后再进一步排查问题 八、总结与最佳实践 架构设计考虑 : 设计使用手册和应急预案时应全面考虑架构设计问题和可能的链路问题 多思考各种可能情况,做到遇事不慌 调试记录 : 生产级开源WAF需要经常调试 做好详细的调试记录可显著提高工作效率 持续优化 : 定期检查系统性能 根据实际使用情况调整规则和配置 保持各组件版本更新 日志管理 : 建立定期日志清理机制 对大容量日志进行合理分割和归档 确保日志分析系统的高效运行