Un sistem mai sigur cu Fail2Ban
Fail2Ban este o aplicație de baza pentru prevenirea intruziunilor, scrisă în limbajul de programare Python. Fail2Ban este capabil să ruleze inclusiv pe sisteme POSIX care dispun de o interfaţă către un sistem de control al pachetelor sau un firewall instalat local cum ar fi iptables sau TCP Wrapper.
Fail2Ban poate deveni o unealtă de securitate suplimentară foarte eficientă, ajutând la protecţia oricărui sistem de atacuri brute force – o metodă folosită la spargerea unei scheme criptografice prin încercări sistematice de a o decripta printr-un număr mare de posibilităţi.
Cum securizarea cât mai bună a unui sistem informatic este foarte importantă şi în special un sistem critic cum ar fi un server de orice natură, Fail2Ban reprezintă o soluţie demnă de luat în calcul. De ce? De exemplu, majoritatea serverelor Linux rulează serviciul ssh, astfel nu este surprinzător faptul că un atacator va încerca să spargă mai degrabă un server ssh decât altul.
Prin obţinerea unui acces elevat prin serviciul ssh, o intruziune rău intenţionată în sistemul compromis poate deveni fatală serviciilor oferite de respectivul sistem, iar analizele ulterioare ale jurnalelor sistemului pot fi dificile și mari consumatoare de timp.
Fail2Ban poate face viața unui administrator de sisteme mult mai ușoară. Fail2Ban scanează fișierele jurnal cum ar fi /var/log/pwdfail sau /var/log/apache/error_log şi restricţionează adresele IP care generează prea multe erori la autentificare. Actualizează automat regulile firewall pentru ca acesta să respingă sau să refuze traficul originat de la aceste adrese IP.
Desigur există multe alte pachete software care pot analiza fişierele jurnal şi bloca sursele ofensive, totuşi, Fail2Ban dispune de mai multe facilităţi care îl fac mai atractiv. Printre acestea pot enumera: client/server, fire de execuţie multiple (multithread), autodetecţia formatelor dată/timp, suport metacaractere în opţiunea logpath, suport pentru diverse servicii (sshd, apache, proftpd, qmail, sasl, etc.), precum şi suport pentru diverse acţiuni (iptables, tcp-wrapper, shorewall, notificări mail, etc).
Acum că l-am lăudat suficient, voi descrie pe scurt o instalare şi configurare a acestei aplicaţii pe un sistem Debian. Paşii sunt asemănători în Ubuntu şi relativ similari în alte distribuţii.
Primul pas este aducerea şi instalarea pachetului folosind comanda apt-get install fail2ban
Imediat după instalare, trebuie să modificăm fişierele de configuraţie, acestea se regăsesc în /etc/fail2ban.
Să aruncăm o privire în jail.conf. Dacă observăm atent, dezvoltatorul ne avertizează să nu modificăm acest fișier ci mai degrabă să efectuăm modificările personale în /etc/fail2ban/jail.local.
Aşadar, de siguranţă vom copia /etc/fail2ban/jail.conf în /etc/fail2ban/jail.local şi vom deschide spre editare fişierul jail.local: cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Citind conţinutul acestui fişier, vom observa de câte posibilităţi sau opţiuni dispunem pentru configurarea cât mai fină dar şi facilă a acestei aplicaţii.
Iată câteva explicaţii pentru acestea:
enabled – defineşte starea unei secţiuni prin valoarea aleasă ‘true‘ sau ‘false‘.
filter – numele filtrului folosit de către jail pentru detecţia potrivirilor. Acest nume corespunde unui nume de fișier din ‘/etc/fail2ban/filter.d‘; fără extensia ‘.conf‘. De exemplu: ‘filter = sshd‘ face referință la ‘/etc/fail2ban/filter.d sshd.conf‘.
action – această opțiune instruiește Fail2Ban ce acțiune să întreprindă odată ce filtrul detectează o potrivire.
logpath – calea către fișierul jurnal oferit filtrului.
ignoreip – desemnarea unor adrese IP la această opțiune face ca acestea să fie exceptate de la orice restricție, indiferent de câte ori se realizează o autentificare eșuată de la acestea.
maxretry – după cum se poate subînțelege, definirea unui număr la această opțiune, reprezintă numărul maxim de încercări eronate de autentificare care pot proveni de la o adresă IP înainte de a fi restricționat. Astfel, dacă valoarea este setată la 3 pentru ssh, după trei încercări nereușite de autentificare, Fail2Ban va bloca adresa IP prin care s-au realizat acestea.
bantime – durata în secunde pentru care va fi restricționat un IP.
destmail – aici se poate specifica o adresă de mail folosită pentru recepționarea alertelor la restricționarea unui IP. Dacă nu aveți un server de mail pe sistem, Fail2Ban nu va putea trimite aceste mailuri. Atenție, numărul de mailuri primite poate fi semnificativ.
banaction – definirea acţiunii care va fi luată pentru restricţionarea adreselor IP. Această denumire corespunde unui nume de fişier din ‘/etc/fail2ban/action.d‘; fără extensia ‘.conf’. De exemplu: ‘action = iptables-allports‘ face referință la ‘/etc/fail2ban/action.d/iptables-allports.conf‘.
protocol – specifiarea protocolului care urmează să fie restricționat, TCP sau UDP.
Ok, acum că am trecut și prin câteva mici detaliile tehnice, să facem si un test concret ca exemplificare.
În acest test, vrem ca Fail2Ban să restricționeze o adresă IP ofensivă care a încercat să se autentifice de cel puțin patru ori prin ssh și să trimită un mail cu raport whois incluzând câteva linii relevante din jurnale. De asemenea, vrem ca această adresă să fie restricționată timp de cinci minute.
Astfel, vom opera următoarele modificări în configurație:
[DEFAULT]
bantime = 500
destemail = destinatar@serverulmeu.ro
action = %(action_mw1)s
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
După finalizarea configurării, serviciul Fail2Ban trebuie repornit: /etc/init.d/fail2ban restart
Inițial, doar secțiunea ssh este activată în jail.conf. Asta înseamnă că Fail2Ban va analiza doar /var/log/auth.log și va restricționa adresele IP aferente. Dacă aveți un server de web, mail, dns sau ftp, puteți specifica valoarea enabled la true și activa filtrul Fail2Ban și pentru aceste servicii.
Acum se poate testa configuraţia folosind două sisteme, unul fiind cel ofensiv cu adresa 123.456.7.89, iar celălalt sistem cu adresa 87.65.43.21 fiind ţinta pe care rulează serviciul Fail2Ban alături de ssh si email, inclusiv cu contul destinatar@serverulmeu.ro
Pentru început, vom realiza patru încercări intenționat eronate de autentificare de pe sistemul ofensiv. Acum e momentul să ne verificăm emailul:
From fail2ban@serverulmeu.ro Thu Jul 11 12:25:34 2009
Subject: [Fail2Ban] ssh: banned 123.456.7.89
Hi,
The ip 123.456.7.89 has just been banned by Fail2Ban after 4 attempts against ssh.
Here are more information about 123.456.7.89:
{whois info}
Lines containing IP:123.456.7.89 in /var/log/auth.log
Jul 11 12:23:26 serverulmeu.ro sshd[11390]: Failed password for root from 123.456.7.89 port 22 ssh2
Jul 11 12:23:28 serverulmeu.ro sshd[11390]: Failed password for root from 123.456.7.89 port 22 ssh2
Jul 11 12:23:30 serverulmeu.ro sshd[11390]: Failed password for root from 123.456.7.89 port 22 ssh2
Jul 11 12:23:31 serverulmeu.ro sshd[11394]: reverse mapping checking getaddrinfo for 123.456.7.89.serverulmeu.ro [123.456.7.89] failed – POSSIBLE BREAK-IN ATTEMPT!
Jul 11 12:23:32 serverulmeu.ro sshd[11394]: Failed password for root from 123.456.7.89 port 22 ssh2
Regards,
Fail2Ban
Excelent! Acum să aruncăm o privire în iptables:
iptables -L
Chain fail2ban-ssh (1 references)
target prot opt source destination
DROP all — caconnect9.botosani.rdsnet.ro anywhere
Fail2ban şi-a făcut treaba din plin. Acum putem contacta ISP-ul atacatorului nostru pentru a depune o reclamaţie privind sursa atacului. Totuşi, în România, şansele ca un ISP oarecare să minimizeze astfel de acţiuni în primul rând prin însăşi infrastructura proprie – aceasta putând fi şi prima linie de apărare într-o infrastructură informatică de amploare, chiar şi din proprie iniţiativă din păcate sunt minime.
Succes celorlalţi administratori de sisteme şi reţele!