Analiza Logów Linuksa

W logach Linuksa znajduje się wiele informacji, ale wyzwaniem jest wiedzieć jak je wydobyć. Istnieje wiele narzędzi, których można użyć do tego celu, od narzędzi wiersza poleceń do bardziej zaawansowanych narzędzi analitycznych zdolnych do wyszukiwania określonych pól, obliczania podsumowań, generowania wykresów i wielu innych.

W tej sekcji pokażemy jak używać niektórych z tych narzędzi i jak rozwiązania do zarządzania logami takie jak SolarWinds® Loggly® mogą pomóc zautomatyzować i usprawnić proces analizy logów.

Szukanie za pomocą grep

Jednym z najprostszych sposobów analizy logów jest przeszukiwanie czystego tekstu za pomocą grep. grep jest narzędziem wiersza poleceń, które może wyszukiwać pasujący tekst w pliku lub w danych wyjściowych innych poleceń. Jest ono domyślnie dołączone do większości dystrybucji Linuksa, a także dostępne dla systemów Windows i Mac.

Aby wykonać proste wyszukiwanie, wpisz szukany tekst, a następnie plik, który chcesz przeszukać. Tutaj przeszukamy dziennik uwierzytelniania w poszukiwaniu linii zawierających „user hoover”.

$ grep "user hoover" /var/log/auth.logpam_unix(sshd:session): session opened for user hoover by (uid=0)pam_unix(sshd:session): session closed for user hoover

Zauważ, że zwraca to linie zawierające dokładne dopasowanie. To czyni go użytecznym dla wyszukiwań, gdzie wiesz dokładnie czego szukasz.

Wyrażenia regularne

Wyrażenie regularne (lub regex) jest składnią do znajdowania pewnych wzorców tekstowych w pliku. Wyrażenia regularne są znacznie bardziej elastyczne niż zwykłe wyszukiwania tekstowe, pozwalając na użycie wielu technik poza prostym dopasowywaniem łańcuchów. Pozwalają na wysoki stopień kontroli, ale skonstruowanie dokładnego wzorca może być trudne.

Na przykład, powiedzmy, że chcemy znaleźć próby uwierzytelnienia na porcie 4792. Proste wyszukiwanie „4792” pasowałoby do portu, ale mogłoby również pasować do znacznika czasu, adresu URL lub innej liczby. W tym przypadku, pasowało to do logu Apache’a, który miał 4792 w adresie URL.

$ grep "4792" /var/log/auth.logAccepted password for hoover from 10.0.2.2 port 4792 ssh274.91.21.46 - - "GET /scripts/samples/search?q=4792HTTP/1.1" 404 545 "-" "-”

Aby temu zapobiec, moglibyśmy użyć regexa, który zwróci tylko przypadki 4792 poprzedzone „portem” i pustą spacją. Zrobimy to używając techniki znanej jako positive lookbehind. Nasze wyrażenie wygląda tak (flaga -P wskazuje, że używamy składni wyrażenia regularnego Perla).

$ grep -P "(?<=port\s)4792" /var/log/auth.logAccepted password for hoover from 10.0.2.2 port 4792 ssh2

Szukanie dookoła

Użycie wyszukiwania dookoła zwraca pewną liczbę linii przed lub po dopasowaniu. Zapewnia to kontekst dla każdego zdarzenia, pozwalając prześledzić zdarzenia, które doprowadziły do zdarzenia lub bezpośrednio po nim nastąpiły. Flaga -B określa, ile linii ma zostać zwróconych przed zdarzeniem, a flaga -A określa liczbę linii po zdarzeniu.

Na przykład, wyszukajmy próby logowania z nieprawidłową nazwą użytkownika i pokażmy wyniki wyszukiwania otaczającego. Widzimy, że użytkownicy, którzy nie zdołają się zalogować, nie zdołają również sprawdzić odwrotnego mapowania. Oznacza to, że klient nie posiada poprawnego rekordu DNS, co jest częste w przypadku publicznych połączeń internetowych. Nie oznacza to, że Twój serwer SSH jest podatny na ataki, ale może oznaczać, że napastnicy aktywnie próbują uzyskać do niego dostęp.

