对 mod_security 日志的细粒度控制

对 mod_security 日志的细粒度控制

我安装了mod_security2在几十台服务器上(每台服务器有几十个 VHost),没有时间为每个 VHost 配置它。在默认配置下,它会在日志文件中产生大量的误报,所以我选择让它在DetectionOnly-mode 下运行(它不会阻止任何东西,但我仍然会获得大多数黑客攻击的详细日志),除了少数 VHost 之外。

我对这个设置很满意,直到我发现有些服务器上的日志文件在不到 3 周的时间内增长到几 GB。我决定关闭少数 VHost 的日志记录,这些 VHost 产生了大部分日志条目。有几种不同的方法可以做到这一点,我最终决定制定新规则,这些规则都具有非常具体的触发器,并且都具有"nolog,phase:1,t:none,ctl:secAuditEngine=Off"操作。这种方法成功了,因为审计日志降低到可控水平。

但我仍然得到了数 GB 的日志,因为我似乎无法阻止 mod_security2 写入错误日志。我试过了,SecDebugLogLevel 0因为它是唯一与错误日志有关的配置指令(无论如何,我能找到),但无济于事。唯一似乎有帮助的是SecRuleEngine Off,这违背了安装 mod_security2 的初衷。

我是否遗漏了什么?无论我尝试什么,似乎我只能控制记录到审计日志的数量,而无法控制记录到错误日志的数量。

答案1

经过大量的反复试验,我仍然没有找到一个完全令人满意的解决方案,但至少有一个解决方法。SecRemoveRuleById<Directory>-Blocks 中添加可以阻止错误日志中的条目 - 但它似乎并不适用于所有规则,只适用于其中一些规则(例如,停用规则 ID 960010 有效,但 960243 和 960257 无效)。当然,这只有在 Apache 能够确定目录路径时才会有效 - 对于许多格式错误的请求和缺少关键信息的请求,Apache 不知道路径。

通过定义新的规则来停用规则SecRule SERVER_NAME "^domain.tld$" "nolog,phase:1,t:none,id:100,ctl:ruleRemoveById=960010"也是可行的,但必须定义所有其他规则(因此在包含 CRS 规则之前)都可靠地停用现有规则。据我所知,mod_security 按照规则定义的顺序应用规则,因此在触发后停用 phase:1 规则显然不会阻止已经发生的日志条目(在阶段 1 中停用 phase:2 规则似乎总是有效,这是意料之中的)。我无法在不改变定义顺序的情况下影响应用顺序,这有点不方便。

当然,我真正想要的解决方案是全面停用错误日志条目。要找到每个 VHost 的频繁触发规则 ID 并单独停用它们,需要付出太多努力。10000 个 VHost á 10 分钟的配置 -> 几乎花了一年的时间让它在每个 VHost 上工作。

相关内容