如何配置ModSecurity以真正拦截/拒绝恶意请求?
看起来你已经完成了ModSecurity的基础安装和规则筛选,但只记录日志却不拦截恶意请求的问题,通常和拦截动作的配置缺失或者CRS规则依赖的初始化项未加载有关,我帮你梳理几个关键排查点:
检查
modsecurity.conf中的默认动作设置
默认情况下,ModSecurity的SecDefaultAction可能仅配置了日志动作(比如"phase:1,log,auditlog,pass"),你需要确保这条规则包含拒绝动作。打开/etc/modsecurity/modsecurity.conf,找到SecDefaultAction行,修改为类似以下配置:SecDefaultAction "phase:1,log,auditlog,deny,status:403"这里的
deny会让ModSecurity直接返回403状态码拒绝请求,如果你需要更严格的拦截(直接断开连接),可以把deny换成drop。务必加载CRS的初始化规则文件
你目前只启用了PHP攻击规则和拦截评估规则,但CRS的规则依赖REQUEST-901-INITIALIZATION.conf来初始化关键变量(比如tx.paranoia_level偏执级别、默认拦截标识等),缺少这个文件的话,REQUEST-949-BLOCKING-EVALUATION.conf里的拦截逻辑根本无法正常触发。建议把这个初始化配置文件也启用后再测试。验证启用规则的动作是否包含拦截指令
打开你启用的REQUEST-933-APPLICATION-ATTACK-PHP.conf,查看几条核心规则,确认它们的动作中包含deny或block(CRS规则通常会结合ctl:ruleEngine=On和默认动作来实现拦截,或者直接指定deny动作)。如果规则本身只有log动作,自然不会触发拦截。修改配置后重启Apache并测试
每次调整配置后,记得执行以下命令重启Apache使配置生效:sudo systemctl restart apache2你可以用简单的恶意请求测试,比如给你的PHP页面加参数
?id=1' OR '1'='1,如果配置正确,应该会直接返回403页面,同时日志中也会记录该请求。
备注:内容来源于stack exchange,提问作者Rahul Thakkar