$ grep -B 3 -A 2 'Invalid user' /var/log/auth.logApr 28 17:06:20 ip-172-31-11-241 sshd: reverse mapping checking getaddrinfo for 216-19-2-8.commspeed.net failed - POSSIBLE BREAK-IN ATTEMPT!Apr 28 17:06:20 ip-172-31-11-241 sshd: Received disconnect from 216.19.2.8: 11: Bye Bye Apr 28 17:06:20 ip-172-31-11-241 sshd: Invalid user admin from 216.19.2.8Apr 28 17:06:20 ip-172-31-11-241 sshd: input_userauth_request: invalid user admin Apr 28 17:06:20 ip-172-31-11-241 sshd: Received disconnect from 216.19.2.8: 11: Bye Bye 

Tail

Tail to kolejne narzędzie wiersza poleceń, które może wyświetlać ostatnie zmiany w pliku w czasie rzeczywistym. Jest to przydatne do monitorowania trwających procesów, takich jak ponowne uruchomienie usługi lub testowanie zmiany kodu. Możesz również użyć tail do wydrukowania kilku ostatnich linii pliku, lub sparować go z grepem do filtrowania danych wyjściowych z pliku logu.

$ tail -f /var/log/auth.log | grep 'Invalid user'Apr 30 19:49:48 ip-172-31-11-241 sshd: Invalid user ubnt from 219.140.64.136Apr 30 19:49:49 ip-172-31-11-241 sshd: Invalid user admin from 219.140.64.136

Pełne wprowadzenie do grep i wyrażeń regularnych jest poza zakresem tego przewodnika, ale możesz znaleźć więcej zasobów na końcu tej sekcji.

parse

Cut

Komenda cut pozwala na parsowanie pól z delimitowanych logów. Delimitery to znaki takie jak znaki równości lub przecinki, które rozdzielają pola lub pary klucz-wartość.

Powiedzmy, że chcemy wyodrębnić użytkownika z tego logu.

pam_unix(su:auth): authentication failure; logname=hoover uid=1000 euid=0 tty=/dev/pts/0 ruser=hoover rhost= user=root

Możemy użyć polecenia cut w ten sposób, aby uzyskać ósme dopasowanie. Ten przykład jest na systemie Ubuntu.

$ grep "authentication failure" /var/log/auth.log | cut -d '=' -f 8root

Filtrowanie i parsowanie z Awk

Filtrowanie pozwala na wyszukiwanie na podstawie konkretnej wartości pola, zamiast przeszukiwania całego tekstu. Sprawia to, że twoja analiza logu jest dokładniejsza, ponieważ ignoruje niepożądane dopasowania z innych części wiadomości logu. Aby wyszukiwać po wartości pola, musisz najpierw sparsować logi, lub przynajmniej mieć sposób na wyszukiwanie na podstawie struktury zdarzeń. Aby to zrobić, możemy użyć awk.

Awk jest potężnym narzędziem wiersza poleceń, które zapewnia kompletny język skryptowy, dzięki czemu można filtrować i parsować pola bardziej efektywnie. Na przykład, załóżmy, że chcemy wyodrębnić nazwę użytkownika z wszystkich nieudanych prób logowania. Nasze logi mają następujący format.

Mar 24 08:28:18 ip-172-31-11-241 sshd: input_userauth_request: invalid user guest 

Oto jak można użyć polecenia awk. Najpierw użyjemy wyrażenia regularnego /sshd.*invalid user/, aby dopasować linie invalid user sshd. Następnie wypisujemy dziewiąte pole używając domyślnego ogranicznika (znaku spacji) za pomocą { print $9 }. W ten sposób otrzymamy nazwy użytkowników.

$ awk '/sshd.*invalid user/ { print $9 }' /var/log/auth.logguest

Filtrowanie błędów za pomocą Awk

Jedną z najczęstszych rzeczy, które ludzie chcą zobaczyć w swoich logach są błędy. Niestety, domyślna konfiguracja sysloga nie podaje bezpośrednio powagi błędów, co utrudnia filtrowanie na nich.

