我试图设置mod_security来logging特定URI的POST请求负载,因为看起来客户网页被用作垃圾邮件中继,并且这些请求会破坏服务器端caching。
我是从这个博客文章开始的,但看起来很老旧。 它不适用于我们的环境,这是Apache 2.4和mod_security 2.8。 所以我通过这个serverfault的答案增强了这个configuration。
在相关的vhostconfiguration里,mod_security是这样configuration的:
<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请求都被logging到审计日志中。 但是只有到主页https://<SITE>/en/us/的POST请求应该被logging。 在我的理解,这应该通过链接到第二个SecRule匹配请求URI对给定的正则expression式。 我也试过不同版本的正则expression式,但没有成功。
这有点令人困惑,但是在第一条规则中指定的一些动作将针对链中匹配的每个规则运行,并且一些只有在所有规则匹配的情况下才运行(ModSecurity的作者已经事后表明,将规则放在最后链接的规则而不是第一条)。 在这里看到更多的细节: https : //github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#chain :
特殊规则控制链接规则中的操作的使用:
- 任何影响规则stream程的操作(即中断操作,skip和skipAfter)只能在链式启动器中使用。 只有整个链条匹配时才会执行。
- 任何规则都可以使用不中断的规则。 如果包含它们的规则匹配,而不是只在整个链条匹配时执行。
- 元数据操作(例如,id,rev,msg)只能在链接启动器中使用。
因此,规则应该是这样的,所以只有当第一个和第二个规则匹配时才会打开日志
SecRule REQUEST_METHOD "^POST$" "id:'1234',phase:2,chain,allow" SecRule REQUEST_URI "^\/en\/us\/$" "ctl:auditEngine=On"
请注意,这将允许规则,并跳过所有未来的规则。 相反,您可能会更好地通过规则。 这样它肯定会被logging,但仍然运行其他规则。 但是,如果这是你的唯一的规则,你已经表明它并不重要,但仍然是一个好习惯。