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

Oceń artykuł na temat: Co to jest fail2ban i jak z niego korzystać?
Średnia : 4.9 , Maksymalnie : 5 , Głosów : 7