Są dwa sposoby na rozwiązanie tego problemu. Po pierwsze, możesz zmodyfikować swoją konfigurację rsyslog, aby wyświetlić powagę w pliku logu, aby ułatwić jego odczyt i wyszukiwanie. W konfiguracji rsyslog możesz dodać szablon z tekstem pri-text, taki jak poniższy.

"<%pri-text%> : %timegenerated%,%HOSTNAME%,%syslogtag%,%msg%n"

Ten przykład daje wyjście w następującym formacie. Możesz zobaczyć, że powaga w tym komunikacie to „err”:

<authpriv.err> : Mar 11 18:18:00,hoover-VirtualBox,su:, pam_authenticate: Authentication failure

Możesz użyć awk, aby wyszukać tylko komunikaty o błędach. W tym przykładzie, dołączamy trochę otaczającej składni, aby dopasować to pole konkretnie.

$ awk '/.err>/ {print}' /var/log/auth.log<authpriv.err> : Mar 11 18:18:00,hoover-VirtualBox,su:, pam_authenticate: Authentication failure

Narzędzia wiersza poleceń są przydatne do szybkiego wyszukiwania w małych plikach, ale nie skalują się dobrze do dużych plików lub wielu systemów. Systemy zarządzania logami są o wiele bardziej efektywne w szybkim przeszukiwaniu dużych ilości danych z logów. Systemy zarządzania logami omówimy w następnej sekcji.

Szukanie za pomocą systemów zarządzania logami

Systemy zarządzania logami upraszczają proces analizowania i przeszukiwania dużych zbiorów plików logów. Mogą one automatycznie przetwarzać typowe formaty logów, takie jak zdarzenia syslog, logi SSH i logi serwera WWW. Indeksują również każde pole, dzięki czemu można szybko przeszukiwać gigabajty, a nawet terabajty danych z logów. Często używają języków zapytań takich jak Apache Lucene, aby zapewnić bardziej elastyczne wyszukiwanie niż grep z łatwiejszą składnią wyszukiwania niż regex. Oszczędza to zarówno czas jak i wysiłek, ponieważ nie trzeba tworzyć własnej logiki parsowania dla każdego unikalnego wyszukiwania.

Na przykład, tutaj zbieramy logi z serwera Debian używając SolarWinds® Loggly®, chmurowej usługi zarządzania logami. Oto przykładowy komunikat logu z sshd, który automatycznie wyodrębnia pole użytkownika.

Nieudana próba logowania sparsowana przez Loggly.

Można również wykonać niestandardowe parsowanie dla niestandardowych formatów. Używając pól pochodnych, możemy parsować nieparsowaną część wiadomości poprzez zdefiniowanie jej układu. Pozwala to na indeksowanie każdego pola w niesparsowanych danych, zamiast traktować je jako pojedynczy ciąg znaków. Na przykład, możemy utworzyć nowe pole o nazwie „auth_stage” i użyć go do przechowywania etapu procesu uwierzytelniania, w którym wystąpił błąd, który w tym przykładzie to „preauth”.

Przeglądanie pola pochodnego w Eksploratorze pól Loggly.

Filtrowanie błędów za pomocą systemów zarządzania logami

Systemy zarządzania logami ułatwiają filtrowanie błędów, ponieważ automatycznie przetwarzają logi za nas. W wielu przypadkach wystarczy kliknąć na wybrane pole i wpisać wartość, aby przefiltrować wynikowe logi. Na przykład, możemy wyświetlić błędy w Loggly klikając na pole syslog severity i wybierając „Error”.

Filtrowanie na komunikatach syslog z severity „Error” w SolarWinds Loggly.

Grep i wyrażenia regularne! (Ryans Tutorials)

Podręcznik użytkownika GNU Awk (GNU)

Używanie Grep + Regex (Regular Expressions) do wyszukiwania tekstu w Linuksie (DigitalOcean)

Zobacz to. Analizuj. Inspect it. Solve it

Zobacz, co ma znaczenie.

START DARMOWA PRÓBA

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *