Monitorowanie błędnych prób logowania po SSH
Przeglądając logi serwera natknąłem się ostatnio na wiele błędnych prób logowania po SSH. Dostęp do mojego serwera jest skonfigurowany na logowanie po kluczu, więc nie jest to dla mnie problematyczne, aczkolwiek zawsze warto ulepszać swoje zabezpieczenia oraz wyrabiać dobre praktyki, więc w ramach rozwoju przyjrzałem się bliżej co tam się dzieje…
W logach co kilka minut przewijały się wpisy typu:
Dec 16 11:28:54 wombat sshd[7175]: Invalid user debian from 82.66.6.133 port 45216 |
Można przeglądać logi co trochę i obserwować co się dzieje, ale żeby mieć realny i przejrzysty wgląd w sytuację najlepiej przejrzeć się wykresom, które podsumują sytuację. Dlatego, też utworzyłem dashboard podsumowujący nieudane logowania po SSH wykorzystując do tego platformę New Relic.

Logi można zaprezentować na wykresie wyciągając konkretne wartości z każdego z wpisów. Wymaga to odpowiednio filtrowania oraz parsowania wpisów, które zebrał nam New Relic z pliku /var/log/secure
.
Filtrowanie logów
Jeśli chodzi o samo filtrowanie to można zrobić to bardzo prosto, wystarczy ustawić zapytanie NRQL
z klauzulą WHERE
na przykład:
WHERE hostname='nazwa_hosta'
WHERE filePath='/var/log/secure'
WHERE logtype='linux_secure'
Parsowanie logów
Sytuacja jest bardziej skomplikowana w przypadku parsowania, w przedstawionym na początku fragmencie logów mamy kilka linijek, aczkolwiek najbardziej informacyjna jest pierwsza. Największą trudnością może być zbudowanie odpowiedniego wyrażenia RE2
, które to jest wykorzystywane przez funkcję capture
umożliwiającą wyciąganie podciągu znaków z atrybutu New Relic. Więcej o funkcji capture
oraz składni RE2
możecie poczytać na stronach:
- https://docs.newrelic.com/docs/query-your-data/nrql-new-relic-query-language/get-started/nrql-syntax-clauses-functions/#func-capture
- https://github.com/google/re2/wiki/Syntax
Funkcje capture + RE2
Ja do wyciągnięcia informacji ułożyłem sobie następujące parametry funkcji capture
:
Filtrowanie po nazwach użytkowników:
1
capture(message,r'(.+) Invalid user (?P<user>\S+)*.+') as user
Filtrowanie po adresach IPv4:
1
capture(message,r'(.+) Invalid user (.+) from (?P<ip>\S+)*.+') as ip
Filtrowanie po portach:
1
capture(message,r'(.+) Invalid user (.+) from (.+) port (?P<port>\S+)*.+') as port
Głowny pattern RE2 dla wpisu o błędnej próbie logowania:
1
(.+) Invalid user (?P<user>\S+) from (?P<ip>\S+) port (?P<port>\S+)*
Tabele i wykresy
NRQL dla tabeli podsumowującej:
1 | SELECT capture(message,r'(.+) Invalid user (?P<user>\S+)*.+') as user, capture(message,r'(.+) Invalid user (.+) from (?P<ip>\S+)*.+') as ip, capture(message,r'(.+) Invalid user (.+) from (.+) port (?P<port>\S+)*.+') as port FROM Log WHERE message like '% sshd[%]: Invalid user % from % port %' LIMIT MAX |

Tworząc z podanych wcześniej funkcji capture oraz zapytań NRQL można stworzyć dashboard dający nam wgląd w przejrzystą historię prób logowań. Dzięki temu mogę w szybki i łatwy sposób zobaczyć ile dokonywano prób włamania się na mój serwer. Efekt końcowy jest według mnie przejrzysty i miły dla oka. A ty drogi czytelniku jak monitorujesz tego typu aktywności? 😄 Napisz w komentarzu.
Źródła:
- [1] New Relic Youtube Tutorial: https://youtu.be/hOPrTWYgPHg
- [2] RE2 Syntax: https://github.com/google/re2/wiki/Syntax
- [3] Regex Online Sandbox: https://regex101.com/
Monitorowanie błędnych prób logowania po SSH