Fail2ban to oprogramowanie, które zabezpiecza serwery przed różnego rodzaju atakami siecowymi. Banuje adresy IP zapobiegając atakom brute-force, DDoS lub próbami wykorzystania exploitów. Jest to według mnie program, który musi być zainstalowany na każdym produkcyjnym serwerze HTTP, który jest otwarty na połączenia z zewnątrz.
Każdy tutorial, który traktuje o stawianiu serwerów, instalowaniu platformy LAMP powinien być zwieńczony instalacją i konfiguracją fail2ban. Aby się o tym przekonać jak ważny jest ten krok, wystarczy chociaż pobieżnie przeanalizować logi serwera (access.log i error.log). Każda strona z jakimkolwiek ruchem i przeciętnym stażem jest obciążona ciągłymi atakami brute-force, próbami wykorzystania exploitów i innych podatności – tym bardziej jeżeli używa popularnego systemu CMS.
Jak już niejednokrotnie wspominałem, takie zapytania o nieistniejące zasoby, ciągłe wypełnianie formularzy logowania i sztuczny ruch botów niepotrzebnie obciąża nasz hosting i może zauważalnie pogarszać doświadczenia prawdziwych użytkowników naszej strony.
Jak działa fail2ban?
Zasada działania programu fail2ban jest niesamowicie prosta. Fail2ban skanuje logi serwera (najczęściej access.log i error.log). W logach utrwalane są dosłownie wszystkie zapytania HTTP jakie kierowane są do serwera. Plik access.log zawiera listę zapytań HTTP o takie zasoby jak pliki HTML i załączniki w postaci obrazków czy innych plików statycznych. Zawiera ścieżkę do pliku, dokładną datę i czas zapytania, adres IP serwera odpytującego i informację o urządzeniu. Jeden „rekord” z takiego dziennika wygląda tak:
95.41.136.7 - - [29/Mar/2022:12:23:28 +0000] "GET /wp-admin/ HTTP/2.0" 302 493 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36"
Można z niego odczytać, że Internauta dysponujący urządzeniem, którego karta sieciowa ma podany adres IP odwiedziła stronę /wp-admin/ o konkretnej godzinie i wykorzystał przy tym nowoczesną przeglądarkę. Plik access.log zawiera wiele takich wpisów i zdarza się, że pod koniec dnia plik taki może ważyć nawet kilkanaście megabajtów. Pliki takie są kompresowane aby administrator zawsze miał dostęp do logów z ostatnich 14 dni.
Fail2ban następnie konfrontuje je ze specjalnymi regułami banowania tzw. filtrami, które ustawia administrator. Jeżeli aktywność hosta o danym adresie IP zgadza się z regułą i przekroczył limity podane w pliku jail.conf lub jail.local jest on banowany czyli blokowany przez określony okres czasu. Filtry fail2ban to proste pliki konfiguracyjne, które przechowują dwie reguły w postaci dwóch wyrażeń regularnych: failregex i ignoreregex.
Failregex to definicja aktywności hosta, która powinna naliczyć coś w rodzaju punktu karnego – może to być strzał do formularza logowania lub do pliku xmlrpc.php. Z kolei ignorerexex to wyrażenie, które (jak sama nazwa wskazuje) ma wykluczyć konkretne zapytanie jako potencjalnie niedozwolone – może to być reguła, wyklucza konkretny adres IP. Jeżeli teraz dojdzie do niechcianych żądań w ilości większej niż maxretry w czasie findtime to program fail2ban dopisuje do iptables regułę blokującą dany adres IP na okres bantime.
Jak korzystać z fail2ban?
Opis działania fail2ban najlepiej będzie zilustrować konkretnym przykładem. Na sam początek zainstalujemy program fail2ban. Potem stworzymy filtr blokujący nadmierne zapytania o nieistniejące lub przeniesione zasoby (błąd 404) i wprowadzimy filtr do pliku konfiguracyjnego jail.local
Instalacja fail2ban
Fail2ban instalujemy poleceniem:
sudo apt-get install fail2ban
Działaniem fail2ban możemy sterować za pomocą instrukcji:
sudo systemctl start fail2ban sudo systemctl stop fail2ban sudo systemctl restart fail2ban sudo systemctl status fail2ban
Przykład konfiguracji jail.conf i filtru na przykładzie błędu 404
Fail2ban posiada już pewne domyślne filtry i jest gotowy do działania. Filtry znajdują się w folderze /etc/fail2ban/filter.d a domyślna konfiguracja znajduje się w pliku /etc/fail2ban/jail.conf. Możemy stworzyć własny filtr o nazwie error-404.conf. Sensem zabezpieczenia jest przeciwdziałanie skanowaniu w poszukiwaniu konkretnych plików z podatnościami.
sudo nano error-404.conf
Następnie wprowadzamy definicję:
[Definition] failregex = ^ - .* "(GET|POST|HEAD).HTTP." 404 .*$ ignoreregex =.*(robots.txt|sitemap.xml|favicon.ico|jpg|png)
Chcemy zatem zliczać błędy 404 ale pomijać takie pliki jak robots.txt, sitemap.xml i formaty graficzne.
W pliku konfiguracyjnym /etc/fail2ban/jail.local dodajemy coś takiego:
[error-404] enabled = true port = http,https filter = error-404 logpath = /var/log/apache2/*access.log maxretry = 5 findtime = 3600 bantime = 2629743 ignoreip =
Powyższa konfiguracja znaczy tyle co: blokuj na miesiąc hosty, które w ciągu godziny wywołały 5 błędów określonych w pliku error-404.conf (czyli błędów 404).
Obsługa fail2ban
Zbanowane adresy IP możemy podejrzeć za pomocą fail2ban-client:
sudo fail2ban-client -i
W trybie interaktywnym możemy teraz sprawdzić zbanowane adresy w ramach filtra error-404:
fail2ban> status error-404

Może się zdarzyć że chcemy usunąć blokadę dla danego adresu IP, wtedy w trybie interaktywnym fail2ban-client wykonujemy komendę:
set nazwa_filtra unbanip 123.123.123.123
Z trybu interaktywnego wychodzimy za pomocą komendy exit.
Inne przykłady filtrów fail2ban
Tworzenie własnych filtrów to największa moc programu fail2ban. Spójrzmy na kolejne przykłady:
Blokowanie ataków brute-force
Za pomocą fail2ban można stworzyć prosty filtr, który będzie zliczał wywołania takich stron jak login.php czy admin.php. Można zatem zliczać takie zapytania za pomocą takiego filtra bruteforce.conf:
[Definition] failregex = ^ -.(GET|POST|HEAD).(/wp-login.php) ignoreregex =
W pliku jail.local dodajemy filtr:
[bruteforce] enabled = true port = http,https filter = bruteforce logpath = /var/log/apache2/*access.log maxretry = 10 findtime = 120 bantime = 31556926 ignoreip =
10 zapytań wykonanych w ciągu 120 sekund zablokują adres IP na rok – nie ma się co rozdrabniać.
Blokowanie exploitów
Strony internetowe często są skanowane w poszukiwaniu znanych podatności:
[Definition] failregex = ^ -.*(GET|POST|HEAD).*(/autodiscover/autodiscover.xml) ^ -.*(GET|POST|HEAD).*(/owa/auth/logon.aspx) ^ -.*(GET|POST|HEAD).*(/remote/login) ^ -.*(GET|POST|HEAD).*(/.env) ^ -.*(GET|POST|HEAD).*(/.git/config) ignoreregex =
W takim filtrze można dopisać ścieżki, które irytują nas w logach. Za każdym razem, kiedy ktoś choć raz odwiedzi tego typu adresy proponuję blokadę… na rok 🙂
Podsumowanie
Fail2ban to podstawowe narzędzie do blokowania intruzów, skryptów poszukujących podatności i szkodliwych robotów. Prostota działania zapewnia skuteczne działanie i umożliwia łatwo tworzyć własne reguły banowania. Reguły fail2ban można łączyć z innymi technikami zabezpieczeń np. blokadami ruchu sieciowego z konkretnych krajów, których wejścia są dla nas mało wartościowe a w 99% są to ataki.
Gdyby wszyscy korzystali z tego typu narzędzi to ruch sieciowy byłby zdecydowanie zdrowszy a ataki brute-force byłyby wspominane na zajęciach z historii Informatyki. Niestety, mało kto zdaje sobie sprawę jak dużo ruchu do naszego serwera to zwykły SPAM i ataki brute-force. Mam nadzieję, że artykuł zachęci do sprawdzenia zawartości logów i działań w kierunku ograniczenia szkodliwych zapytań.
Źródła
Odpowiedz lub skomentuj