fail2ban

Skuteczna ochrona przed atakami brute force. Część 1 – fail2ban

Liczba ataków na serwery i usługi internetowe rośnie lawinowo. Nowe serwery skanowane są pod względem podatności, pozostawionych domyślnych haseł oraz słabych konfiguracji zaledwie po kilku minutach po podłączeniu do sieci. Zarówno samo skanowanie jak i późniejsze ataki wykonywane są o każdej godzinie dnia i nocy, automatyczne i bez udziału człowieka.
W związku z tym skuteczna ochrona przed atakami brute force poprzez zastosowanie odpowiednich narzędzi IDS/IPS, stanowi kluczowy element w dzisiejszym cyfrowym świecie. Jednym z takich narzędzi jest Fail2Ban, które skutecznie chroni serwery przed atakami typu brute force i wieloma innymi rodzajami prób złamania zabezpieczeń. W tym artykule omówimy, czym jest Fail2Ban i jak go zainstalować oraz skonfigurować, aby poprawić bezpieczeństwo twojego systemu.

Fail2Ban jest pewnego rodzaju nakładką na IPtables, która blokuje ruch jeśli nastąpiła jakieś niewłaściwe zachowanie np próby skanowania, nieudane logowania itd. Fail2Ban potrafi analizować logi różnych usług w systemach Linux. Jest to możliwe dzięki mechanizmowi konfigurowalnych filtrów oraz zasad działania opartych na wyrażeniach regularnych.


„Bezpieczeństwo zaczyna się od przygotowania na najgorsze scenariusze.”

— Anonymous

1. Zasada działania

  1. Konfigurowalne filtry: Fail2Ban używa konfigurowalnych filtrów do określenia, jakie logi ma monitorować oraz jakie wzorce w nich szukać. Każdy filtr jest dostosowany do konkretnej usługi lub aplikacji. Na przykład, istnieją gotowe filtry dla popularnych usług takich jak SSH, Apache, Nginx, Postfix itp. Możesz także tworzyć własne filtry, jeśli obsługiwana usługa nie jest uwzględniona w domyślnych filtrach. W tym artykule pokażemy jak dodać własny filtr do obrony Nextcloud.
  2. Wyrażenia regularne: Filtry Fail2Ban opierają się na wyrażeniach regularnych, które pozwalają na precyzyjne określenie wzorców w logach. Wyrażenia regularne to zestawy reguł, które definiują, jakie ciągi znaków są uważane za pasujące do określonego wzorca. Na przykład, aby wykryć nieudane próby logowania w logach SSH, filtr może używać wyrażenia regularnego do znalezienia linii, które zawierają informacje o nieudanych próbach logowania.
  3. Zasady działania: Po zdefiniowaniu filtrów Fail2Ban określa, ile prób nieudanego logowania lub innych działań jest wymagane do zablokowania adresu IP oraz przez ile czasu ma być on zablokowany. Możesz dostosować te zasady w plikach konfiguracyjnych Fail2Ban.
  4. Monitorowanie logów: Fail2Ban regularnie monitoruje określone logi systemowe lub aplikacyjne, sprawdzając, czy jakiekolwiek linie odpowiadają zdefiniowanym filtrom i wyrażeniom regularnym. Jeśli zostanie spełniony warunek, czyli na przykład zostanie wykryta określona liczba prób nieudanego logowania, Fail2Ban podejmuje odpowiednie działania, takie jak tymczasowe zablokowanie adresu IP źródłowego ataku.

Dzięki tym mechanizmom Fail2Ban jest w stanie monitorować i reagować na różne rodzaje działań w logach różnych usług. Jest to szczególnie przydatne do ochrony serwerów przed próbami ataków typu brute force, które mogą występować w wielu różnych aplikacjach i usługach.

2. Instalacja

2.1 Instalacja Debian/Ubuntu

sudo apt-get update
sudo apt-get install fail2ban
systemctl status fail2ban.service

2.2 Instalacja CentOS/Red Hat/Rocky

ym update
yum install fail2ban fail2ban-systemd
yum update -y selinux-policy*
systemctl enable fail2ban
systemctl start fail2ban

3. Konfiguracja

