Fail2Ban – Automatyzacja wykrywania błędnych logowań do systemu i reakcja na nie

Marcin Kukiełka, 2 września 2015

Usługi sieciowe wymagające od użytkownika podania loginu i hasła mogą stać się łatwym celem botów internetowych lub osób chcących włamać się do systemu. Zazwyczaj są to ataki słownikowe. Atakujący zasypuje serwer próbami logowania się do danej usługi pobierając hasła ze słownika często używanych haseł. Dlatego ważne jest, aby używać haseł składających się z przypadkowych znaków alfanumerycznych i znaków specjalnych.

Aby odciąć atakującego od systemu,najlepiej jest utworzyć odpowiednią regułę na firewallu. Jeżeli atak jest przeprowadzany przez botnet, wprowadzanie reguł blokujących ręcznie jest wręcz niemożliwe. Dlatego z pomocą przychodzi nam program Fail2Ban.

Na Ubuntu/Debian Instalujemy go poleceniem:

$ sudo apt-get install fail2ban

Na Fedorze

$ sudo dnf install fail2ban

Na Centos/Redhat musimy wcześniej dodać repozytorium Fedory, aby móc zainstalować Fail2Ban.

$ rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-1.noarch.rpm

$ yum check-update

$ yum install fail2ban

Powyższe polecenia instalują serwer i klienta, który służy do podglądania stanu Fail2Ban oraz wprowadzania zmian w „locie”.

Konfiguracja Fail2Ban jest rozłożona pomiędzy wiele różnych plików konfiguracyjnych. Główny plik /etc/fail2ban/fail2ban.conf zawiera miejsce, gdzie mają być odkładane logi z działania programu, poziom logowania i miejsce trzymania plików pid i socket.

W katalogu /etc/fail2ban/action.d znajdują się pliki konfiguracyjne określające akcje jakie mają być wykonane po wykryciu błędnego logowania. Znajdują się już tam predefiniowane konfiguracje dla iptables oraz różnych jego nakładek (shorewall, apf, bsd-ipfw, osx firewall). Jest również możliwość wysłania powiadomień email o błędnej próbie logowania i zablokowaniu adresu IP.

W katalogu /etc/fail2ban/filter.d są pliki odpowiedzialne za wyszukiwanie informacji o próbach logowania w logach systemowych i aplikacji. Opierają się one na dopasowywaniu wyrażeń regularnych w logach. Tak jak w przypadku plików akcji, tak i tutaj są już gotowe filtry do wykorzystania do takich usług jak ssh, apache, asterisk, różnych daemonów ftp, poczty czy aplikacji webowych (roundcube). Ich składnia jest w miarę prosta i umożliwia nam pisanie własnych filtrów.

W pliku /etc/fail2ban/jail.conf możemy włączać poszczególne akcje i filtry oraz konfigurować zachowanie Fail2Ban. Parametrem ignoreip możemy zdecydować, które z adresów IP mają być ignorowane przez Fail2Ban. Domyślnie jest to tylko 127.0.0.1. Parametr bantime określa ilość sekund na jakie zostanie zablokowany podejrzany host. Jeżeli chcemy dać możliwość podjęcia kilku prób logowania dla uprawnionych użytkowników, którzy przez przypadek źle wpisali hasło, robimy to za pomocą opcji maxretry i findtime. Pierwszy określa ilość prób zanim host zostanie zablokowany, a drugi określa czas badania kolejnych nieudanych prób logowania. Domyślne wartości to maxretry=3 i findtime=600, czyli jeżeli w ciągu 10 minut będąpodjęte 3 błędne próby logowania to host zostanie zablokowany.

Opcja destemail określa adres email do powiadomień, a sendername określa nazwę nadawcy wysyłanych powiadomień. Są przydatne jeżeli chcemy skonfigurować reguły klienta poczty tak, aby powiadomienia wpadały do odpowiednich folderów.

Domyślną akcją jest blokowanie adresu IP przez polecenie iptables. Jeżeli chcemy to zmienić ustawiamy parametr banaction. Odpowiada on nazwom plików w katalogu /etc/fail2ban/action.d.

Plik /etc/fail2ban/jail.conf może być modyfikowany przez aktualizację systemu, więc autorzy zalecają zrobienie jego kopii do pliku /etc/fail2ban/jail.local.

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

Aby włączyć wykrywanie podejrzanych akcji w danej usłudze np. ssh znajdujemy sekcję odpowiedzialną za daną usługę.

[ssh]

enabled  = true

port     = ssh

filter   = sshd

logpath  = /var/log/auth.log

