Nginx配合ModSecurity实现WAF

随着Web应用攻击手段变得复杂,安全标准越来越高,有的场景/客户会要求应用系统自身具备防护能力,那么使用最广泛的方案可能就是利用开源WAF ModSecurity,配合Nginx有效的增强Web安全性。

环境配置

OS:Ubuntu 20.04.5
ModSecurity: V3
Nginx: 1.22.0

ModSecurity

ModSecurity 是一个Web应用程序防火墙 (WAF),并且具有一个强大的持续维护的规则库,是目前Github上一直有持续维护的WAF项目,也是应用方案最多的。目前最新的版本是V3,较此前的V2有一定的区别,使用时请注意区分版本。

1
2
3
4
5
6
7
8
9
10
11
$ apt install git g++ apt-utils autoconf automake build-essential libcurl4-openssl-dev libgeoip-dev liblmdb-dev libpcre++-dev libtool libxml2-dev libyajl-dev pkgconf wget zlib1g-dev

$ git clone https://github.com/SpiderLabs/ModSecurity
$ cd ModSecurity/
$ git submodule init
$ git submodule update

$ sh build.sh
$ ./configure
$ make
$ make install

ModSecurity v3 Nginx Connector

ModSecurity项目只提供了libmodsecurity组件库,在Nginx中应用时,需要ModSecurity v3 Nginx Connector,将libmodsecurity和Nginx连接起来。

1
$ git clone https://github.com/SpiderLabs/ModSecurity-nginx.git

Nginx

此处采用最新的Nginx Stable版本1.22.0,编译参数中加入ModSecurity v3 Nginx Connector模块,如果此前有其他的编译参数,可以通过nginx -V查看编译器版本和配置参数,make install完毕的默认目录在/usr/local/nginx/。

1
2
3
4
5
$ wget https://nginx.org/download/nginx-1.22.0.tar.gz
$ tar -xvf nginx-1.22.0.tar.gz
$ cd nginx-1.22.0
$ ./configure --add-module=/home/tmp/WorkSpace/t-waf/ModSecurity-nginx/
$ make && make install

配置规则集

下载OWASP ModSecurity 核心规则集,将规则集放置到相应的目录中。

1
2
3
4
5
6
7
8
9
10
11
12
$ wget https://github.com/coreruleset/coreruleset/archive/refs/tags/v3.3.4.tar.gz
$ tar -xvf v3.3.4.tar.gz
$ cd coreruleset-3.3.4

$ mkdir /usr/local/nginx/conf/modsecurity
$ cp crs-setup.conf.example /usr/local/nginx/conf/modsecurity/crs-setup.conf
$ cp -r rules/ /usr/local/nginx/conf/modsecurity/

$ cd /usr/local/nginx/conf/modsecurity/rules
#用于自定义规则
$ mv REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
$ mv RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf

ModSecurity配置

将ModSecurity的配置复制到相应目录,并进行修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ cd /home/tmp/WorkSpace/t-waf/ModSecurity
$ cp modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf
$ cp unicode.mapping /usr/local/nginx/conf/

$ vim /usr/local/nginx/conf/modsecurity.conf

#设置引擎开关,On/Off/Detection Only分别代表开启或关闭waf,和只检测但不进行任何阻断操作
SecRuleEngine On

#每个事务中记录到审计日志中的部分,默认ABIJDEFHZ,确保ModSecurity在记录审计日志时保存请求体IJ改为C,可用的日志审计配置:http://www.modsecurity.cn/chm/SecAuditLogParts.html
SecAuditLogParts ABCDEFHZ

#写入规则集路径
Include /usr/local/nginx/conf/modsecurity/crs-setup.conf
Include /usr/local/nginx/conf/modsecurity/rules/*.conf

# 配置审计日志输出格式为JSON,便于解析
SecAuditLogFormat JSON

# 审计日志会输出到 /var/log/modsec_audit.log,可以视磁盘情况修改路径:
# SecAuditLog /data/log/modsec_audit.log

规则启用

编辑/usr/local/nginx/conf/nginx.conf,启用ModSecurity功能,在http节点添加表示全局配置,在server节点添加表示为指定网站配置:

1
2
modsecurity on;
modsecurity_rules_file /usr/local/nginx/conf/modsecurity/modsecurity.conf;

启动Nginx服务:

1
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

功能验证

通过浏览器访问以下链接均为403 Forbidden响应。

1
2
3
4
5
http://localhost/?id=1 AND 1=1

http://localhost/.htaccess

http://localhost/?search=<scritp>alert('xss');</script>

这样就说明ModSecurity配置好了,对于WAF来说,调试、更新规则是很重要的,要关注WAF是否会对业务造成误伤,关于ModSecurity的规则介绍,可以查看:
如何打造好用的ModSecurity系列 Part 2,更多的学习资料可以在http://www.modsecurity.cn上找到。

参考

1、https://github.com/SpiderLabs/ModSecurity
2、https://github.com/SpiderLabs/ModSecurity-nginx
3、https://github.com/coreruleset/coreruleset
4、https://forum.butian.net/share/300
5、https://waf.comodo.com/user/auth

0%