Pliki konfiguracyjne i katalogi File2Ban:

  • /etc/fail2ban/filter.d/ – Zawiera zestaw predefiniowanych filtrów (regex). Przeważnie nie musimy się tym przejmować, chyba że chcemy napisać swój filtr.
  • /etc/fail2ban/jail.conf – Główny plik konfiguracyjny, jednak nie zaleca się jego bezpośredniej modyfikacji.
  • /etc/fail2ban/jail.local – Twój dostosowany plik konfiguracyjny. Służy do konfigurowania reguł i filtrowania, które „fail2ban” ma zastosować do konkretnych usług i logów. W tym pliku definiowane są konkretne reguły dla usług, takie jak SSH, Apache, czy inne. Możesz dostosować parametry dla każdej reguły, takie jak maksymalna liczba nieudanych prób, czas blokady, itp.
  • /etc/fail2ban/fail2ban.conf – Ten plik zawiera ogólne ustawienia konfiguracyjne dla „fail2ban”. Możesz w nim znaleźć globalne opcje konfiguracyjne dotyczące działania samego „fail2ban” których raczej nie zmieniamy.

Po zainstalowaniu „fail2ban” skopiuj domyślny plik konfiguracyjny do folderu /etc/fail2ban. Utworzenie pliku jail.local nie jest konieczne, a wynika raczej z dobrych praktyk, pozwoli na dokonywanie niestandardowych konfiguracji, które nie zostaną nadpisane podczas aktualizacji „fail2ban”.

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Teraz otwórz plik /etc/fail2ban/jail.local w edytorze tekstowym, aby skonfigurować reguły banowania i inne parametry

3.1 Obrona SSH

sudo nano /etc/fail2ban/jail.local

Przykład konfiguracji, w którym „fail2ban” będzie monitorować próby logowania SSH i blokować adresy IP po 3 nieudanych próbach w ciągu 10 minut. Blokada wyniesie 10 minut.

[sshd]
enabled = true
port = ssh   # port usługi z /etc/services
filter = sshd
logpath = /var/log/auth.log
maxretry = 3    #maksymalna ilość prób
findtime = 600  #czas znalezienia
bantime = 600   #czas bana
backend = systemd #integracja z systemem dzienników systemd

po zmianie konfiguracji należy oczywiście zrestartować usługę i sprawdzić jej status:

sudo systemctl restart fail2ban
sudo systemctl status fail2ban

W razie potrzeby możemy dodać konkretne adresy IP do białej listy, aby nie były nigdy blokowane:

ignoreip = 127.0.0.1/8

3.2 Obrona PhpMyAdmin

Fail2ban nie posiada domyślnie zdefiniowanych filtrów i akcji dla PhpMyAdmin dlatego też musimy stworzyć je ręcznie. Najpierw potrzebujemy skonfigurować nowe „więzienie” w naszym pliku jail.local lub dla przejrzystości konfiguracji tworzymy osobny plik w katalogu z dynamicznymi konfiguracjami:

vim /etc/fail2ban/jail.d/phpmyadmin.local
[phpmyadmin]
enabled = true
port = http,https
filter = phpmyadmin
action = iptables-multiport[name=PHPMYADMIN, port="http,https", protocol=tcp]
logpath = /var/log/nginx/access.log
bantime = 3600
findtime = 60
maxretry = 3

Załóżmy, że mam serwer Nginx na którym działa nasze PhpMyAdmin. W logach widzimy następujące wpisy

/var/log/nginx/access.log.1:218.65.30.61 - - [19/Sep/2023:01:41:23 +0000] "GET /phpmyadmin/index.php?pma_username=root&pma_password=qwerty&server=1 HTTP/1.1" 200 10050 "-" "Mozilla/5.0"
/var/log/nginx/access.log.1:218.65.30.61 - - [19/Sep/2023:01:41:23 +0000] "GET /phpmyadmin/index.php?pma_username=root&pma_password=toor&server=1 HTTP/1.1" 200 10050 "-" "Mozilla/5.0"
/var/log/nginx/access.log.1:218.65.30.61 - - [19/Sep/2023:01:41:23 +0000] "GET /phpmyadmin/index.php?pma_username=root&pma_password=r00t&server=1 HTTP/1.1" 200 10050 "-" "Mozilla/5.0"

Adres IP 218.65.30.61 próbuje się włamać wykorzystując bruteforce. Postaramy się nieco utrudnić mu życie. Tworzymy filtr /etc/fail2ban/filter.d/phpmyadmin.conf o zawartości:

[Definition]
failregex = ^<HOST> -.*"(GET|POST).*/phpmyadmin/index\.php\?pma_username=root&pma_password=.*$
ignoreregex =

