Приветствую,
уважаемый читатель!
Давно
что-то не писал ничего, но думаю вскоре исправлюсь :) Сегодня мы подключим к
Splunk TCP-сокет, который будет получать события, генерируемые
powershell скриптом. На практике использование слушающих сокетов для получения
событий встречается достаточно часто, например, получение событий через syslog.
Итак приступим.
Первое, что
нам необходимо, это создать новый Data Input. Для этого перейдите в раздел меню Settings -> Data Inputs.
Откроется меню как на скриншоте ниже, в котором необходимо нажать на пункт "TCP".
Нажмите на кнопку "New" и в открывшемся окне укажите
номер TCP-порта, который будет слушать Splunk.
Нажмите далее, и в следующем окне необходимо выбрать Sourcetype для добавляемого источника, указать в каком приложении будет доступен (по умолчанию выбран Search & Reporting), указать как определять поле Host (мне больше нравится по IP-адресу), ну и конечно выбрать Index для хранения событий.
Нажмите на кнопку Submit, и если всё прошло удачно, то Splunk предложит сразу начать поиск по созданному Data Input. Проверить слушает ли Splunk сокет можно командой - netstat -napt | grep 3030.
После того, как мы создали новый источник данных настало время что-нибудь туда послать. Для эксперимента предлагаю использовать скрипт из этого поста http://unitybas.blogspot.ru/2015/11/powershell-netstat.html, но нам его надо немного прокачать.
Во-первых, добавим в начале скрипта код написанный ниже:
$Ihost = $env:COMPUTERNAME
$Ssocket = 'xxx.120.244.xxx:3030'
$Ssource = 'tcp:3030'
$Type = 'Netstat'
$timeSplunk = (Get-Date).ToString("dd/MM/yyyy HH:mm:ss" )
Тут мы указываем для сервера Splunk следующую информацию:
- имя
компьютера откуда пришли данные;
- сокет, куда
слать данные;
- имя для
нового Source;
- тип данных
для следующей фильтрации в запросе;
- время для индексирования события.
Во-вторых, в конец скрипта необходимо добавить код, с помощью
которого мы пройдемся по коллекции объектов и отправим их на сервер Splunk:
foreach ($proc in $ProcessCollection) {
[string]$to_splunk = 'CollectTime={0}; HostName={1}; Type={2}; Protocol={3}; LocalIP={4};
LocalPort={5}; PID={6}; ProcName={7}; procPath={8}; MemUsed={9}; CompName={10};
RemoteIP={11}; RemotePort={12};' - $timeSplunk, $Ihost , $Type , $proc.Protocol, $proc.LocalIP, $proc.LocalPort, $proc.PID, $proc.ProcName, $proc.procPath, $proc.MemUsed, $proc.CompName, $proc.RemoteIP, $proc.RemotePort
.\SendToSplunk.exe –server $Ssocket -host $Ihost -source $Ssource -event "$to_splunk "
}
Наверное возник вопрос, что за магический SendToSplunk.exe :) Это
очень удобная софтина, которую можно взять тут - https://helgeklein.com/free-tools/sendtosplunk-send-text-data-splunk-tcp-port/
и она позволяет послать текстовую строку на Splunk-сервер.
На сайте есть описание всех возможностей софтины, но если кратно,
то ей необходимо указать на какой сервер слать, какой Host и Sourcetype выставить
в служебных полях, и собственно событие.
Если записать pcap во время пересылки данных, то мы увидим, что SendToSplunk
просто шлет на сервер строку в ASCII.
tcpdump -i eth0 -n port 3030 -w /tmp/TCP.pcap
Теперь, когда данные пришли, самое время из посмотреть. Для этого в строке поиска вбейте запрос представленный ниже:
sourcetype=inventory
Type="Netstat" Protocol="TCP"
| table CollectTime Protocol, LocalIP, LocalPort, RemoteIP, RemotePort, PID, ProcName, procPath, MemUsed
| table CollectTime Protocol, LocalIP, LocalPort, RemoteIP, RemotePort, PID, ProcName, procPath, MemUsed
| sort -CollectTime
Если получили таблицу как на скрине, значит всё успешно.
Всем удачного использования :)
Комментариев нет:
Отправить комментарий