我正在尝试设置 mod_security 来记录特定 URI 的 POST 请求负载,因为客户网页似乎被用作垃圾邮件中继,并且这些请求破坏了服务器端缓存。
我开始关注这个博客文章但它似乎相当老旧和过时。它不适用于我们的环境,即 Apache 2.4 和 mod_security 2.8。因此我通过以下方式增强了该配置serverfault 答案。
在相关的 vhost 配置中,mod_security 配置如下:
<IfModule security2_module>
SecRuleEngine On
SecAuditEngine RelevantOnly
SecAuditLog logs/audit.log
SecRequestBodyAccess On
SecAuditLogParts ABCFHJKZ
SecDefaultAction "phase:2,nolog,noauditlog,pass"
SecRule REQUEST_METHOD "^POST$" "id:'1234',phase:2,chain,allow,ctl:auditEngine=On"
SecRule REQUEST_URI "^\/en\/us\/$"
</IfModule>
结果是每个 POST 请求都会记录到审计日志中。但只有对主页的 POST 请求才https://<SITE>/en/us/
应该被记录。据我所知,这应该通过链接到第二个 SecRule 来完成,该 SecRule 将请求 URI 与给定的正则表达式匹配。我也尝试了不同版本的正则表达式,但没有成功。
答案1
这有点令人困惑,但第一条规则中指定的某些操作将针对链中匹配的每条规则运行,而某些操作仅在所有规则匹配时才会运行(ModSecurity 的作者事后表示,最好将规则放在最后一个链式规则上,而不是第一个)。有关更多详细信息,请参见此处:https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#chain:
特殊规则控制链式规则中操作的使用:
- 任何影响规则流的操作(即破坏性操作、skip 和 skipAfter)只能在链启动器中使用。只有当整个链匹配时,它们才会被执行。
- 非破坏性规则可用于任何规则;如果包含它们的规则匹配,它们就会被执行,而不仅仅是在整个链匹配时才执行。
- 元数据操作(例如 id、rev、msg)只能在链启动器中使用。
所以规则应该是这样的,所以只有在第一次时才打开日志记录和第二条规则匹配:
SecRule REQUEST_METHOD "^POST$" "id:'1234',phase:2,chain,allow"
SecRule REQUEST_URI "^\/en\/us\/$" "ctl:auditEngine=On"
还请注意这将允许规则并跳过所有未来的规则。你最好经过规则。这样它肯定会被记录,但仍会运行其他规则。但是,如果根据您显示的配置,这是您的唯一规则,那么这并不重要,但仍是良好做法。