Splunk to jeden z najpopularniejszych systemów typu SIEM, szeroko wykorzystywany w wielu firmach i jedno z podstawowych narzędzi do analizy logów w SOC. Dziś postaram się przybliżyć podstawowe komendy SPL (Search Processing Language), które najczęściej wykorzystuję.
Oczywiście jest to tylko tip of the iceberg i SPL potrafi dużo więcej i być może w kolejnym artykule opiszę dużo bardziej zaawansowane zapytania i ich zastosowanie w analizie logów. Na ten moment zaczynamy z pierwszą komendą, bez której ciężko wyobrazić sobie pracę w Splunku.
Wszystkie zapytania można wypróbować samemu, pobierając i importując logi botsv2 przygotowane przez zespół Splunka na potrzeby ich Boss of Splunk. Swoją drogą gorąco polecam udział w tych zawodach, jak i obecną stronę, gdzie nadal można rozwiązywać zadania.
- Botsv2 - pobieramy wersję Full - 16.4 GB
- Boss of Splunk - zachęcam do rejestracji i ćwiczeń
Wszystkie przedstawione w artykule zapytania bazują na:
index=botsv2 sourcetype="stream:http" earliest=08/30/2017:00:00:00 latest=09/01/2017:00:00:00
KOMENDA STATS
Komenda stats jest kluczowa w naszych analizach w SPL. Za jej pomocą możemy dokonywać bardzo wielu kalkulacji, ale nie tylko - pozwala nam tworzyć dużo bardziej skomplikowane zapytania.
Funkcje, które najczęściej wykorzystuję to:
- count()
- distinct_count()/dc() - pozwala zliczać różne wartości w polach
- sum()
- avg()
- median()
- min()
- max()
Przydatne również są:
- values()
- list()
Oraz funkcje czasowe:
- earliest()
- latest()
Możemy używać wielu wymienionych wyżej funkcji w jednej komendzie stats, np.:
| stats values(user_name), values(host), values(dest), count by ...
Nazwy wyników możemy dostosowywać za pomocą AS, czyli np. pole dest możemy zmienić na ip_docelowe lub coś podobnego wg własnego uznania:
| stats values(user_name), values(host), values(dest) as ip_docelowe
Teraz kilka prostych przykładów zastosowania na naszych logach botsv2:
| stats count by src_ip dest_ip
| sort -count
Za pomocą powyższej komendy zobaczymy, pomiędzy którymi adresami IP dochodziło do najczęstszych połączeń w podziale na src i dest IP.
Kolejny przykład to:
| stats dc(dest_ip) AS dc by src_ip
| sort -dc
Wynikiem tego zapytania będzie źródłowy adres IP, który miał najwięcej połączeń z różnymi adresami docelowymi.
I jeszcze jeden przykład zastosowania:
| stats max(bytes) AS max by src_ip
| sort -max
Otrzymany wynik to źródłowy adres IP, którego transfer danych był największy.
KOMENDA EVAL
Komenda eval będzie prawdopodobnie jedną z najczęściej wykorzystywanych przez Was komend w Splunku (tak jest w moim przypadku :D). Jest to "nóż szwajcarski" SPLa. Pozwala tworzyć nowe pola lub nadpisać już używane.
Eval może działać na wartościach typu string czy numbers, a także dokonywać obliczeń.
Przykład zastosowania komendy:
| fields src_ip, src_port
| eval src_ip_port = src_ip . ":" . src_port
Omówmy komendę na przykładzie src_ip i src_port. Komenda eval wykorzystuje operator kropki (.) do konkatenacji (łączenia) stringów, natomiast dwukropek (:) został użyty jako separator pomiędzy adresem IP a numerem portu, tworząc w ten sposób pole o nazwie src_ip_port.
FIELDS, TABLE, SORT
Teraz trzy komendy, które są bardzo proste, dlatego opiszę je w jednej sekcji.
Fields
Komenda fields pozwala nam zarządzać polami, które chcemy widzieć, np.:
| fields - src_ip, src_port
Komenda usuwa dwa pola src_ip i src_port.
Table
Komenda table działa podobnie jak komenda fields, jednak nie usuwa żadnych pól, a jedynie wyświetla wybrane przez nas.
Sort
Nie ma tutaj dużej filozofii, komenda sort pozwala nam sortować wskazane przez nas wartości. Możemy sortować rosnąco lub malejąco. Co ważne, komenda sortuje automatycznie niezależnie, czy dane są w formacie string, numbers czy np. adresy IP.
Przykład użycia komendy razem w połączeniu z table:
| table src_ip, dest_port
| sort by src_ip
TOP I RARE
Kolejne dwa bardzo proste zapytania, które są często wykorzystywane w pracy, ponieważ jako analitycy często szukamy odstępstw od średniej.
Komendy top i rare pozwalają przeszukać eventy w poszukiwaniu najczęściej występujących wedle zdefiniowanych przez nas pól lub najrzadszych.
Komendy defaultowo pokazują top 10, ale można to oczywiście dostosować za pomocą komendy limit. Przykład zastosowania:
| top src_ip dest_port
Zapytanie pokazuje top 10 adresów IP w kombinacji z portem, które występowały najczęściej i wygenerowały największą liczbę zdarzeń. W ten sam sposób możemy użyć komendy rare, zastępując top.
Komendy tworzą nam dwa dodatkowe pola count i percent, które pokazują udział % w zestawieniu i liczbę eventów.
KOMENDA REX
Komenda rex pozwala nam tworzyć nowe pola na podstawie już istniejących za pomocą wyrażeń regularnych (regular expression). Działa podobnie jak eval, jednak w tym przypadku zamiast wyrażeń eval możemy korzystać z regexów.
Dodatkowo możemy używać mode=sed, który pozwala nam zastępować lub tworzyć nowe znaki w polach.
Przykład zastosowania komendy rex - niestety wymagana jest tutaj znajomość wyrażeń regularnych:
| rex field=http_user_agent "Windows\s+NT\s+(?<win_nt_version>[\d\.]+)"
Po krótce: za pomocą regexa wyciągamy z pola http_user_agent wersję Windows NT i tworzymy nowe pole o nazwie win_nt_version.
Drugi przykład użycia to mode=sed:
| rex mode=sed field=src_ip "s/(\d{1,3}\.\d{1,3}\.\d{1,3}\.)(\d{1,3})/\1x/g"
Komenda pozwala nam zmienić wartość w istniejącym już polu src_ip i ukryć ostatni oktet znakiem x. Docelowo otrzymamy coś takiego:
10.0.2.x
4.14.104.x
98.116.39.x
WHERE I DEDUP
I ostatni przykład w tym artykule, czyli komendy where i dedup.
Where
Komenda where pozwala nam porównywać wartość dwóch pól, dla przykładu:
| where bytes_out > bytes_in
gdzie filtrujemy eventy, gdzie liczba wysłanych bajtów jest większa niż odebranych. Jest to podstawowa różnica w stosunku do komendy search, która pozwala wyszukiwać konkretnych wartości, a nie zawierać w zapytaniu innych pól - dodatkowo możemy zawierać komendę eval. Wildcards są wspierane jedynie w postaci operatorów like i %.
Przykład zastosowania komendy eval w zapytaniu:
| where len(http_user_agent) > 200
Filtrujemy eventy, gdzie długość headera http jest dłuższa niż 200 znaków.
Dedup
Komenda dedup usuwa duplikaty, których zawsze jest bardzo dużo, np. w przypadku adresów IP:
| dedup src_ip dest_ip
| table src_ip dest_ip http_method uri_path
PODSUMOWANIE
Tak jak wspomniałem na początku, jest to tylko niewielka część możliwości SPL. Zachęcam do zapoznania się z linkami na początku artykułu i do własnych analiz z wykorzystaniem wszystkich komend, które starałem się przedstawić.