Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Brute force su SSH: proteggersi con Fail2ban

Usiamo Fail2ban per proteggere i nostri server da attacchi brute force contro SSH.
Usiamo Fail2ban per proteggere i nostri server da attacchi brute force contro SSH.
Link copiato negli appunti

Chiunque abbia un server con IP pubblico avrà sicuramente notato che si è continuamente esposti ai tentativi di attacco. I motivi sono svariati, ma la maggior parte delle volte si viene attaccati perché si fa parte della "massa" e non perché qualcuno ce l'ha con noi. Gli attacchi più frequenti (sui sistemi Unix), sono quelli di brute-force contro il servizio SSH perché molti utilizzano password deboli, facilmente reperibili da un dizionario.

Fail2ban nasce nel 2004 ed è un framework scritto in Python che si occupa di fare intrusion prevention (prevenzione delle intrusioni). L'ultima versione disponibile (al momento della stesura di questo articolo) è la 0.8.9 del 13 Maggio 2013.

Il funzionamento è di per se molto semplice:

  • Il demone si mette a leggere vari file di log (es: /var/log/auth.log, /var/log/pwfail, ...).
  • Quando vengono rilevati dei tentativi di accesso errati (password sbagliata, username non presente nel sistema, directory crawling, ecc), fail2ban incrementa un contatore temporaneo sull'IP che sta effettuando i tentativi errati.
  • Quando il contatore arriva ad un numero prestabilito da noi (di default 3), si attiverà il sistema che bloccherà l'indirizzo IP per un periodo di tempo, durante il quale non potrà più effettuare nessuna connessione verso la nostra macchina server.

Fail2ban nei sistemi Linux si avvale di netfilter (un componente del kernel del sistema operativo, che permette l'intercettazione e manipolazione dei pacchetti) per bloccare gli IP malevoli. Per configurare netfilter si usa il programma iptables, che permette di definire le regole di drop (blocco) degli indirizzi. Sarà direttamente fail2ban a dialogare con iptables per la creazione del rules (regole) in maniera del tutto trasparente per l'utente. Inoltre c'è la possibilità di farci arrivare una mail in tempo reale in caso di ban, così da tenere sempre sotto controllo quello che sta succedendo sulla nostra macchina.

Il software esce con già alcune configurazioni pre-installate che servono a filtrare i tentativi di accesso su:

  • Apache, Lighthttpd
  • SSHD
  • vsftpd
  • Qmail, Postfix, CurierMail

ma è completamente personalizzabile a seconda delle nostre esigenze. L'importante è saper creare delle espressioni regolari che serviranno a trovare i tentativi di attacco sui log di sistema.

Nel grafico possiamo vedere le statistiche di utilizzo / installazione del demone fail2ban (preso dal sito ufficiale di Debian).

grafico attacchi

installed è la somma delle quattro categorie:

  • vote è il numero di persone che usano regolarmente fail2ban
  • old è il numero di persone che hanno installato ma NON usano regolarmente fail2ban
  • recent-ctime è il numero di persone che hanno recentemente aggiornato fail2ban
  • no-files è il numero di persone che non hanno fornito informazioni sufficienti (atime e ctime erano a 0)

Passiamo ora alla parte pratica: installeremo fail2ban e daremo un'occhiata alle configurazioni. Prenderò come base di partenza un sistema Linux Debian based (come ad esempio Ubuntu e Mint).

La prima operazione da fare è "tirare a lucido" la nostra distribuzione installando le ultime versioni di tutti i pacchetti:

# apt-get update
# apt-get upgrade
# apt-get dist-upgrade

Adesso che il sistema è aggiornato possiamo passare all'installazione del pacchetto fail2ban:

# apt-get install fail2ban

Verrà installato un demone di avvio in /etc/init.d/fail2ban ed una struttura di configurazione in /etc/fail2ban/

fail2ban configurazione

  • action.d/ è la cartella dove sono racchiusi tutti i comportamenti che fail2ban deve tenere a seconda delle azioni che vengono richiamate dal programma
  • fail2ban.conf è il file di configurazione del demone
  • filter.d/ è la cartella che contiene le regex con cui fail2ban andrà a cercare i bruteforce
  • jail.conf è il file di configurazione principale, dove sono specificati i i path dei log su cui rimanere in ascolto e le varie azioni da eseguire nel caso di bruteforce

Andiamo ad analizzare meglio proprio questo ultimo file: le direttive più importanti sono:

  • ignoreip: Questa direttiva impone a fail2ban di non bannare gli IP presenti in lista. Saranno messi in white list. È possibile inserire un singolo IP, una netmark o un hostname, separati dallo spazio.
  • bantime: Specifica il tempo di ban (in secondi). In questo periodo l'host che ha tentato il bruteforce verrà trattenuto fuori da qualsiasi servizio (HTTP,FTP,SSH, ...
  • )

  • maxretry: Specifica il massimo numero di tentativi errati prima che l'host venga bloccato dal sistema fail2ban.
  • filter: Qui va inserito l'apposito filtro che si trova nella directory /etc/fail2ban/filter.d.
  • logpath: Il percorso del file di log dove fail2ban sta in ascolto alla ricerca di tentativi di bruteforce.

