mod_security:如何记录特定 URI 的 POST 请求?

mod_security:如何记录特定 URI 的 POST 请求?

我正在尝试设置 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"

还请注意这将允许规则并跳过所有未来的规则。你最好经过规则。这样它肯定会被记录,但仍会运行其他规则。但是,如果根据您显示的配置,这是您的唯一规则,那么这并不重要,但仍是良好做法。

相关内容