之前有在体系建设中写到开源WAF的利用,本次就继续这个话题给出使用手册+应急预案来做生产级开源WAF的支撑。
一.ModSecurity——WAF简介
ModSecurity是一个入侵探测与阻止的引擎,它主要是用于Web应用程序所以也可以叫做Web应用程序防火墙。
ModSecurity是实时web应用程序工具包监控、日志记录和访问控制。
防御内容:(OWASP TOP 10漏洞可防御)
SQL注入(SQLi)
跨站点脚本(XSS)
本地文件包含(LFI)
远程文件包含(RFI)
远程执行代码(RCE)
PHP代码注入
HTTPoxy
Shellshock
会话固定
扫描程序检测
元数据/错误泄漏
GeoIP国家/ 地区阻止
经测试同时可防御XXE、命令注入、反序列化等多种主动攻击
同时被动攻击亦可防御(DDoS、CC攻击等)
二.配置环境
1.服务器位置
真实IP:
IDC:
192.168.99.17(主)、192.168.99.18(备)、192.168.105.18(ELK)
阿里云:
172.19.135.151(主)、172.19.135.152(备)、172.19.135.153(ELK)
灾备措施:
IDC:
双机热备(keepalive VIP: 192.168.99.240)
阿里云:
SLB
映射IP:公网IP(脱敏)
对应映射关系: 192.168.99.240:443<=>公网IP(脱敏):443
2.主体搭建配合
Nginx+Mod_Security+elasticsearch+logstash+kibana+java1.8+elasticsearch-head
Nginx
版本:1.15.5
位置:/usr/local/nginx/*
目前占用端口:80 443
Mod_Security
版本:V3(目前为3.0.2)
配置位置:/usr/local/nginx/conf/modsecurity.conf
规则位置:/usr/local/nginx/conf/owasp-modsecurity-crs/rules/*.conf
日志位置:/opt/modsecurity/data/*/*/*
Elasticsearch
版本:5
位置: /usr/local/elasticsearch*/*
/opt/elasticsearch*/*
目前占用端口:9200
Logstash
版本:5
位置: /usr/local/logstash*/*
/opt/logstash*/*
规则位置: /usr/local/logstash*/waf/*.conf
/opt/logstash*/waf/*.conf
Kibana
版本:5
位置:/usr/share/kibana/*
配置位置:/etc/kibana/*
目前占用端口:5601
Filebeat
版本:5
位置:/opt/filebeat*/
目前占用端口:5044
elasticsearch-head
位置:/opt/elasticsearch-head/*
目前占用端口:9100
3.启用方法
启用顺序:
Nginx+Mod_Security=>elasticsearch+kibana=>elasticsearch-head=>logstash=>filebeat
Nginx
配置了service
Mod_Security
在nginx.conf中确定参数ModSecurityEnabled为on
在nginx.conf中确定参数ModSecurityConfig为modsecurity.conf
随nginx启动而启动
Elasticsearch
使用els用户运行elasticsearch
/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/
全部启动后访问5601端口
可在右上角调整时间区域显示
在最左侧有两个模块将重点讲解:visualize、dashboard
Visualize:创建模板
可根据数据创建以下图形界面
Dashboard:展示模板
将数据通过创建的图形展示出来
4.使用方法
可根据日期进行筛选数据内容,具体会得到如下图展示
详细解释参数:
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时的数据内容
筛选只能根据时间与攻击类型筛选(模板前两块)
筛选有阻断判断的日志记录
transaction.messages:*
5.调试方法
此说明仅针对Mod_Security策略调试
在msg字段中查看查看所属策略的策略文件,定位line查看正则匹配,更改正则至想要结果
6.性能说明
a.测试正常打包压测没有问题,WAF本身能抗住研发部测试组的压力测试包,ELK经过优化同样可以抗住压力测试包,经过个人DDoS测试能抗住1000线程的测试包1min,累计数据包达到10W多个(测试工具崩溃,WAF无碍,CPU在10%以下)。
b.日志大约达到100W条(约5G左右)并且存在大量长数据未分割(多为图片)日志筛选会异常慢,以至于出现timeout的情况。在日志量达到瓶颈之前应清除过早前的elasticsearch的索引以保证日志查询正常,命令如下:
或限制上传包大小。
右侧返回true为删除成功,如日志量过大,反应会相对慢,切勿重复点击执行,否则会导致删除失效(注:删除为高危命令,执行前需仔细核对)。
c.如出现空日志情况,核对哪个进程挂了,重新挂载,如果还没有数据,查看各个日志,如果filebeat显示一直等待进程,则删除registry文件(yum安装路径为/var/lib/filebeat/registry),重新启动filebeat会将全部日志导入(注:如日志量过大,需将日志进行清理或导出,过后再导入,否则全部日志导入将使搜索崩溃)。
d.待补充
7.应急方案
应急等级分为高中低三个等级
低级:
一般为测试数据阻断,返回码为403,手动分析数据包中传递参数是否合理,若合理则寻找对应规则文件进行正则匹配修改或整体规则注释;若不合理则沟通研发进行报文调整
中级:
一般为大量长期数据阻断,返回码为403,先手工切换WAF工作模式为仅检测(modsecurity.conf->SecRuleEngine DetectionOnly),观察数据包是否恢复正常,若恢复正常,后续按照低级应急方案处理,若依旧不正常,则按照高级应急方案处理
高级:
一般为中级应急方案无效,则手动切换nginx安全模块为关闭状态(nginx.conf->modsecurity off),保证数据正常的情况下再进一步排查问题
总结
在出使用手册+应急预案时应当注意多考虑架构的设计问题以及可能发生的链路问题。想的全面一些,才能遇事不慌。生产级开源WAF需要经常调试,做好调试记录会让工作事倍功半
*本文原创作者:煜阳yuyang,本文属于FreeBuf原创奖励计划,未经许可禁止转载