modsecurity默认不生效,必须设secruleengine on并加载owasp crs规则(含crs-setup.conf);需开启secrequestbodyaccess、调参降误报,并验证403拦截与日志匹配。

启用规则引擎并加载基础防护
装完 libapache2-mod-security2 后,ModSecurity 默认是“不干活”状态。必须显式开启引擎,并加载规则集才能起效。
编辑 /etc/modsecurity/modsecurity.conf,确认以下两行已设置:
- SecRuleEngine On —— 不是 DetectionOnly,否则只记录不拦截
-
Include /usr/share/modsecurity-crs/rules/*.conf —— 加载 OWASP CRS 主规则(路径依安装方式可能为
/etc/modsecurity/crs/)
特别注意:crs-setup.conf 必须被包含(通常在主 CRS include 前),它控制全局行为,比如是否允许编码斜杠、异常评分阈值等。漏掉这步,很多规则会“匹配但不阻断”。
针对性加固 SQL 注入检测点
CRS 默认对 URI、参数名(ARGS_NAMES)、参数值(ARGS)都做 SQLi 检测,但常见失效场景有三类,需手动补强:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
POST body 未解析:确保
SecRequestBodyAccess On已启用,否则表单提交的 SQLi payload(如user=admin' OR 1=1--)进不到 ARGS 变量里,规则直接跳过 -
大文件上传干扰:若应用含文件上传,调大
SecRequestBodyLimit 10485760(10MB)和SecRequestBodyNoFilesLimit 131072,避免 body 被截断导致规则误判 -
绕过手法漏检:攻击者常用大小写混用(
UnIoN)、URL 编码(sel%65ct)、注释分隔(UNION/*a*/SELECT)绕过。CRS v3.3+ 支持请求归一化,但需确认SecUnicodeMapFile和SecUnicodeCodePage已正确配置
调参降误报,不牺牲防护力
刚上线常因误报炸锅,比如正常搜索带单引号或 JSON 字段含 SQL 关键字。别急着关规则,优先调参:
- 把全局异常评分阈值从默认 5 提到 10:
SecAction "id:900120,phase:1,pass,nolog,setvar:tx.anomaly_score_threshold=10" - 对特定接口放行 SQLi 检测(保留其他防护):
SecRule REQUEST_URI "@beginsWith /api/search" "id:1002,phase:1,pass,nolog,ctl:ruleRemoveByTag=OWASP_CRS" - 禁用高误报单条规则,而非整类:
SecRuleRemoveById 942100(仅移除 URI 层 SQLi 检测,保留 POST body 检测)
所有调整建议写在虚拟主机配置或 modsecurity.conf 末尾,避免覆盖 CRS 原始逻辑。
验证拦截是否真生效
光看日志里有没有 “blocked” 不够,关键看三件事:
- 发起测试请求:
curl "http://localhost/login.php?user=admin' OR '1'='1" - 检查 Apache 错误日志(
/var/log/apache2/error.log)中是否有Matched "rx ..." at ARGS:user+denied字样 - 确认响应返回的是 403 状态码,且页面无数据库报错或用户信息泄露
如果匹配了但没拒绝,回头重点查 SecRuleEngine 是否真为 On、crs-setup.conf 是否加载、以及该规则所在 phase(如 phase:2 规则不会处理 GET 参数)是否匹配你的请求类型。










