You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ModSecurity 912-DOS-PROTECTION规则失效问题求助

Apache 2.4 + ModSecurity 2.9.2 + OWASP CRS 3.3:DOS防护规则912-DOS-PROTECTION未生效问题解决

问题场景

我在Apache 2.4环境下使用mod_security 2.9.2搭配OWASP Core Rule Set 3.3版本,为抵御简单DOS攻击,按照REQUEST-912-DOS-PROTECTION.conf文档提示,在mod_security.conf中添加了以下配置以启用912规则:

SecAction \
"id:900700,phase:1,nolog,pass,t:none,\
setvar:'tx.dos_burst_time_slice=3',\
setvar:'tx.dos_counter_threshold=50',\
setvar:'tx.dos_block_timeout=600',\
setvar:'tx.static_extensions=/.jpg/ /.jpeg/ /.png/ /.gif/ /.js/ /.css/ /.ico/'"

预期效果是3秒内收到50次以上非静态资源请求时触发拦截,但实际无任何效果,所有请求均未被阻止。我使用ab工具模拟流量:

ab -c 60 -t 6 "[URL]"

测试结果显示611次请求全部成功,无失败:

Concurrency Level:      60
Time taken for tests:   6.018 seconds
Complete requests:      611
Failed requests:        0
Write errors:           0
Total transferred:      110954039 bytes

modsec_audit.log仅记录警告信息,关联请求仍返回HTTP/1.1 200 OK:

Message: Warning. Operator GE matched 2 at IP:dos_burst_counter. [file "/etc/httpd/modsecurity.d/activated_rules/REQUEST-912-DOS-PROTECTION.conf"] [line "269"] [id "912170"] [msg "Potential Denial of Service (DoS) Attack from [IP] - # of Request Bursts: 2"] [ver "OWASP_CRS/3.3.1"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "paranoia-level/1"] [tag "attack-dos"] [tag "OWASP_CRS"] [tag "capec/1000/210/227/469"]
Apache-Error: [file "apache2_util.c"] [line 273] [level 3] [client IP] ModSecurity: Warning. Operator GE matched 2 at IP:dos_burst_counter. [file "/etc/httpd/modsecurity.d/activated_rules/REQUEST-912-DOS-PROTECTION.conf"] [line "269"] [id "912170"] [msg "Potential Denial of Service (DoS) Attack from [IP] - # of Request Bursts: 2"] [ver "OWASP_CRS/3.3.1"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "paranoia-level/1"] [tag "attack-dos"] [tag "OWASP_CRS"] [tag "capec/1000/210/227/469"] [hostname "example.com"] [uri "/test.php"] [unique_id "Yu-n6NGj9kT3clHjZubuCQAAAM0"]
Apache-Handler: proxy:unix:/run/php-fpm/www.sock|fcgi://localhost

解决步骤

1. 确认ModSecurity拦截模式

检查mod_security.conf中的规则引擎模式,必须设置为强制拦截:

SecRuleEngine On

如果是DetectionOnly,规则只会记录日志但不会执行拦截动作,这是最常见的失效原因。

2. 验证拦截规则的启用状态

规则912170仅负责记录警告,真正的拦截由后续的912180规则执行:

  • 打开REQUEST-912-DOS-PROTECTION.conf,确认规则912180未被注释。
  • 检查tx.dos_burst_count_threshold变量(默认值为1),若需要降低拦截触发条件,可将其设为1(即一次burst就触发拦截)。

3. 配置会话存储目录

DOS规则依赖IP请求计数的持久化,需确保配置了可写的存储目录:

SecDataDir /var/cache/modsecurity/

给该目录设置Apache运行用户(通常为apache或www-data)的读写权限,否则计数器无法累计请求数,规则无法生效。

4. 调整测试参数精准触发阈值

当前测试的请求分布可能未集中在3秒窗口内,可改用更直接的测试命令:

ab -c 20 -n 100 "[URL]"

短时间内发送100次请求,确保3秒内超过50次的阈值。

5. 确保变量配置加载顺序

自定义的SecAction(id:900700)必须在REQUEST-912-DOS-PROTECTION.conf之前加载,否则变量设置不会被规则读取。可将变量配置放在modsecurity.conf的最顶部,或调整规则文件的加载顺序。

6. 确认测试目标符合非静态资源要求

确保测试的URL不属于tx.static_extensions定义的后缀(如.php这类动态文件),如果测试静态资源,规则会跳过计数。

内容的提问来源于stack exchange,提问作者potc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:24:09