понедельник, 27 июня 2016 г.

Splunk. Подключаем списки серверов Proxy и Tor. Часть 3.

Приветствую, уважаемый читатель!

Сегодня мы завершим обсуждение темы подключения списков Proxy и TOR к Splunk, а именно научимся использовать собранные данные в своих запросах, т.е. подключать к запросам данные из СУБД MySQL.




Итак, структурно запросы в СУБД из Splunk выглядят следующим образом (условии, что установлено и работает приложение DB Connect):

| dbxquery connection=<имя соединения> maxrows=<количество строк> query="<SQL-запрос в СУБД>"

  • в аргументе connection необходимо указать имя существующего подключения к СУБД. 
  • в аргументе query необходимо указать SQL-запрос (с учетом особенностей синтаксиса конкретной СУБД).


Пример:

| dbxquery shortnames=t connection=MySQL maxrows=17000 query="SELECT * FROM Splunk.Proxy LIMIT 17000" 


В остальном, работа с событиями через DB Connect осуществляется идентично остальным источникам, и возможно использовать любые операторы SPL.

Дополнительно рекомендую добавлять аргумент shortnames=t, т.к. она позволяет избавиться от избыточности в названии столбцов. Если её не указать, то получите вот такое описание полей:



Возвращаясь к нашей теме, у нас есть 2 источника событий: журналы веб-сервера Apache и список серверов, загруженный в MySQL. Нам необходимо вывести только те события, у которых значение IP-адресе клиента совпадает с адресом из списка в MySQL. С точки зрения Splunk эта задача решается так:

  1. Пишутся 2 запроса (1-й для Apache и 2-й для MySQL) возвращающие события за конкретный интервал.
  2. Эти 2 запроса связываются между собой по какому-либо полю, которое должно присутствовать в обоих запросах.


Есть несколько операторов, с помощью которых можно выполнить подобное объединение, наиболее часто используется оператор join.

Результирующий запрос ниже:

sourcetype=Apache_access
| join type=inner clientip [| dbxquery shortnames=t connection=MySQL maxrows=17000 query="SELECT * FROM Splunk.Proxy LIMIT 17000"
| eval clientip = IP]
| stats values(useragent) by clientip


Долго думал, как правильнее написать, решил – разберём попайпово J

sourcetype=Apache_access  -  основной источник событий, т.е. именно к его данным осуществляется подстановка
| join type=inner clientip  - оператор join присоединяет друг к другу события из 2-х источников, по ключевому полю clientip (аргумент type позволяет явно указать тип объединения inner или left)
| dbxquery shortnames=t connection=MySQL maxrows=17000 query="SELECT * FROM Splunk.Proxy LIMIT 17000"   -  запрос, достающий события из БД
| eval clientip = IP  -  переименуем поле для использования в join, т.к. в MySQL такого поля нет
| stats values(useragent) by clientip  -  показываем все юзерагенты у IP-адресов, которые содержатся в списке




Когда мы объединяем между собой запросы, то в результирующий набор данных попадают все поля событий из обоих запросов (только для тех событий, которые совпали по значению поля).  
Например:

sourcetype=Apache_access
| join type=inner clientip [| dbxquery shortnames=t connection=MySQL maxrows=17000 query="SELECT * FROM Splunk.Proxy LIMIT 17000"
| eval clientip = IP]
| stats values(useragent) as Useragents,values(uri) as Url by clientip,Type



Таким образом, поставленную задачу мы решили, и теперь можно использовать в запросах списки Proxy и TOR. Всем удачи!



Комментариев нет:

Отправить комментарий