Cominciamo modificando

ignoreip = 127.0.0.1/8

aggiungendo anche il nostro IP locale (questo passaggio è richiesto perchè sui log potrebbe comparire l'IP locale piuttosto che il 127.0.0.1):

ignoreip = 127.0.0.1/8 192.168.120.133

"bantime" e "maxretry" sono a discrezione dell'utente. Di default sono impostati con massimo 3 tentativi errati e 10 minuti di ban.
L'unico servizio su cui fail2ban è di default in ascolto è SSH:

3

  • [ssh] – Indica un nome intuitivo del servizio, è a discrezione dell'utente
  • enabled = true – Ci dice che la configurazione è attiva
  • port = ssh – Qui possiamo utilizzare i nomi (come su iptables) o mettere il numero della porta
  • filter = sshd – Definisce il nome del file da utilizzare, contenuto in filter.d/ (senza inserire .conf alla fine)
  • logpath = /var/log/auth.log – Il log su cui mettersi in ascolto alla ricerca di tentativi bruteforce.
  • Maxretry = 6 – ridefinisce la variabile maxretry a 6
  • Il lavoro di ricerca dei tentativi di bruteforce viene svolto dalle regex (espressioni regolari) all'interno di filter.d/*.conf, nel nostro caso specifico, in filter.d/sshd.conf. Le uniche direttive da utilizzare sono:

    • failregex – Espressione regolare per trovare i tentativi di accesso con password errata nei file di log. Il tag va utilizzato all'interno dell'espressione e servirà a prelevare l'indirizzo IP dell'attaccante.
    • ignoreregex – Espressione regolare per ignorare una specifica linea del file di log.

    May 29 11:45:12 kali sshd[3615]: Failed password for root from 192.168.120.1 port 4321 ssh2

    Questa riga del file /var/log/auth.log ci avverte che qualcuno ha tentato di accedere ad SSH sbagliando password dell'utente root. La regex corretta che servirà a fail2ban per intercettare questo tentativo sarà:

    Failed (?:password|publickey) for .* from (?: port d*)?(?: sshd*)?$
    (già all'interno del file di configurazione)

    Per testare le espressioni regolari, fail2ban ci viene in aiuto attraverso lo script fail2ban-regex. Si utilizza specificando come primo parametro il path del file di LOG e come secondo parametro la regex. Es:

    fail2ban-regex /var/log/auth.log "Failed (?:password|publickey) for .* from (?: port d*)?(?: sshd*)?$"

    4

    Mostrandoci che la regex specificata su quel file di configurazione ha trovato un unico tentativo di bruteforce. Quando i tentativi, provenienti dallo stesso IP, arriveranno a 3 (maxretry) verrà attivato il ban temporale (bantime) sulle regole di iptables.
    Quando siamo sicuri che la regex funziona, ricordiamoci di riavviare il demone dopo la modifica dei file .conf:

    /etc/init.d/fail2ban restart

    5

    Schermata riepilogativa di iptables con ban attivo

    6

    Ripetuti tentativi di bruteforce, visti dal file di log

    Limitazioni fail2ban

    Purtroppo fail2ban non si è ancora allineato ai tempi moderni dell'IPv6, lasciando quindi "scoperti" i servizi che stanno in ascolto sui nuovi sistemi di indirizzamento. Ma fortunatamente, grazie al fatto che il progetto è opensource, qualcuno ci sta già pensando (v. https://github.com/fail2ban/fail2ban/pull/88 ) e potremo avere il pieno supporto al rilascio della versione 0.9.1

    Utilizzare una soluzione come quella di fail2ban ci permette di ridurre drasticamente i tentativi di accesso ai nostri servizi esposti su una rete (pubblica o privata). Consigliamo di affiancare altri software (SNORT, OSSEC, ..) a fail2ban per andare a mitigare le debolezze/limitazioni del prodotto ed abbattare ulteriormente i tentativi di intrusione.

    Ti consigliamo anche