Eliminowanie ataków typu brute force za pomocą fail2ban
AdministracjaJeś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).
Następnie:
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ę:
i włączamy jej start podczas bootowania systemu:
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.