“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>。]
关于作者
相关博客文章
NGINX Plus R26 正式发布
NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。
使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。
Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。
NGINX Plus R19 正式发布
NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。
NGINX现已正式加入F5
NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

