Proteggere il server dagli attacchi DoS e DDoS su Linux

Cosa è un Dos?

Un attacco DoS (Denial of Service), ha come scopo il rendere inutilizzabile un determinato servizio in ascolto sul web inondandolo di richieste fittizie, qualsiasi servizio esposto su internet che fornisce servizi di rete basati sul protocollo TCP/IP è soggetto al potenziale rischio di attacchi (D)DoS.

La differenza tra DoS e DDoS (Distributed Denial of Service) sta nel numero di macchine (PC, server, cellulari, in generale, qualsiasi dispositivo connesso ad internet che sia stato compromesso) utilizzate per lanciare l’attacco, nel caso di un DoS l’attacco avviene da una sola macchina, mentre nel ben più difficile da bloccare DDoS l’attacco può avvenire contemporaneamente da centinaia di macchine diverse.

Come potrete quindi immaginare tutti i consigli contenuti in questo articolo non vi assicureranno una protezione totale contro i DDoS, perché quando sono ben organizzati e l’attacco arriva da un grande numero di macchine diverse, l’unico modo per cercare di bloccarlo o più realisticamente, mitigarlo, è agire a monte, direttamente sull’infrastruttura del vostro provider (che quindi dovrete contattare), a meno che non abbiate una vostra infrastruttura di rete.

In questo articolo vedremo quindi come evitare che il ragazzino di turno sprovvisto di vita sociale vi blocchi alcuni servizi sul server inondandoli di richieste grazie a qualche programmino scaricato da chissà quale sito.

Come riconoscere un attacco?

Questa è sicuramente la prima cosa da imparare, imparare a riconoscere un attacco DoS, ho visto tante volte incolpare subito un attacco di questo tipo appena i servizi ospitati sul server risultano irraggiungibili, quando invece le cose più probabili sono ben altre.

Innanzitutto se siete sotto attacco vedrete un picco (che può variare da pochi a diversi mbit/s) nei vostri grafici della banda utilizzata, e un picco nelle connessioni netstat, anche per questo sarebbe bene generare i grafici di tutti i servizi più importanti sul vostro server, se non lo fate correte a leggere gli articoli su hosting talk dove era stato trattato l’argomento.

Una volta accertato che ci sono picchi anomali nell’utilizzo della banda, usate questo comando per visualizzare lo stato di tutte le connessioni attive sul vostro server:

netstat -nat | awk '{print $6}' | sort | uniq -c | sort -n

L’output sarà qualcosa del genere:


Output netstat
Se notate che ci sono diverse connessioni in stato SYS_SENT siete sicuramente sotto attacco, a questo punto non resta che individuare l’IP o gli IP dai quali arrivano più connessioni, potete farlo con questo comando:

netstat -atun | awk '{print $5}' | cut -d: -f1 | sed -e '/^$/d' |sort | uniq -c | sort -n
Output netstat -atun | awk '{print $5}' | cut -d: -f1 | sed -e '/^$/d' |sort | uniq -c | sort -n

A questo punto avrete una lista ordinata per numero di connessioni aperte da ogni IP, alla fine molto probabilmente avrete gli IP delle macchine dalle quali vi stanno attaccando, ora non resta che bloccare questi IP, nel prossimo capitolo vedremo come.

Un’altra utility molto utile per analizzare il traffico di rete e vederlo in tempo reale è tcptrack, una volta installata usate i seguenti comandi per avviare il monitoring:

tcptrack -i eth0 vi mostrerà tutto il traffico attivo sulla scheda di rete
tcptrack -i eth0

tcptrack -i eth0 vi mostrerà tutto il traffico sulla porta 80

tcptrack -i eth0 src or dst 127.0.0.1 vi mostrerà tutto il traffico generato dall’ip specificato.

In più tcptrack vi mosterà in tempo reale l’utilizzo della banda.

Bloccare un attacco

Ora che sappiamo individuare un attacco e capire da quali IP sta arrivando possiamo cercare di bloccarlo, vediamo come.

Premesso che la cosa migliore sarebbe comunicare gli IP degli attaccanti al vostro provider così che possano essere bloccati a monte e che non possano quindi influire neanche minimamente sulla vostra banda disponibile, esistono principalmente due metodi per bloccare questi IP sul vostro server: bloccarli con iptables, oppure metterli in nullroute (che è, secondo me, preferibile).

