ModSecurity:日志记录与调试

NGINX | 2017年10月22日

“ModSecurity将帮助您睡得更安心,因为最重要的是,它解决了可见性问题,让您能够查看Web流量。”

ModSecurity创建者Ivan Ristić

当某些功能未按预期运行时,首先应查看日志。完善的日志可以提供有价值的信息,帮助排查当前遇到的问题。Ivan Ristić 最初创建 ModSecurity 的原因之一,是他对当时所用工具缺乏可观测性感到不满。因此,ModSecurity 具备丰富的日志记录和调试功能也就不足为奇了。

ModSecurity有两种类型的日志:

  • 审计日志。对于每个被阻止的事务,ModSecurity都会提供详细日志,说明该事务的相关信息及其被阻止的原因。
  • 调试日志。启用后,此日志会记录有关ModSecurity所有操作的详细信息。

审计日志不仅有助于了解某次攻击被阻止的原因,还能帮助您进一步掌握整体攻击模式。仅将端口80和/或443暴露在互联网上,就可能会收到数量惊人的机器人和扫描器流量。

本文将介绍使用ModSecurity进行日志记录和调试的基础知识。

审计日志

ModSecurity的主要日志是审计日志,用于记录发生的所有攻击,包括潜在攻击。如果已按照我们的安装说明安装ModSecurity(搭配NGINX Open Source)或NGINX ModSecurity WAF(搭配NGINX Plus),则默认情况下,ModSecurity会记录触发警告或错误的所有事务,以及产生5xx和4xx响应的所有事务,但404响应除外。(仅对于Ubuntu 16.04系统,审计日志位于/var/log/modsec_audit.log。)

ModSecurity审计日志分为多个部分,便于浏览日志并查找所需信息。下表概述了各部分包含的内容:

部分说明
A审计日志标头(必需)
B请求标头
C请求正文
D保留
E响应正文
F响应标头
G保留
H审计日志尾部,包含附加数据
I精简的请求正文替代部分(替代C部分),不包含文件
J已上传文件的信息
K包含与该事务匹配的所有规则列表
Z最终边界(必需)

对于触发审计日志条目的每个事务,系统会记录上述部分中的任意部分或全部部分。您可以配置要记录的部分。

审计日志示例

ModSecurity审核日志条目示例如下:

---ICmPEb5c---A--[04/Oct/2017:21:45:15 +0000] 150715351558.929952 141.212.122.16 64384 141.212.122.16 80---ICmPEb5c---B--GET / HTTP/1.1Host: 54.183.57.254User-Agent: Mozilla/5.0 zgrab/0.xAccept-Encoding: gzip---ICmPEb5c---D-----ICmPEb5c---F--HTTP/1.1 200Server: nginx/1.13.4Date: Wed, 04 Oct 2017 21:45:15 GMTContent-Type: text/htmlConnection: keep-alive---ICmPEb5c---H--ModSecurity: Warning. Matched "Operator `Rx' with parameter `^[d.:]+$' against variable `REQUEST_HEADERS:Host' (Value: `54.183.57.254' ) [file "/root/owasp-v3/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"] [line "733"] [id "920350"] [rev "2"] [msg "Host header is a numeric IP address"] [data "54.183.57.254"] [severity "4"] [ver "OWASP_CRS/3.0.0"] [maturity "9"] [accuracy "9"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-protocol"] [tag "OWASP_CRS/PROTOCOL_VIOLATION/IP_HOST"] [tag "WASCTC/WASC-21"] [tag "OWASP_TOP_10/A7"] [tag "PCI/6.5.10"] [ref "o0,13v21,13"]---ICmPEb5c---I-----ICmPEb5c---J-----ICmPEb5c---Z--

虽然从上表中无法立即看出,但要查找特定请求被阻止的原因,最适合查看的是H部分,而不是K部分。在上述审计日志示例中,查看H部分时,可以看到消息“Host标头是数字IP地址”。这表明有人尝试通过IP地址而非主机名访问我们的网站,可能意味着扫描器正在探测该网站。

审计日志配置

如果按照我们的说明安装并配置了ModSecurity,则可以在/etc/nginx/modsec/modsecurity.conf中找到审计日志配置。该文件包含以下3条指令,用于控制写入审计日志的内容:

