Eliminowanie ataków typu brute force za pomocą fail2ban

Administracja

Jeśli nasz serwer jest wyeksponowany na świat zewnętrzny, bardzo prawdopodobne że jest on nieustająco atakowany przez boty próbujące wykryć hasła i loginy do popularnych usług jak SSH, POP3, IMAP, SMTP, FTP itd. Przedstawiamy skuteczną metodę walki z tym zjawiskiem na serwerach dedykowanych.


Jeśli nasz serwer jest wyeksponowany na świat zewnętrzny, bardzo prawdopodobne że jest on nieustająco atakowany przez boty próbujące wykryć hasła i loginy do popularnych usług jak SSH, POP3, IMAP, SMTP, FTP itd. Najprostszą metodą unikania ataków tego typu - brute force jest oczywiście zmiana portów usług np. SSH z 22 na jakikolwiek inny, aczkolwiek nie zawsze jest taka możliwość, bądź po prostu istnieją inne obiektywne przyczyny, aby tego nie robić. W tym wypadku ratunkiem jest pakiet fail2ban, rozwiązanie niemal idealne.

Pakiet fail2ban jest niezwykle przydatnym narzędziem w ochronie naszego serwera przed atakami typu brute force. W skrócie jego działanie polega na automatycznym przeglądaniu logów na serwerze i wyławianiu z nich adresów IP atakujących botów, które wpiszą się w reguły kwalifikujące je do narzucenia blokady np. dodanie reguły do firewalla na adres IP. Po ustalonym czasie taka reguła może być automatycznie zdjęta. Rozwiązanie to pozwala wyeliminować około 99% fałszywych prób logowań.

Na przykładzie CentOS 7, proces instalacji wygląda następująco. Najpierw instalujemy repozytorium EPEL (jeśli jeszcze nie mamy go dodanego).

yum install epel-release

Następnie:

yum install fail2ban

Domyślnie oprogramowanie nie ma uruchomionych reguł (tzw. jail) wg których będzie odbywało się banowanie atakujących. Tworzymy lub edytujemy plik w lokalizacji /etc/fail2ban/jail.local

[DEFAULT]
findtime  = 5000
maxretry =  5
[sshd]
enabled = true
[Init]
bantime = 43200

findtime dany host zostanie zbanowany jeśli wygeneruje maksymalną próbę błędnych logowań (maxretry) w ciągu danego czasu, tutaj 5000 s. sshd włącza regułę na usługę SSH i ustawiamy generalną regułę bantime (czas zbanowania w sekundach) na 12 godzin.

Następnie, uruchamiamy usługę:

systemctl start fail2ban

i włączamy jej start podczas bootowania systemu:

systemctl enable fail2ban

Jeśli chodzi o podstawową konfigurację to wszystko. Fail2ban obsługuje w zasadzie wszystkie kluczowe usługi, jeśli uważamy że potrzebujemy dodatkowej ochrony, zawsze możemy ją rozszerzyć na kolejną z nich.

Co z recydywistami?

Po jakimś czasie działania fail2ban, zauważymy że niektóre IP są notorycznie blokowane. Blokada czasowa owszem spełnia swoje zadanie, ale cóż z tego jeśli dany host ponawia swoje próby tuż po odblokowaniu na firewallu. W tym celu przydało by się nam narzędzie permanentnego blokowania botów recydywistów. Posłużymy się tutaj wspaniałym skryptem napisanym przez Phila Hagena.

Tworzymy plik skryptu /etc/fail2ban/action.d/iptables-repeater.conf o treści:

# Fail2ban configuration file
#
# Author: Phil Hagen 
#

[Definition]

# Option:  actionstart
# Notes.:  command executed once at the start of Fail2Ban.
# Values:  CMD
#
actionstart = iptables -N fail2ban-REPEAT-
              iptables -A fail2ban-REPEAT- -j RETURN
              iptables -I INPUT -j fail2ban-REPEAT-
              # set up from the static file
              cat /etc/fail2ban/ip.blocklist. |grep -v ^\s*#|awk '{print $1}' | while read IP; do iptables -I fail2ban-REPEAT- 1 -s $IP -j DROP; done

# Option:  actionstop
# Notes.:  command executed once at the end of Fail2Ban
# Values:  CMD
#
actionstop = iptables -D INPUT -j fail2ban-REPEAT-
             iptables -F fail2ban-REPEAT-
             iptables -X fail2ban-REPEAT-

# Option:  actioncheck
# Notes.:  command executed once before each actionban command
# Values:  CMD
#
actioncheck = iptables -n -L INPUT | grep -q fail2ban-REPEAT-

# Option:  actionban
# Notes.:  command executed when banning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:      IP address
#            number of failures
#          

Jest to skrypt akcji fail2ban, który blokuje cały ruch z danego adresu IP. I tak chcąc włączyć permanentne blokowania uciążliwych hostów dopisujemy do naszego pliku jail.local regułę:

[ssh-repeater]
enabled  = true
filter   = sshd
action   = iptables-repeater[name=ssh] sendmail-whois[name=SSH-repeater, dest=root, sender=root]
logpath  = /var/log/secure
maxretry = 21
findtime = 31536000
bantime  = 31536000

Skrypt ten tworzy czarną listę w lokalizacji /etc/fail2ban/ip.blocklist.ssh, jest niezwykle skuteczny i pozwala w miarę spać spokojnie. Po więcej informacji na temat samego skryptu odsyłam do strony twórcy.

Opublikowano Maj 2015