WAF防火墙部署配置:从零搭好Nginx+ModSecurity防护
WAF防火墙部署配置:从零搭好Nginx+ModSecurity防护
WAF(Web应用防火墙)部署在Web服务器前面或集成进服务器,用来识别和拦截SQL注入、XSS、恶意扫描这类应用层攻击。
如果你用的是Nginx,最直接的方案是接入ModSecurity模块,再加载OWASP核心规则集。
下面按零基础可照做的顺序,讲清准备、安装、配置和验证。
先确认环境与前提条件
这套流程适用于常见的Linux发行版,本文命令以CentOS 7/8或Rocky Linux、Ubuntu 20.04以上为例,Nginx建议用源码编译方式以便加载第三方模块。
操作前请确认:
- 你拥有服务器的root权限或sudo权限。
- 服务器已安装编译工具链,如
gcc、make、pcre-devel、zlib-devel、openssl-devel。 - 已备份现有Nginx配置,避免修改后无法回滚。
- 若服务器已有业务运行,建议先在测试环境验证,再上生产。
检查编译依赖是否齐全:
# CentOS/Rocky
rpm -q gcc make pcre-devel zlib-devel openssl-devel
# Ubuntu/Debian
dpkg -l | grep -E 'build-essential|libpcre3-dev|zlib1g-dev|libssl-dev'
缺失的包用yum install或apt install补上即可。
编译安装ModSecurity与Nginx连接器
ModSecurity本身是引擎,Nginx还需要一个连接器模块才能通信。
分两步走:先装引擎,再编译Nginx模块。
安装ModSecurity引擎
yum install -y git automake libtool curl-devel
git clone https://github.com/SpiderLabs/ModSecurity.git
cd ModSecurity
git submodule init
git submodule update
./build.sh
./configure
make && make install
安装完成后,确认/usr/local/modsecurity目录存在。
编译Nginx连接器
git clone https://github.com/SpiderLabs/ModSecurity-nginx.git
# 查看当前Nginx编译参数
nginx -V 2>&1 | grep configure
拿到原有参数后,加上ModSecurity模块重新编译:
./configure --add-module=/path/to/ModSecurity-nginx --with-http_stub_status_module ...
make
make install
注意:--add-module路径要替换成你实际克隆的位置,其他参数沿用nginx -V输出,不要漏掉。
配置Nginx加载WAF并启用规则
准备规则文件
从官方仓库拉取OWASP核心规则集:
git clone https://github.com/coreruleset/coreruleset.git /etc/nginx/modsec/coreruleset
cp /etc/nginx/modsec/coreruleset/crs-setup.conf.example /etc/nginx/modsec/crs-setup.conf
编写ModSecurity主配置
新建/etc/nginx/modsec/main.conf,内容示例如下:
Include /etc/nginx/modsec/modsecurity.conf
Include /etc/nginx/modsec/crs-setup.conf
Include /etc/nginx/modsec/coreruleset/rules/*.conf
把官方默认配置复制过来并调整关键项:
cp /usr/local/modsecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf
编辑modsecurity.conf,重点确认:
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On
SecAuditLog /var/log/modsec_audit.log
SecRuleEngine On表示开启拦截,调试阶段可以先设为DetectionOnly只记录不拦截。
在Nginx站点中启用
在http或server块中加入:
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
检查语法并重载:
nginx -t && nginx -s reload
验证拦截是否真正生效
配置完成不代表生效,必须做一次模拟攻击验证。
用curl发一条带典型注入特征的请求:
curl -I "http://你的域名/?id=1%20and%201=1"
如果返回403 Forbidden,说明WAF已拦截。
同时查看审计日志:
tail -f /var/log/modsec_audit.log
日志中能看到触发的规则ID和请求内容,说明WAF防火墙部署配置已经跑通。
如果返回200正常页面,检查SecRuleEngine是否为On、规则路径是否正确、Nginx是否真的重载成功。
容易踩的坑与排查方向
规则误拦正常业务:新上线时建议先用DetectionOnly跑几天,观察日志里哪些规则频繁命中,再针对业务路径加白名单,不要一上来就全量拦截。
Nginx启动失败:多半是编译时漏了原有模块参数,可用nginx -V对比,或查看error.log里的模块加载报错。
日志文件无写入:确认/var/log/modsec_audit.log的目录存在且Nginx运行用户有写权限,否则日志会静默失败。
性能影响:开启响应体检查会增加CPU开销,流量大的站点可以按需关闭SecResponseBodyAccess,只检查请求方向。
常见疑问
WAF和系统防火墙有什么区别?
系统防火墙管网络层端口,WAF管HTTP应用层攻击,两者互补,不能互相替代。
必须用ModSecurity吗?
不是。
也可以用云WAF或反向代理层的商业方案,但自建ModSecurity成本低、可控性强,适合中小站点。
规则集会拖慢网站吗?
会有一定开销,建议先在测试环境压测,再决定开启哪些规则组。
配置完成后,建议定期更新OWASP规则集,并保留一份可回滚的配置备份。
WAF防火墙部署配置不是一次性的活,规则维护和误报调优同样重要。