快速背景:使用HAProxy的访问日志记录并使用grok解析它。 HAProxy的%{+ Q} r日志变量打印"<http verb> <uri> <HTTP version>"
我们正在解析
"%{WORD:method} %{URIPATHPARAM:url} HTTP/%{NUMBER:httpversion}"
这适用于大多数请求但是当我们遇到各种类型的扫描程序试图通过在URL中发送垃圾进行注入攻击等时,grok无法解析uri。以下是崩溃此grok过滤器的一些示例:
"GET /index.html?14068'#22><bla> HTTP/1.1"
"GET /index.html?fName=\Windows\system.ini%00&lName=&guestEmail= HTTP/1.1"
任何人都可以想到一个优先解析甚至无效的URI或者至少不会崩溃的解决方案,即解析尽可能多的URL并丢弃垃圾?
答案 0 :(得分:2)
是的,通过使用grok的多重匹配能力。
https://groups.google.com/forum/#!topic/logstash-users/H3_3gnWY2Go
当与break_on_match => true
(默认值)结合使用时,您可以为grok指定多个模式进行尝试,它会在找到匹配模式后停止并应用它。
在这里,如果第一个模式不起作用,它将尝试使用NOTSPACE的下一个模式,这将占用那些不良字符,并标记字段bad_url
而不是url
filter {
grok {
match => {
"message" => [
"%{WORD:method} %{URIPATHPARAM:url} HTTP/%{NUMBER:httpversion}",
"%{WORD:method} %{NOTSPACE:bad_url} HTTP/%{NUMBER:httpversion}"
]
}
break_on_match => true
}
}