0%

modsecurity+nginx组装WAF之配置防护策略

前言

刚刚我们只是完成了WAF的组装和简单测试,接下来,我们针对网站做相应的防护策略。

日志

日志存放位置:/var/log/modsec_audit.log
image.png
image.png
修改日志存储格式为json:修改配置文件/etc/nginx/modsec/modsecurity.conf
image.png
image.png

防护策略

下载规则库

1
2
root@vultr:~# git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git
root@vultr:~# cp -rf owasp-modsecurity-crs /etc/nginx/modsec

设置防护策略

1
2
3
4
5
root@vultr:~# cd /etc/nginx/modsec/owasp-modsecurity-crs
root@vultr:/etc/nginx/modsec/owasp-modsecurity-crs# mv crs-setup.conf.example crs-setup.conf
root@vultr:/etc/nginx/modsec/owasp-modsecurity-crs# cd rules
root@vultr:/etc/nginx/modsec/owasp-modsecurity-crs/rules# mv REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
root@vultr:/etc/nginx/modsec/owasp-modsecurity-crs/rules# mv RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf

修改配置文件/etc/nginx/modsec/owasp-modsecurity-crs/crs-setup.conf,将WAF改为拦截模式。参考
image.png
修改规则配置文件/etc/nginx/modsec/main.conf,注释掉测试的规则,将crs规则加载进去:

1
2
3
4
5
6
7
8
9
10
# From https://github.com/SpiderLabs/ModSecurity/blob/master/
# modsecurity.conf-recommended
#
# Edit to set SecRuleEngine On
Include "/etc/nginx/modsec/modsecurity.conf"

# Basic test rule
#SecRule ARGS:testparam "@contains test" "id:1234,deny,status:400"
Include "/etc/nginx/modsec/owasp-modsecurity-crs/crs-setup.conf"
Include "/etc/nginx/modsec/owasp-modsecurity-crs/rules/*.conf"

nginx -t检查nginx配置文件成功之后,重启Nginx服务:

1
2
nginx -s relaod
service nginx restart

测试一下,v2ray能不能正常使用

测试发现,v2ray无法使用了。检查modsecurity的日志,发现v2ray的websocket请求被拦截了(匹配到的规则编号是901001)。
image.png
于是我们要对v2ray的websocket请求设置白名单,不匹配901001这条规则。设置白名单的方法参考官方文档

解释一下:

  • 以下的id:1001是我自定义的规则编号
  • pass指的是对满足这个条件的请求放行
  • ctl:ruleRemoveById=901001是取消匹配901001这条规则
1
SecRule REQUEST_URI "@beginsWith /我的websocket路径" "id:1001,phase:1,pass,nolog,ctl:ruleRemoveById=901001"

image.png

WAF效果测试

测试方法参考

拦截SQL注入

payload:

1
root@vultr:/var/log# curl --request POST   --url https://*.com:*/   --header 'content-type: application/x-www-form-urlencoded'   --cookie dtCookie=36%24946B53A8A942C3A95C28C4CA0FD72AD2   --data 'item1=a'\'';DROP TABLE users; SELECT * FROM userinfo WHERE '\''t'\'' '

image.png

拦截命令注入攻击

payload:

1
root@vultr:/var/log# curl https://*.com:*?exec=/bin/bash

image.png
image.png

拦截XSS

payload:

1
https://*.com:*/?q=flowers+%3Cscript%3Eevil_script()%3C/script%3E

image.png
image.png

总结

现在我是开启了所有的规则,因为我不管web的细节功能,只要大概能打开就行,这个自制的WAF,目前我只在乎两点:1. v2ray的使用不能受影响;2. web页面可以打开

参考

主要是参考这篇文章
验证WAF效果的方法

-------------本文结束感谢您的阅读-------------