Fail2ban jest narzędziem pomagającym zabezpieczyć serwery oparte o systemy Linux skanując logi (np. logi serwera ssh lub ftp), wyszukując błędy autentykacji, po czym wykonując aktualizacje ustawień firewall, żeby odrzucał połączenia z danego IP.
Wszystkie nałożone bany są aktywne tylko podczas pracy programu fail2ban i są usuwane podczas jego zatrzymania. W konsekwencji tego bany nie są pamiętane pomiędzy restartami programu!
Fail2ban jest dostępny w repozytoriach Debiana i Ubuntu, zatem aby go zainstalować wydajemy polecenie:
apt-get install fail2ban
Fail2ban w domyślnej konfiguracji włączony będzie dla autoryzacji poprzez ssh.
Kopiujemy domyślny plik /etc/fail2ban/jail.conf zawierający standardową konfigurację do pliku /etc/fail2ban/jail.local gdyż domyślny plik może zostać nadpisany podczas aktualizacji:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Struktura katalogu konfiguracyjnego
Po zainstalowaniu pakietu będziemy mieli podobną strukturę katalogu /etc/fail2ban/:
/etc/fail2ban/ |-- action.d | |-- complain.conf | |-- dshield.conf | |-- hostsdeny.conf | |-- ipfilter.conf | |-- ipfw.conf | |-- iptables-allports.conf | |-- iptables-multiport-log.conf | |-- iptables-multiport.conf | |-- iptables-new.conf | |-- iptables.conf | |-- mail-buffered.conf | |-- mail-whois-lines.conf | |-- mail-whois.conf | |-- mail.conf | |-- mynetwatchman.conf | |-- sendmail-buffered.conf | |-- sendmail-whois-lines.conf | |-- sendmail-whois.conf | |-- sendmail.conf | `-- shorewall.conf |-- fail2ban.conf |-- filter.d | |-- apache-auth.conf | |-- apache-badbots.conf | |-- apache-common.conf | |-- apache-nohome.conf | |-- apache-noscript.conf | |-- apache-overflows.conf | |-- common.conf | |-- courierlogin.conf | |-- couriersmtp.conf | |-- cyrus-imap.conf | |-- exim.conf | |-- gssftpd.conf | |-- lighttpd-fastcgi.conf | |-- named-refused.conf | |-- nginx-w00tw00t.conf | |-- pam-generic.conf | |-- php-url-fopen.conf | |-- postfix.conf | |-- proftpd.conf | |-- pure-ftpd.conf | |-- qmail.conf | |-- sasl.conf | |-- sieve.conf | |-- sshd-ddos.conf | |-- sshd.conf | |-- vsftpd.conf | |-- webmin-auth.conf | |-- wuftpd.conf | `-- xinetd-fail.conf |-- jail.conf
Podstawowe ustawienia zawarte są w pliku
/etc/fail2ban/fail2ban.conf: loglevel,logtarget,socket.
Tu raczej wszystko jest jasne.
Drugim plikiem jest
/etc/fail2ban/jail.conf
i jest to tak naprawdę główny plik odpowiadający za ochronę naszych usług.
W oficjalnej dokumentacji jest informacja, że każdy plik *.conf może być zmieniony na *.local oczywiście zachowując przy tym oryginał (najpierw wczytywane są ustawienia z plików *.conf, później wczytywana/nadpisywana jest konfiguracja z plików .local). W przypadku
fail2ban.conf
nie ma to najmniejszego sensu, to już w przypadku
jail.conf
jest to mocno zalecane. W katalogu konfiguracyjnym znajdują się jeszcze katalogi:
/etc/fail2ban/filter.d/
i
/etc/fail2ban/action.d/
Pierwszy z nich zawiera wyrażenia regularne, dzięki którym fail2ban wyłapuje podejrzane zachowania. W drugim katalogu przechowywana jest konfiguracja określająca działanie wobec wykrytych ataków.
Konfiguracja Fail2Ban
Pierwszym krokiem będzie utworzenie pliku
jail.local
na podstawie jail.conf:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Zawartość pliku podzielona jest na następujące sekcje :
- DEFAULT – globalne ustawienia programu, które można nadpisać w pozostałych sekcjach
- ACTIONS – globalne definicje akcji jakie będą podejmowane wobec “atakującego” adresu IP.
- JAILS – indywidualna konfiguracja dla poszczególnych usług sieciowych
W pliku
/etc/fail2ban/jail.local
można zmodyfikować kilka parametrów. Kilka najważniejszych to:
ignoreip: w tym parametrze podajemy listę adresów IP które powinny być wyłączone z zasad fail2ban. Można dodać swój adres IP.
bantime: określa jak długo ( w sekundach) ban będzie aktywny (domyślnie jest 10 minut).
maxretry: ten parametr określa domyślną ilość prób połączenia zanim ban zostanie nałożony na adres IP(domyślnie jest 3).
destemail: ta opcja pozwala ustawić adres e-mail, na który będą przychodzić powiadomienia zdarzeń
logpath: ważne aby sprawdzić dla każdej monitorowanej usługi czy ścieżka do pliku logów podana w parametrze logpath jest prawidłowa
Jeśli chcemy zmienić monitorowane parametry dla danej usługi to modyfikujemy jej sekcję:
[ssh] -> nazwa jailaenabled = true -> czy włączony (jeśli wyłączony to enabled = false)
port = ssh -> port usługi – przyjmuje wartość numeryczną lub nazwę portu, listę nazw portów można uzyskać z pliku /etc/services
filter = sshd -> pierwszy człon nazwy filtra logów: /etc/fail2ban/filter.d/sshd.conf
logpath = /var/log/auth.log -> ścieżka do pliku monitorowanych logów – możliwa tylko jedna wartość, ale dopuszczalna jest *
maxretry = 15 -> maksymalna ilość nieudanych prób autoryzacji
Fail2ban monitoruje logi plików dla prób połączeń. Jeśli z danego adresu IP zostanie przekroczona maksymalna ilość prób połączeń to blokuje dostęp dla tego adresu i zdarzenie jest logowane do pliku /var/log/fail2ban.log.
Wyświetlenie bieżącej konfiguracji:
fail2ban-client –d
Wyświetlanie bieżących banów:
iptables -L -n -v
Jeśli chcemy usunąć bana to znajdujemy nazwę łańcucha(jail) i numer reguły w tym łańcuchu dla adresu, który chcemy odblokować(nr_reg) i wykonujemy:
iptables -D jail nr_reg
Restart usługi fail2ban wykonujemy za pomocą polecenia:
/etc/init.d/fail2ban restart
Po instalacji (przynajmniej na Debianie) aktywowana jest już ochrona ssh. Chcąc uruchomić na przykład ochronę serwera smtp postfix wystarczy w sekcji JAILS znaleźć sekcję [postfix] i zmienić na true opcję enabled .
Wszystkie opcje, które są skonfigurowane w sekcjach DEFAULT i ACTIONS można nadpisywać indywidualnie w ustawieniach poszczególnych usług sieciowych.
Przykład konfiguracji, która blokuje ataki na ssh (openssh-server), smtp(s),sasl (postix), imap(s) (dovecot), http(s) (nginx, skaner w00tw00t). Plik jail.local:
# Fail2Ban configuration file. # The DEFAULT allows a global definition of the options. They can be override # in each jail afterwards. [DEFAULT] ignoreip = 127.0.0.1 ip.ip.ip.ip bantime = 1800 maxretry = 3 backend = auto destemail = user@ulos.pl # # ACTIONS # banaction = iptables-allports mta = sendmail # Default protocol protocol = tcp ## blokada hosta #action = %(action_)s ## blokada hosta + powiadomienie email action = %(action_mw)s ## blokada hosta + powiadomienie email + załączone logi w mailu action = %(action_mwl)s # # JAILS # # Optionally you may override any other parameter (e.g. banaction, # action, port, logpath, etc) in that section within jail.local [ssh] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log #action = sendmail-whois[name=ssh, dest=dominik.switkowski@gmail.com,sender=root@lsnet.pl] bantime = 24400 maxretry = 2 # # Http servers # [nginx-w00tw00t] enabled = true port = http,https filter = nginx-w00tw00t action = iptables-allports[nginx-w00tw00t] logpath = /var/log/nginx/*.access.log maxretry = 1 bantime = 96400 # # Mail servers # [postfix] enabled = true port = smtp,ssmtp,submission filter = postfix logpath = /var/log/mail.log bantime = 1880 maxretry = 2 [sasl] enabled = true port = smtp,ssmtp,imap2,imap3,imaps filter = sasl logpath = /var/log/mail.log bantime = 1880 maxretry = 1 [dovecot-pop3imap] enabled = true filter = dovecot-pop3imap action = iptables-allports[name=dovecot-pop3imap] port = imap2,imap3,imaps logpath = /var/log/mail.log maxretry = 3 bantime = 9200
Powyższego przykładu nie polecam kopiować jeden do jednego, niektóre opcje należy dostosować do swojej konfiguracji serwera. W sekcji ACTIONS opcja banaction ma wartość iptables-allports co oznacza blokadę wszystkich usług. Drugą możliwością jest iptables-multiport wtedy blokada nałożona na atakującego obejmuje tylko atakowaną usługę. Przedstawiając to obrazowo, jeśli ktoś nam atakuje http to fail2ban blokuje mu dostęp do naszego serwera www, ale już do ssh,smtp… jak najbardziej dostęp ma. W sekcji JAILS w konfiguracjach dla poszczególnych usług zwróćmy uwagę na zmienną port. W konfiguracji dla usługi ssh port jest ustawiony na… ssh. Wygląda to co najmniej śmiesznie natomiast wynika to ze sposobu jak fail2ban rozwiązuje odwzorowanie nazw usług sieciowych na numery portów, korzystając przy tym z pliku /etc/services. Równie dobrze można podawać port w postaci liczby.
Warto wspomnieć o możliwości otrzymywania email-a o blokadzie atakujących nas hostów. Dla mnie jest to zbyteczna funkcjonalność wobec tego nie opisuje jej szczegółowo. Jeżeli jednak zdecydujemy się na w/w powiadomienia musimy mieć zainstalowany serwer smtp.
Rozszerzenie fail2ban o obsługę dodatkowych usług sieciowych, aplikacji jest możliwe i zarazem dość proste. W sieci jest wiele gotowych rozwiązań, również sami możemy pokusić się o stworzenie własnych filtrów pod warunkiem znajomości wyrażeń regularnych.
Zdejmowanie banów możemy zrealizować na dwa sposoby. Pierwszy to po prostu restart procesu fail2ban, wtedy wszystkie blokady zostaną usunięte. Od wersji 0.8.6 po zrestartowaniu programu w dalszym ciągu utrzymywane są blokady. Drugi sposób zdejmuje bana z konkretnego adresu IP za pomocą iptables, oczywiście, o ile wybraliśmy sposób blokowania za pomocą iptables.
-
- W pierwszym kroku wyświetlam zawartość wszystkich reguł poleceniem: iptables -nL
Chain INPUT (policy DROP) target prot opt source destination fail2ban-default all -- 0.0.0.0/0 0.0.0.0/0 DROP all -- 223.25.195.163 0.0.0.0/0 DROP all -- 202.72.179.219 0.0.0.0/0 ... ... ... Chain fail2ban-default (1 references) target prot opt source destination DROP all -- 58.83.157.6 0.0.0.0/0 DROP all -- 94.56.48.130 0.0.0.0/0 RETURN all -- 0.0.0.0/0 0.0.0.0/0 Chain fail2ban-postfix (1 references) target prot opt source destination DROP all -- 14.63.214.64 0.0.0.0/0 RETURN all -- 0.0.0.0/0 0.0.0.0/0 Chain fail2ban-sasl (1 references) target prot opt source destination DROP all -- 221.139.14.120 0.0.0.0/0 RETURN all -- 0.0.0.0/0 0.0.0.0/0 Chain fail2ban-ssh (1 references) target prot opt source destination DROP all -- 87.106.227.246 0.0.0.0/0 DROP all -- 217.126.193.74 0.0.0.0/0 DROP all -- 220.164.144.135 0.0.0.0/0 DROP all -- 67.137.122.86 0.0.0.0/0 DROP all -- 50.116.61.79 0.0.0.0/0 DROP all -- 121.196.45.14 0.0.0.0/0 RETURN all -- 0.0.0.0/0 0.0.0.0/0
-
- Nas interesują łańcuchy fail2ban-<nazwa_usługi>, ponieważ przy odblokowywaniu adresu IP będzie potrzebna nam jego nazwa. Przykładowo, chcąc odbanować ssh dla adresu IP: 220.164.144.135 jako root (ubuntu sudo) wydajemy polecenie:
iptables -D fail2ban-ssh -s 220.164.144.135 -j DROP. Analogicznie odblokowanie dla serwera poczty adresu IP: 14.63.214.64 będzie wyglądało następująco: iptables -D fail2ban-postfix -s 14.63.214.64 -j DROP. - W celu uniknięcia pomyłki w czasie przepisywania adresu IP można ponumerować zablokowane wpisy wydając polecenie: iptables -nL fail2ban-ssh –line-numbers.
- Nas interesują łańcuchy fail2ban-<nazwa_usługi>, ponieważ przy odblokowywaniu adresu IP będzie potrzebna nam jego nazwa. Przykładowo, chcąc odbanować ssh dla adresu IP: 220.164.144.135 jako root (ubuntu sudo) wydajemy polecenie:
Chain fail2ban-ssh (1 references) num target prot opt source destination 1 DROP all -- 87.106.227.246 0.0.0.0/0 2 DROP all -- 217.126.193.74 0.0.0.0/0 3 DROP all -- 220.164.144.135 0.0.0.0/0 4 DROP all -- 67.137.122.86 0.0.0.0/0 5 DROP all -- 50.116.61.79 0.0.0.0/0 6 DROP all -- 121.196.45.14 0.0.0.0/0 7 RETURN all -- 0.0.0.0/0 0.0.0.0/0
- Mając takie wylistowanie bazujemy na nazwie łańcuchów i numerze: iptables -D fail2ban-ssh 4.