Po zakończeniu tworzenia filtra warto go przetestować przed aktywacją. Do tego mamy fail2ban-regex:

fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/phpmyadmin.conf

Running tests
=============

Use   failregex filter file : phpmyadmin, basedir: /etc/fail2ban
Use         log file : /var/log/nginx/access.log
Use         encoding : UTF-8


Results
=======

Failregex: 6 total
|-  #) [# of hits] regular expression
|   1) [56] ^<HOST> -.*"(GET|POST).*/phpmyadmin/index\.php\?pma_username=root&pma_password=.*$
`-

Ignoreregex: 0 total

dodanie nowej konfiguracji wymaga oczywiście restartu usługi:

sudo systemctl restart fail2ban
fail2ban-client status phpmyadmin

3.3 Obrona Nextcloud

W przypadku Nextcloud sytuacja wygląda podobnie jak w przypadku PhpMyAdmin – sami musimy stworzyć odpowiednie filtry oraz dodać konfigurację. W tym celu dodajemy kolejną sekcję w naszym pliku jail.local lub dla przejrzystości konfiguracji tworzymy osobny plik w katalogu z dynamicznymi konfiguracjami:

vim /etc/fail2ban/jail.d/nextcloud.local
[nextcloud]
backend = auto
enabled = true
port = 80,443
protocol = tcp
filter = nextcloud
maxretry = 3
bantime = 86400
findtime = 43200
logpath = /path/to/data/directory/nextcloud.log

teraz tworzymy filtr:

vim /etc/fail2ban/filter.d/nextcloud.conf

zawartość:

[Definition]
_groupsre = (?:(?:,?\s*"\w+":(?:"[^"]+"|\w+))*)
failregex = ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Login failed:
            ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Trusted domain error.
datepattern = ,?\s*"time"\s*:\s*"%%Y-%%m-%%d[T ]%%H:%%M:%%S(%%z)?"

restartujemy i sprawdzamy status

sudo systemctl restart fail2ban
fail2ban-client status nextcloud

4. Obsługa

4.1 Sprawdzanie uruchomionych więzień

Do sprawdzania stanu poszczególnych więzień służy polecenie fail2ban-client:

sudo fail2ban-client status

Status
|- Number of jail:	2
`- Jail list:	sshd, nextcloud

4.2 Sprawdzanie statusu konkretnego więzienia

sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	0
|  `- File list:	/var/log/auth.log
`- Actions
   |- Currently banned:	0
   |- Total banned:	0
   `- Banned IP list:	

4.3 Odblokowywanie konkretnego IP

W przypadku gdy przez przypadek nastąpiła blokada jakiegoś adresu IP, możemy ją oczywiście usunąć:

fail2ban-client set nextcloud unbanip 185.202.58.98

5. Hints and tips

5.1 Ubuntu UFW

Domyślną wartością dla opcji „banaction” w „fail2ban” jest „iptables-multiport”. Opcja „banaction” określa narzędzie lub akcję, które „fail2ban” używa do blokowania adresów IP po przekroczeniu określonych próg. W przypadku „iptables-multiport”, „fail2ban” korzysta z narzędzia iptables, aby dodać regułę do zapory sieciowej i zablokować adres IP. Natomiast jeśli korzystamy z UFW możemy zintegrować z nim „fail2ban” tak aby wszystkie blokady były widoczne po wydaniu polecenia:

sudo ufw status

w tym celu w jail.local w sekcji globalnej ustawiamy:

banaction = ufw
banaction_allports = ufw

5.3 Sprawdzanie zbanowanych IP

Wszystkie historycznie zbanowane adresy IP zapisane są w logach, dlatego też w łatwy sposób możemy je przefiltrować i wykorzystać do dalszych celów:

zgrep 'Ban' /var/log/fail2ban.log*

Podsumowanie

Fail2Ban to potężne narzędzie do ochrony serwerów przed atakami typu brute force i wieloma innymi zagrożeniami. Instalacja i konfiguracja Fail2Ban na systemach Debian i RedHat są stosunkowo proste i mogą znacząco poprawić bezpieczeństwo twojego systemu. Pamiętaj, że skuteczność Fail2Ban zależy od odpowiedniej konfiguracji, więc warto poświęcić czas na dostosowanie go do własnych potrzeb. Dzięki temu możesz spać spokojnie, wiedząc, że twoje serwery są lepiej chronione przed potencjalnymi atakami. Jeśli masz jakieś pytanie zostaw komentarz.