Mod dosevasive su OpenBSD ed apache reverse proxy

Cos’è DosEvasive

DosEvasive è un modulo per Apache sviluppato da Jonathan Zdziarski (alias Nuclear Elephant) che permette di eliminare o quanto meno limitare i potenziali danni da DoS su Apache. In sostanza il modulo tiene una tabella di ip che hanno effettuato delle GET nel breve periodo e, se il numero di queste chiamate supera la soglia da noi impostata, al posto della pagina richiesta viene servito un 403 (Forbidden).

Installazione su OpenBSD

DosEvasive non è un modulo nativo di Apache, per cui va compilato a mano tramite apxs. E’ possibile installarlo sia su Apache 1.3 che su Apache 2.x, ma dato che noi in produzione usiamo solo quest’ultimo, la procedura che segue è valida solo per la versione 2.x.

Si suppone che si stia lavorando su una macchina OpenBSD 4.5 AMD64 (quindi fate attenzione ai vari path se siete su una versione differente).

Configuriamo PKG_PATH con un mirror di OpenBSD:

[root@openbsd45 root]# export PKG_PATH=ftp://mirror.switch.ch/pub/OpenBSD/4.5/packages/amd64/

Se non è già installato, installiamo Apache 2 e wget, che ci servirà in seguito:

[root@openbsd45 root]# pkg_add apache-httpd-2.2.9
[root@openbsd45 root]# pkg_add wget

L’installazione del modulo prevede la sua compilazione, quindi se la macchina su cui state lavorando non disponde dei compilatori, potete installarli recuperandoli dal sito di OpenBSD e procedendo come segue:

[root@openbsd45 root]# wget ftp://mirror.switch.ch/pub/OpenBSD/4.5/amd64/comp45.tgz
[root@openbsd45 root]# mv comp45.tgz /
[root@openbsd45 root]# cd /
[root@openbsd45 ]# tar -zxpf comp45.tgz

A questo punto, scaricate e spacchettate l’ultima release del modulo direttamente dal sito di Jonatan:

   [root@openbsd45 root]# wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz
   [root@openbsd45 root]# tar -zxf mod_evasive_1.10.1.tar.gz

Procedete quindi con la sua compilazione:

[root@openbsd45 root]# cd mod_evasive
[root@openbsd45 mod_evasive]# apxs2 -i -a -c mod_evasive20.c

Con tutta probabilità vi verrà restituito questo errore:

/usr/local/bin/libtool  --silent --mode=compile cc -prefer-pic -O2 -pipe  -D_POSIX_THREADS -I/usr/local/include -I/usr/local/include/apache2  -I/usr/local/include/apr-1/    -I/usr/local/include/apr-1/ -I/usr/local/include/db4 -I/usr/local/include  -c -o mod_evasive20.lo mod_evasive20.c && touch mod_evasive20.slo
sh: /usr/local/bin/libtool: not found
apxs:Error: Command failed with rc=8323072

che può essere risolto semplicemente installando la libtool:

[root@openbsd45 ]# pkg_add libtool-1.5.26p0
[root@openbsd45 ]# ldconfig

Rilanciando apxs2 dovreste quindi ottenere un output simile a questo:

