Fail2Ban - blokowanie ataków brute force

  • Data: 2015

Fail2Ban jest aplikacją, która powinna być zainstalowana w zasadzie na każdej maszynie działającej pod kontrolą Unix / Linux / BSD, wystawioną na świat (zewnętrzne IP). Głównym zadaniem Fail2Ban jest blokada podejrzanych, zakończonych niepowodzeniem prób logowania się do usług świadczonych przez nasz serwer. Podsumowując zabezpiecza przed atakami typu brute force.

Działanie programu Fail2Ban opiera się na analizie logów i wychwytywaniu nieautoryzowanych prób logowania się do różnego rodzaju usług (np. ssh, smtp, pop3, imap...), po czym blokuje adres IP atakującego za pomocą reguł iptables lub dodając wpis do pliku /etc/hosts.deny. Opis konfiguracji będzie dotyczył blokowania za pomocą reguł iptables.

Fail2Ban dostępny jest na wielu dystrybucjach jako gotowy pakiet więc instalacja jest banalnie prosta.

Instalacja fail2ban

  • Debian/Ubuntu: aptitude install fail2ban
  • RedHat/CentOS/Fedora: yum install fail2ban

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

Opis kilku ważniejszych opcji :

  • ignoreip - lista adresów IP, które nigdy nie zostaną zablokowane
  • filter - odnosi się do pliku konfiguracyjnego zawierającego wyrażenie regularne na podstawie którego wykryje niepożądane działanie
  • bantime - czas blokady podany w sekundach
  • maxretry - dozwolona liczba zdarzeń (np. nieudanych logowań) po której następuje blokada
  • banaction - globalna konfiguracja akcji blokowania hosta po przekroczeniu maxretry, domyślna akcja iptables-multiport
  • logpath - ustawienie odpowiedniej ścieżki z logami usługi
  • port - port na którym nasłuchuje monitorowana aplikacja

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. Dobrym przykładem może być blokowanie skanera w00tw00t.

I na koniec sposób na usunięcie blokady nałożonej przez fail2ban: odblokowanie adresu IP.

Powrót »