SecAuditEngine RelevantOnlySecAuditLogRelevantStatus "^(?:5|4(?!04))"SecAuditLogParts ABIJDEFHZ

其中

  • SecAuditEngine:控制应记录的内容。可选值如下:
    • Off,禁用审计日志。
    • 开启:记录所有事务,有助于调试。
    • RelevantOnly:仅记录触发警告或错误的事务,或状态代码与SecAuditLogRelevantStatus指令中所列代码匹配的事务。
  • SecAuditLogRelevantStatus:如果SecAuditEngine设置为RelevantOnly,则此指令用于控制应记录哪些HTTP响应状态码。该指令基于正则表达式。上述值将记录所有5xx和4xx响应,但不包括404响应。
  • SecAuditLogParts:控制访问日志中应包含哪些部分。移除不需要的部分可减小审计日志的大小,使其更易于浏览。

有关其他审计日志配置指令,请参阅ModSecurity wiki。

调试日志

启用调试日志后,其中会提供有关ModSecurity所有操作的大量信息。如果某项功能未按预期运行,需要排查原因,调试日志是首选资源。如果您刚开始使用ModSecurity,并希望了解其为何以特定方式运行,调试日志也非常有用。

调试日志示例

调试日志如下所示,其中详细记录了ModSecurity针对每笔事务执行的操作:

[4] (Rule: 1234) Executing operator "Contains" with param "test" against ARGS:testparam.[9] Target value: "test" (Variable: ARGS:testparam)[9] Matched vars updated.[4] Running [independent] (non-disruptive) action: log[9] Saving transaction to logs[4] Rule returned 1.[9] (SecDefaultAction) Running action: log[9] Saving transaction to logs[9] (SecDefaultAction) Running action: auditlog[4] (SecDefaultAction) ignoring action: pass (rule contains a disruptive action)[4] Running (non-disruptive) action: auditlog[4] Running (disruptive)     action: deny

调试日志会列出规则ID,便于搜索。在此示例中,输出来自我们的测试规则,其ID为1234。

调试日志配置

默认情况下,调试日志处于禁用状态,因为它可能会对性能产生负面影响。与审计日志一样,调试日志也在/etc/nginx/modsec/modsecurity.conf中配置。该文件中有两条被注释掉的配置指令。要启用调试日志,请取消这两条指令的注释,并将其更改为以下内容:

SecDebugLog /var/log/modsec_debug.logSecDebugLogLevel 9

其中

  • SecDebugLog:指定调试日志文件的路径。
  • SecDebugLogLevel:0至9表示要记录的信息量,其中9表示记录的信息最多。进行故障排除时,将此值设置为9最有帮助。

总结

本文介绍了如何开始使用ModSecurity丰富的日志记录功能。ModSecurity提供审计日志和调试日志:审计日志包含所有被阻止事务的相关信息;如果在使用ModSecurity时遇到问题,调试日志可进一步协助排查。

ModSecurity 3.0既可用于NGINX Open Source,也可以NGINX ModSecurity WAF的形式用于NGINX Plus。NGINX ModSecurity WAF是一个预编译的动态模块,由NGINX, Inc.维护并提供全面支持。免费试用30天。

[编辑:NGINX ModSecurity WAF已于2022年4月1日正式停止销售,并将于2024年3月31日终止生命周期。有关更多详细信息,请参阅博客文章《F5 NGINX ModSecurity WAF即将终止生命周期》<.htmla>。]


分享
标签: Security, F5 NGINX, Tech

相关博客文章

NGINX Plus R26 正式发布
NGINX | 2022/02/15

NGINX Plus R26 正式发布

NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
NGINX | 2022/02/10

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击

gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
NGINX | 2021/09/13

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划

了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。

NGINX Plus R19 正式发布
NGINX | 2019/09/03

NGINX Plus R19 正式发布

NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。

NGINX现已正式加入F5
NGINX | 2019/05/09

NGINX现已正式加入F5

NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

使用NGINX和NGINX Plus实现高性能缓存
NGINX | 2016/08/24

使用NGINX和NGINX Plus实现高性能缓存

我将介绍NGINX在内容缓存和性能方面的工作原理,并分享一些控制NGINX内容缓存方式的技巧。