maxretry = 6

Opcja enabled określa czy usługa ma być monitorowana. Parametr port określa numer portu tcp (numer portu pobierany jest z /etc/services). Z kolei filter wskazuje nazwę pliku filtra, który znajduje się w katalogu /etc/fail2ban/filter.d. logpath to oczywiście ścieżka dostępu do pliku logu systemowego bądź aplikacji, który ma być badany pod kątem podejrzanych zachowań.

Konfiguracja obserwowania usługi może nadpisywać ustawienia ogólne. Możemy zmienić ilość dozwolonych prób logowania przez opcję maxretry czy zmienić akcję podjętą przez Fail2Ban. W ten sposób możemy skonfigurować Fail2Ban tak, aby nie blokował połączeń, ale wysyłał powiadomienia o błędnych próbach.

Ciekawą opcją konfiguracyjną jest opcja recydywy.

[recidive]

enabled  = true

filter   = recidive

logpath  = /var/log/fail2ban.log

action   = iptables-allports[name=recidive]

           sendmail-whois-lines[name=recidive, logpath=/var/log/fail2ban.log]

bantime  = 604800  ; 1 week

findtime = 86400   ; 1 day

maxretry = 5

Fail2Ban obserwuje swój własny log i jeżeli było podjętych 5 akcji przez Fail2Ban, host zostanie zablokowany na tydzień.

Stan Fail2Ban możemy podglądać przez program klienta.

$ fail2ban-client status

Status

|- Number of jail:       3

`- Jail list:                    apache, ssh, ssh-ddos

Jeżeli chcemy podejrzeć stan konkretnej usługi wpisujemy polecenie:

$ fail2ban-client status ssh

Status for the jail: ssh

|- filter

|  |- File list:    /var/log/auth.log

|  |- Currently failed:  1

|  `- Total failed:         7

`- action

   |- Currently banned:           1

   |  `- IP list:    62.244.147.78

   `- Total banned:       1

Czasem może zdarzyć się, że zostanie zablokowany użytkownik, który po prostu zapomniał hasła i kilkukrotnie podał błędne. W takim przypadku również używamy klienta, aby odblokować hosta.

$ fail2ban-client set ssh unbanip 62.244.147.78

Dzięki modułowej budowie Fail2Ban możemy dodawać nowe filtry i akcje. Dobrym przykładem jest wtyczka wp-fail2ban, którą możemy pobrać z https://wordpress.org/plugins/wp-fail2ban/.

Plik wp-fail2ban.php kopiujemy do katalogu (główny katalog wordpressa)/wp-content/plugins/wp-fail2ban/. Włączamy wtyczkę w kokpicie WordPressa.

1 fail2ban

Plik wordpress.conf kopiujemy do katalogu filtrów /etc/fail2ban/filter.d/

Następnie w pliku /etc/fail2ban/jail.local dopisujemy następujące liniki:

[wordpress]

enabled = true

filter = wordpress

logpath = /var/log/auth.log

maxretry = 3

Po trzech próbach błędnego logowania się do kokpitu WordPressa nastąpi zablokowanie hosta.

Fail2Ban to nie tylko ochrona przed próbami zgadnięcia hasła, ale również przed atakami DDoS. Dzięki zablokowaniu podejrzanego ruchu z sieci zaoszczędzamy moc obliczeniową i pamięć. Własny plik logowania akcji pozwala łatwo wyłowić zagrożenia. Modułowa budowa oraz możliwość wykorzystania wyrażeń regularnych w filtrach powoduje, że możemy stworzyć własne filtry np. do sklepów internetowych czy systemów zarządzania treścią.

Marcin Kukiełka

BLOG

Zobacz inne nasze artykuły

Zarządzanie firmą w czasie pandemii

Zarządzanie firmą w czasie pandemii

Witam, nazywam się Piotr Popławski, jestem Prezesem Zarządu Support Online, spółki zajmującej się outsourcingiem informatycznym. 80-cio osobowy zespół naszej firmy działa prężnie na rynku zarówno Polskim jak i międzynarodowym. Moim hobby jest żeglarstwo, jestem...

FindTime. Jak oszczędzić czas podczas planowania spotkań.

FindTime. Jak oszczędzić czas podczas planowania spotkań.

Za każdym razem, kiedy organizujesz spotkanie z wieloma osobami, stajesz przed wyzwaniem. Jak znaleźć dogodny termin, który pasuje wszystkim uczestnikom? Jeśli zainteresowani są zebrani w jednym miejscu i mają wgląd w swoje kalendarze, zadanie nie musi być trudne. W...