在网络安全防护中,Web应用防火墙(WAF)的日志分析是识别攻击行为、优化规则配置的关键步骤。Grok模式作为一种强大的日志解析工具,能够从WAF日志中精准提取关键字段(如攻击类型、来源IP、请求路径等),帮助运维人员快速定位威胁,以下内容将详细解析如何通过Grok筛选WAF字段,并提供可直接落地的实践方案。
Grok通过预定义的正则表达式模式,将非结构化的日志文本转化为结构化数据,WAF日志通常包含大量字段,
client_ip
:客户端IP地址 request_method
:HTTP请求方法(GET/POST等) attack_type
:触发的攻击类型(如SQL注入、XSS) blocked
:请求是否被拦截 一条典型的WAF日志可能如下:
2025-10-05 14:30:23 WAF Alert: [client 192.168.1.100] XSS attack detected on path "/submit.php" (blocked=true)
使用Grok可将其解析为:
{ "timestamp": "2025-10-05 14:30:23", "client_ip": "192.168.1.100", "attack_type": "XSS", "path": "/submit.php", "blocked": "true" }
不同WAF(如ModSecurity、Cloudflare、Nginx WAF)的日志格式可能差异较大,需明确日志中的字段排列方式及分隔符(例如空格、方括号、引号等)。
以解析ModSecurity审计日志为例:
[2025-10-05 14:30:23] [123456] [client 192.168.1.100] [attack_type "XSS"] [path "/submit.php"] [blocked "true"]
[%{TIMESTAMP_ISO8601:timestamp}] [%{NUMBER:event_id}] [client %{IP:client_ip}] [attack_type "%{WORD:attack_type}"] [path "%{PATH:request_path}"] [blocked "%{WORD:blocked}"]
通过工具(如Grok Debugger)测试模式是否准确匹配日志,若字段提取错误,需调整正则表达式或字段边界符。
从WAF日志中提取所有SQL注入(SQLi)攻击事件,并统计攻击来源TOP 10 IP。
%{IP:client_ip} - %{USERNAME:user} [%{HTTPDATE:timestamp}] "%{WORD:method} %{URIPATH:path} HTTP/%{NUMBER:http_version}" %{NUMBER:status} "%{DATA:user_agent}" "attack_type=%{WORD:attack_type}"
{ "query": { "match": { "attack_type": "SQLi" } } }
SELECT client_ip, COUNT(*) as attack_count FROM waf_logs WHERE attack_type = 'SQLi' GROUP BY client_ip ORDER BY attack_count DESC LIMIT 10;
精细化字段提取
%{DATA}
或%{GREEDYDATA}
匹配动态内容(如含空格的路径)。 []
)需转义,例如[%{IP:client_ip}]
。性能优化
grok
插件的break_on_match
参数,提升解析效率。日志标准化
建议在WAF配置中启用标准化的日志格式(如JSON),降低Grok编写难度。
通过Grok解析后的结构化数据,可进一步结合监控工具实现:
blocked=false
时(即未拦截攻击),触发企业微信/钉钉通知。