modsecurity 在 nginx 中不能直接使用,必须通过 nginx-modsecurity(modsecurity v3 connector)动态模块加载;需源码编译或使用集成发行版,启用 secrequestbodyaccess on 并正确配置规则与日志。

ModSecurity 在 Nginx 里根本不能直接用
ModSecurity 默认是 Apache 模块,原生不支持 Nginx。你装了 libmodsecurity 也看不到 LoadModule security2_module 这种配置——Nginx 没这机制。真想在 Nginx 用 ModSecurity,必须走 nginx-modsecurity(即 ModSecurity v3 的 Nginx connector),它是个独立编译的动态模块,不是插件式加载。
常见错误现象:nginx: [emerg] unknown directive "SecRule",说明你误把 Apache 风格的配置塞进了 Nginx 配置里,或者没正确加载 connector 模块。
- 必须从源码编译 Nginx,或使用已集成 connector 的发行版(如 Debian 的
nginx-mod-http-modsecurity包) - 确认
nginx -V 2>&1 | grep -o modsecurity输出含modsecurity字样,否则模块压根没加载 - 配置入口不是
http{}块里随便写规则,而是先用modsecurity on;开启,再用modsecurity_rules_file或modsecurity_rules加载规则集
SQL 注入规则不能只靠默认 CRS
OWASP ModSecurity Core Rule Set(CRS)开箱即用,但它的 REQUEST-942-APPLICATION-ATTACK-SQLI.conf 规则对 Nginx 场景有明显盲区:比如它依赖 ARGS_NAMES 和 ARGS 变量,而 Nginx 的 modsecurity connector 对 multipart/form-data 解析不完整,导致文件上传带参数时 SQLI 检测失效;另外,CRS 默认关闭 SecRequestBodyAccess On,意味着 POST body 不解析,ARGS 为空,规则形同虚设。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 务必在
modsecurity.conf中显式设置SecRequestBodyAccess On - 若后端是 PHP-FPM,Nginx 默认不传递原始 body,需加
proxy_pass_request_body on;并确保fastcgi_pass_request_body on; - CRS 的
tx.sql_injection_score是累加型,单条规则触发不阻断,要检查SecRule TX:ANOMALY_SCORE "@gt 5" "id:1000,deny,status:403,msg:'SQLi detected'"是否启用
绕过检测的典型场景和补救动作
攻击者常用大小写混用、URL 编码、注释符分隔、空字节等方式绕过 CRS 的正则匹配。例如 sel%65ct * fr%6fm users 或 union/*abc*/select,CRS v3.3+ 虽有解码和归一化处理,但在 Nginx 下因请求体解析链路更长,容易漏掉二次解码环节。
- 启用
SecUnicodeMapFile unicode.mapping 20127并配好字符集映射,避免 UTF-8 双字节绕过 - 禁用高风险函数名的直接暴露:加规则
SecRule REQUEST_URI "@rx \b(?:union|select|insert|drop|update|delete)\b" "id:1001,deny,status:403,msg:'SQL keyword in URI'"(注意 URI 不经解码,比 ARGS 更可靠) - 不要信任
Content-Type: application/json就跳过检查——CRS 默认不解析 JSON body,需手动开启SecRule REQUEST_HEADERS:Content-Type "@streq application/json" "id:1002,phase:1,t:none,setvar:tx.json=1"再配合 JSON 解析规则
性能和日志陷阱必须提前看清
ModSecurity 在 Nginx 上是同步阻塞式处理,每条请求都走完整规则引擎。CRS 全量启用后,QPS 下降 30%~50% 很常见,尤其在高并发 POST 场景;更麻烦的是日志,默认 SecAuditLogParts ABIJEFHZ 会记录完整请求体,磁盘 I/O 瞬间拉满,还可能泄露敏感字段(如密码、token)。
- 上线前用
ab -n 1000 -c 50 http://your.site/test.php?x=1对比开关 ModSecurity 的延迟差异 - 审计日志至少去掉
I(request body)和B(request headers),改用SecAuditLogParts ABFHZ - 规则里所有
ctl:ruleRemoveById必须写在modsecurity_rules块顶部,Nginx 不支持条件性移除已加载规则
真正难的不是加几行配置,而是理解 Nginx 的请求生命周期和 ModSecurity v3 connector 的数据流边界——body 到哪一步被解码、变量何时可用、哪些 phase 能访问哪些数据,这些细节错一点,规则就等于没写。










