modsecurity是一个国外的开源WAF,前身只支持Apache,后来因为各种因素也开始支持Nginx了,但v2版本一直以来饱受诟病的是性能问题,高性能的Nginx配上了modsecurity v2就变成了低性能。。
modsecurity v3的诞生解决了v2的性能问题,同时还有一些别的更新,这篇文章记录一下在Debian10上把modsecurity v3加载到APT安装的Nginx内。
安装所需依赖:
apt -y install build-essential autoconf zlib1g-dev pkgconf \ libtool libpcre++-dev libssl-dev libgeoip-dev libgd-dev \ libxml2-dev liblmdb-dev libyajl-dev libxslt1-dev \ libcurl4-openssl-dev curl git
编译安装libmodsecurity:
cd /opt git clone https://github.com/SpiderLabs/ModSecurity cd ModSecurity git submodule init git submodule update ./build.sh ./configure make -j$(nproc) make install
查看当前的Nginx版本以及编译时用到的参数:
nginx -V
从Nginx官网下载同版本的源码/解压/进入到源码目录:
cd /opt git clone https://github.com/SpiderLabs/ModSecurity-nginx wget http://nginx.org/download/nginx-1.14.2.tar.gz tar -xzvf nginx-1.14.2.tar.gz cd nginx-1.14.2
配置:
./configure --add-dynamic-module=../ModSecurity-nginx --<除去原Nginx的所有add-module参数后,剩下的所有编译参数都应该加在这里>
编译modsecurity连接器模块:
make modules
完成之后把modsecurity连接器模块复制到nginx的模块加载目录:
cp objs/ngx_http_modsecurity_module.so /usr/share/nginx/modules
编辑Nginx主配置文件:
nano /etc/nginx/nginx.conf
文件的顶行加入:
load_module modules/ngx_http_modsecurity_module.so;
现在应该测试一下看Nginx的配置有没报错:
nginx -t
没问题的话,现在就可以配置WAF规则了,owasp是modsecurity维护的一个额外规则:
mkdir /etc/nginx/modsec && cd /etc/nginx/modsec git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git mv /etc/nginx/modsec/owasp-modsecurity-crs/crs-setup.conf.example /etc/nginx/modsec/owasp-modsecurity-crs/crs-setup.conf
modsecurity.conf-recommended这个文件也要重命名并移动到相关目录,unicode.mapping也需要移动,否则Nginx启动的时候会报错:
cp /opt/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf cp /opt/ModSecurity/unicode.mapping /etc/nginx/modsec
之后编辑modsecurity.conf:
nano /etc/nginx/modsec/modsecurity.conf
modsecurity默认不会拦截恶意请求,它只会提示并写入日志,要开启拦截,需要把下图的参数改为On:
现在新建一个main的主配置文件:
nano /etc/nginx/modsec/main.conf
在main.conf内引用全部的规则:
Include /etc/nginx/modsec/modsecurity.conf Include /etc/nginx/modsec/owasp-modsecurity-crs/crs-setup.conf Include /etc/nginx/modsec/owasp-modsecurity-crs/rules/*.conf
最后在需要开启WAF的站点配置文件(server段内)加入如下配置:
modsecurity on; modsecurity_rules_file /etc/nginx/modsec/main.conf;
再测试一遍Nginx配置:
nginx -t
没问题的话,重启下Nginx就大功告成了:
systemctl restart nginx
有拦截或者其他信息都可以看看这个日志文件:
/var/log/modsec_audit.log
其实说实话这个东西不是很符合天朝国情(网络环境),因为是老外开发的,最了解中国人的永远只有中国人自己,就好比杀毒软件一样,360就是一个最好的例子。。
下篇文章介绍一个比这个更简单更好用的。。
这个东西简直是福音, 每次编译pagespeed我头都大了… 还要去复制apt安装的参数路径 = =#