ModSecurity 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

