Nginx 搭配 ModSecurity 构建企业级开源 WAF 需完成四层逻辑:系统依赖准备、libmodsecurity 编译安装、ModSecurity-Nginx 连接器编译、OWASP CRS 规则配置与启用,全过程强调分步验证与渐进式防护。

用 Nginx 搭配 ModSecurity 构建企业级开源 WAF,核心在于“模块集成 + 规则驱动 + 分层配置”。它不是简单装个包就开箱可用,而是需要分步打通底层依赖、编译桥接、启用引擎、加载规则四层逻辑。整个过程对系统环境敏感,但一旦跑通,就能实现低延迟、高可控的 Web 层防护。
准备系统与关键依赖
推荐使用 Ubuntu 22.04 LTS 或 CentOS Stream 9,避免旧版系统中库版本冲突导致编译失败。必须安装的组件包括:
- 编译工具:gcc、make、autoconf、automake、libtool
- 基础开发库:pcre-devel、zlib-devel、libxml2-devel、curl-devel
- ModSecurity v3 专用依赖:yajl、lmdb、ssdeep-devel、lua-devel
- 注意:CentOS 8/9 需启用 PowerTools 或 CRB 仓库才能安装 lua-devel;Ubuntu 则对应安装 libpcre3-dev、libxml2-dev 等 -dev 包
编译安装 libmodsecurity(v3)
ModSecurity v3 不再是 Apache 模块式结构,而是一个独立的 C++ 库(libmodsecurity),需先编译安装,再通过连接器接入 Nginx:
- 克隆源码:
git clone --depth 1 -b v3/master https://github.com/SpiderLabs/ModSecurity - 初始化子模块:
git submodule init && git submodule update - 生成构建脚本:
./build.sh - 配置并安装:
./configure --prefix=/usr/local/modsecurity --with-yajl --with-lmdb --with-ssdeep && make -j$(nproc) && sudo make install - 验证安装:
ls /usr/local/modsecurity/lib/libmodsecurity.so存在即成功
编译 ModSecurity-Nginx 连接器
Nginx 本身不理解 ModSecurity 规则,必须靠 ModSecurity-nginx 动态模块作为“翻译器”:
- 下载对应 Nginx 版本源码(如当前运行的是 nginx/1.24.0,就下同版本源码)
- 克隆连接器:
git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git - 进入 Nginx 源码目录,执行:
./configure --with-compat --add-dynamic-module=../ModSecurity-nginx -
make modules,生成objs/ngx_http_modsecurity_module.so - 复制模块到 Nginx 模块路径(如
/usr/lib/nginx/modules/),并在nginx.conf顶部添加:load_module modules/ngx_http_modsecurity_module.so;
配置规则引擎与 OWASP CRS
启用防护不等于立即拦截,应遵循“观察 → 调优 → 启用”三步走:
- 创建规则目录:
sudo mkdir -p /etc/nginx/modsec/{crs,custom} - 复制基础配置:
sudo cp /usr/local/modsecurity/etc/modsecurity.conf-recommended /etc/nginx/modsec/main.conf - 编辑
main.conf,将SecRuleEngine设为DetectionOnly(只记录不阻断) - 下载 OWASP CRS v4.x:
git clone --depth 1 -b v4/master https://github.com/coreruleset/coreruleset.git /etc/nginx/modsec/crs - 重命名并配置 CRS:
cp /etc/nginx/modsec/crs/crs-setup.conf.example /etc/nginx/modsec/crs/crs-setup.conf,按业务调整异常阈值和禁用规则(如禁用 PHP 相关规则用于 Java 后端) - 在
main.conf中按顺序引入:Include /etc/nginx/modsec/crs/crs-setup.conf→Include /etc/nginx/modsec/crs/rules/*.conf - 在 server 块中启用:
modsecurity on;和modsecurity_rules_file /etc/nginx/modsec/main.conf;
规则生效后,可通过访问带 SQL 注入特征的 URL(如 ?id=1' OR '1'='1)并检查 /var/log/modsec_audit.log 验证日志是否写入。确认无误后,再将 SecRuleEngine 改为 On 开始实际拦截。


