/usr/local/bin/libtool --silent --mode=compile cc -prefer-pic -O2 -pipe -D_POSIX_THREADS -I/usr/local/include -I/usr/local/include/apache2 -I/usr/local/include/apr-1/ -I/usr/local/include/apr-1/ -I/usr/local/include/db4 -I/usr/local/include -c -o mod_evasive20.lo mod_evasive20.c && touch mod_evasive20.slo /usr/local/bin/libtool --silent --mode=link cc -o mod_evasive20.la -rpath /usr/local/lib/apache2 -module -avoid-version mod_evasive20.lo /usr/local/share/apache2/build/instdso.sh SH_LIBTOOL='/usr/local/bin/libtool ' mod_evasive20.la /usr/local/lib/apache2 /usr/local/bin/libtool --mode=install cp mod_evasive20.la /usr/local/lib/apache2/ cp .libs/mod_evasive20.so /usr/local/lib/apache2/mod_evasive20.so cp .libs/mod_evasive20.lai /usr/local/lib/apache2/mod_evasive20.la cp .libs/mod_evasive20.a /usr/local/lib/apache2/mod_evasive20.a chmod 644 /usr/local/lib/apache2/mod_evasive20.a ranlib -t /usr/local/lib/apache2/mod_evasive20.a PATH="$PATH:/sbin" ldconfig -m /usr/local/lib/apache2 chmod 755 /usr/local/lib/apache2/mod_evasive20.so [activating module `evasive20' in /etc/apache2/httpd2.conf]

La conferma che il modulo è effettivamente installato la avrete se andate a verificare il file /etc/apache2/httpd2.conf, dove dovreste trovare una riga simile a questa:

LoadModule evasive20_module   /usr/local/lib/apache2/mod_evasive20.so

A questo punto il modulo è quindi installato e pronto per essere configurato.

Rimuovere i compilatori

Se avete dovuto installare i compilatori e non li volete lasciare, potete usare questo semplice scriptino.

ATTENZIONE: l’ho testato solo su OpenBSD 4.5 AMD64!! SU ALTRE VERSIONI POTREBBE ESSERE DANNOSO! FATE SEMPRE PRIMA DELLE PROVE!!!

for i in `tar -zvtf comp45.tgz |awk '{print $9,"\n",$11}'`; do cd /; if [ -f $i ]; then rm -f $i; fi; done

Esempio di configurazione

In questo esempio, il vhost www.domain.tld, che sta dietro al nostro bilanciatore/reverse proxy, è protetto da DosEvasive in modo che le singole pagine non possano ricevere dallo stesso ip più di 30 chiamate in un minuto, oppure che non possa ricevere più di 80 chiamate a pagine diverse nel giro di un minuto. Nel caso il modulo si attivi, “bannerà” l’ip per 600 secondi, restituendo alle sue chiamate successive un Forbidden e inviando una mail a dos_notify@dmoain.tld con un allarme. Le chiamate che arrivano dagli ip sotto DosWhitelist non passano attraverso DosEvasive (e di conseguenza non finiranno mai in blacklist):

<VirtualHost *:80>
ServerName www.domain.tld
ProxyRequests Off
ProxyPreserveHost On
ProxyPass        / http://www.domain.tld/
ProxyPassReverse / http://www.domain.tld/

DOSHashTableSize    1500

DOSPageCount        30
DOSPageInterval     60

DOSSiteCount        80
DOSSiteInterval     60

DOSBlockingPeriod   600
DOSEmailNotify      dos_notify@domain.tld
DOSWhitelist        127.0.0.1
DOSWhitelist        127.0.1.1
DOSWhitelist        192.168.xxx.xxx
</VirtualHost>


Altri articoli che potrebbero interessarti

Blindiamo apache con mod_dosevasive Situazione tipo: Sei a casa di venerdi sera che stai cazzeggiando felicemente, fino a che non ti rendi...
Installazione modulo geoip su apache2 e debian etch Oggi vedremo una guida abbastanza facile, come dare la possibilità al nostro apache di identificare...
Installazione del modulo python per apache2 (debian/ubuntu) Girando per il forum di ubuntu mi sono imbattutto in una richiesta di un utente che ha problemi nell'installazione...
Come ti setto l’https su porte non-443 con apache2 Ieri in azienda abbiamo dovuto settare l'apache di alcune macchine in modo che risponda in https ma in...
Rallentamenti e disservizi Tutto inizia ieri sera, con l'arrivo dei primi allarmi sul carico eccessivo della macchina. A fatica...

About the Author

M0rF3uS al secolo Alex è un ggiovine 25enne appassionato di informatica e linux. Lavora come Network and System Administrator e nel tempo libero gioca un pò con la sua fotocamera (Canon EOS 1000D) riuscendo a volte, per sbaglio, a fare qualche scatto decente. Completano il corredo, degli hobbies "vorrei ma non posso" ossia l'astronomia e l'astronautica....si è uno di quelli che da grande vorrebbe fare l'astronauta (povero coglione vero?).