Есть ли способ проанализировать URIPATHPARAM, когда URL-адрес содержит недопустимые символы?

Краткая предыстория: использование логирования доступа из 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-адресов и отбрасывало мусор?


person Kristofer    schedule 03.06.2016    source источник
comment
интересно ваш первый пример не сломал мой грок, но я понимаю вашу точку зрения   -  person Will Barnwell    schedule 03.06.2016


Ответы (1)


Да, используя способность grok к множественному совпадению.

https://groups.google.com/forum/#!topic/logstash-users/H3_3gnWY2Go

https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html#plugins-filters-grok-match

В сочетании с 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
  }
}
person Will Barnwell    schedule 03.06.2016
comment
Если вы хотите сохранить поле с именем url, вы можете позже использовать фильтр мутации, который переименовывает bad_url в url и добавляет тег, что это неверный URL-адрес, если bad_url существует. - person Will Barnwell; 03.06.2016