Nginx集成ModSecurity构建WAF需选用兼容版本组合(如Nginx 1.18–1.24 + ModSecurity v3.0.10 + 对应connector),源码编译并分层启用OWASP CRS规则,配置审计日志与自定义响应,持续运营调优。

利用Nginx网关集成ModSecurity构建WAF防护体系,核心在于将ModSecurity作为动态模块嵌入Nginx,再通过规则引擎对HTTP流量进行实时检测与拦截。关键不是简单编译安装,而是确保版本兼容、规则可维护、日志可追溯、响应可控。
确认Nginx与ModSecurity版本匹配
官方ModSecurity v3(libmodsecurity)不支持直接编译进原生Nginx,必须使用ModSecurity-nginx connector桥接。推荐组合:
- Nginx 1.18–1.24(稳定版,避免使用1.25+未充分验证的版本)
- ModSecurity v3.0.10 或 v3.0.11(v3.1.x对Nginx支持仍存兼容问题)
- connector 使用对应 release 分支(如 nginx-v3.0.10 对应 modsecurity-nginx v1.0.3)
若用OpenResty,需额外确认其内置Nginx版本及是否已预编译ModSecurity模块;生产环境建议源码编译,禁用无关模块精简攻击面。
编译集成并启用ModSecurity模块
步骤需严格按顺序执行,不可跳过依赖检查:
- 安装依赖:gcc、make、pcre-devel、openssl-devel、curl-devel、yajl-devel(JSON解析必需)
- 先编译安装 libmodsecurity(含 yajl、geoip2 等子模块),再编译 connector,最后重新编译 Nginx 并添加 --add-dynamic-module=../modsecurity-nginx
- 编译完成后,在 nginx.conf 的 http 或 server 块中加载模块:
load_module modules/ngx_http_modsecurity_module.so; - 启用时必须指定 SecRuleEngine On,并挂载配置文件:
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
配置规则集与策略分级
不建议直接启用OWASP CRS全量规则——误报高、性能损耗大。应分层启用:
- 基础防护层:启用 crs-setup.conf + REQUEST-900-EXCLUSION-RULES-BEFORE-CRS + REQUEST-901-INITIALIZATION(定义变量与基础策略)
- 精准拦截层:按业务选择性开启 REQUEST-91X(SQLi/XSS)、REQUEST-93X(LFI/RCE)、RESPONSE-95X(信息泄露)等子集
- 例外管理:用 SecRuleRemoveById 或 SecRuleUpdateTargetById 针对特定路径/参数临时放行,例如登录接口允许特殊字符
- 所有规则配置统一放在 /etc/nginx/modsec/ 下,用 include 按功能拆分,便于灰度和回滚
日志分析与响应控制
ModSecurity 默认只记录到 error_log,不利于运营分析。需主动对接:
- 配置 SecAuditLogType Serial,SecAuditLog /var/log/nginx/modsec_audit.log,启用审计日志(注意磁盘配额)
- 用 SecResponseBodyAccess On + SecResponseBodyMimeType text/plain text/html 启用响应体记录(仅限调试,生产慎开)
- 自定义拦截响应页:通过 error_page 403 /403.html,并在 location /403.html 中返回静态页面或跳转至风控中心
- 结合 Filebeat + ELK 或 Loki + Grafana 实时采集 audit log,提取 client_ip、request_url、rule_id、match、action 字段做聚合告警
这套体系不是一次部署就一劳永逸。规则需随业务迭代更新,异常流量模式要定期校准,Nginx worker 进程内存与 ModSecurity 引擎缓存也需协同调优。真正的WAF能力,藏在持续运营的细节里。

