Per bloccare questi IP da itptables potete usare questo semplice comando:

iptables -A INPUT -s IP-ATTACCANTE -j DROP

Quindi se l’indirizzo IP dell’attacante fosse 123.234.80.65 il commando da dare sarebbe:

iptables -A INPUT -s 123.234.80.65 -j DROP

Invece, per mettere un IP in nullroute, dobbiamo lanciare questo comando:

route add IP-ATTACANTE gw 127.0.0.1 lo

Possiamo anche mettere in nullroute un intera subnet ad esempio così:

route add -net 192.67.16.0/24 gw 127.0.0.1 lo

Verifichiamo quindi che i settaggi siano stati effettivamente applicati con

netstat -nr

Per rimuovere il nullroute possiamo utilizzare il comando route delete IP

Per far sì che i nullroute impostati siano mantenuti al reboot scrivete gli stessi comandi nel file /etc/rc.local

Come prevenire gli attacchi

Fin’ora abbiamo visto come comportarci una volta sotto attacco, ma visto che fin da bambini ci hanno insegnato che prevenire è meglio che curare vediamo cosa possiamo fare per evitare di trovarci coi servizi giù e dover ripristinarli a fatica.

Per prima cosa consiglio di installare APF (Advanced Policy Firewall), un firewall basato su iptables che bloccherà di suo molti degli attacchi conosciuti confrontandone i pattern, in più, grazie alla sua semplice e versatile configurazione diventa un ottimo sostituto di iptables che spesso risulta abbastanza macchinoso da mantenere.

Potete installare APF usando un packet manager tipo apt o yum, oppure compilare l’ultima versione così:

Scaricate l’ultima versione stabile: wget http://www.rfxnetworks.com/downloads/apf-current.tar.gz
Scompattate il file appena scaricato: tar -xvzf apf-current.tar.gz
Entrate nella directory creata ed eseguite ./install.sh

A questo punto APF va configurato a dovere, per farlo editate il file /etc/apf/conf.apf

Per prima cosa settate il parametro DEVEL_MODE a 1, così se sbagliate qualche settaggio e vi chiudete fuori dal server dopo 5 minuti il firewall verrà automaticamente stoppato. Ricordatevi di rimettere su 0 questo parametro una volta terminata la configurazione, altrimenti il firewall funzionerà solo per 5 minuti ad ogni riavvio.

Settate su 1 tutti i parametri che abilitano le liste di network malefici dai quali le connessioni saranno rifiutate (DLIST_*).
Settate manualmente le porte TCP che devono rimanere aperte nella variabile IG_TCP_CPORTS (ad esempio la 80 per il traffico web, se avete modificato la porta di ssh come avreste dovuto fare ricordatevi di settarla qua, altrimenti vi chiuderete fuori dal server), tutte le altre risulteranno chiuse.
Stessa cosa per le porte UDP subito sotto, se ne fate uso.

Impostate il parametro SYSCTL_SYNCOOKIES su 1, vi proteggerà dagli attacchi di tipo syn flood.

Ok, questi sono i parametri di base da configurare, ma vi consiglio una lettura completa del file di configurazione che ci troverete tante opzioni interessanti.

Oltre ad un firewall pensato per questo scopo, sarebbe bene configurare i parametri di rete del kernel come illustrato in questo articolo.

Ma se l’attacco non è un (D)DoS standard, ma semplicemente qualcuno che si sta divertendo con apache benchmark per buttarvi giù il sito? Certo, è facilmente bloccabile seguendo le istruzioni contenute nei primi paragrafi, ma mentre voi cercate di bloccarlo probabilmente il sito risulterà down per qualche minuto oppure anche di più se non siete al PC, magari se ciò avviene nel weekend.

Per cercare di bloccare a monte questi attacchi potete servirvi del modulo NginxHttpLimitReqModule incluso di default in nginx, grazie a questo potrete limitare il numero di connessioni simultanee da uno stesso IP, oppure, se utilizzate Apache, potete utilizzare il modulo mod_limitpcon.

Testo tratto da Hostig Talk