it-swarm-eu.dev

Come proteggere Tomcat 7 dagli attacchi di Slowloris

Sto usando Apache Tomcat 7 per eseguire la mia webapp su Linux. L'ho scannerizzato da Acunetix e mi sta dicendo che la mia webapp è vulnerabile a "Slow HTTP Denial of Service Attack". Come posso proteggerlo?

Acunetix mi sta ribadendo a qui , ma si tratta di proteggere Apache, non Tomcat.

16
Amin Sh

Un CVE è stato assegnato specificamente per questo problema in quanto si applica ad Apache Tomcat: CVE-2012-5568 . Riferimenti più appropriati lì rispetto a quello che ti è stato dato.

Gli sviluppatori Tomcat non considerare questa vulnerabilità e non hanno in programma di risolvere.

Potenziali soluzioni:

  • Utilizzare le regole del firewall per impedire troppe connessioni da un singolo host. Ciò mitigherà gli attacchi Denial of Service comuni ma non quelli distribuiti (DDoS).

    Ecco un esempio di un comando iptables che può essere utilizzato per limitare il numero di connessioni simultanee che è possibile stabilire sulla porta 80 da un singolo host client:

    # iptables -A INPUT -p tcp --syn --dport 80
    -m connlimit --connlimit-above 50 -j REJECT

    https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2007-675

    Ciò, tuttavia, avrebbe effetti collaterali se molti utenti si connettessero legittimamente da un singolo IP (ad esempio mega-proxy), quindi il numero di connessioni dovrebbe essere ottimizzato in modo ragionevole, a seconda del traffico previsto.

  • Sfortunatamente, l'opzione migliore è posizionare il servizio Tomcat a valle di un server Web in grado di gestire meglio le connessioni HTTP, come Apache. Quindi utilizzare una soluzione Apache come mod_reqtimeout o mod_antiloris.

12
itscooper

Esiste un modulo Apache che applica alcune euristiche per (provare a) rilevare l'attacco "slowloris" e contrastarlo. È chiamato mod_antiloris (questo è un modulo per Apache, non un modulo da Apache Software Foundation ). Vedi questa risposta per i dettagli.

Ricorda che, come per tutti attacchi Denial of Service , non esiste una soluzione , solo mitigazioni .

8
Tom Leek

Nota che Tomcat fa parte della Apache Foundation, quindi tecnicamente si chiama Apache Tomcat. Tuttavia, il tradizionale server web Apache (chiamato ufficialmente "The Apache HTTP Server Project") viene spesso chiamato semplicemente Apache. Sotto, "Apache" si riferisce al server HTTP Apache e non Tomcat.

Tomcat in genere non viene eseguito come server Web, ma come server applicazioni. Se Tomcat è esposto direttamente a Internet (senza essere associato a Apache), la soluzione dovrebbe essere una delle seguenti:

  • Imposta un server proxy inverso di fronte a Tomcat, come Nginx, Lighttpd o persino Apache.

  • Configura Apache e Tomcat insieme come configurato tradizionalmente .

Se usi Apache nella tua soluzione, allora anche dovrai usare una strategia di mitigazione al rallentatore. C'è mod_antiloris, che lo farà per te come descritto nell'articolo che hai collegato. E c'è anche mod_reqtimeout , che depsite fa parte di Apache Core spesso non è incluso di default nelle installazioni di Apache.

mod_antiloris funziona limitando il numero di connessioni simultanee che un determinato IP può creare.
mod_reqtimeout funziona limitando il tempo in cui una singola richiesta può rimanere inattiva.

Entrambi hanno il loro posto e una buona difesa probabilmente impiegherà entrambi.

Inoltre, la configurazione mpm_event di Apache worker funziona allo stesso modo di altri server, come Nginx, Cherokee e lighttpd, e non è suscettibile all'attacco di Slowloris. Questo è disponibile sulla maggior parte delle installazioni moderne, ma è contrassegnato come "sperimentale". In paritcolare, potrebbe non essere compatibile alcuni moduli più vecchi che si basano sul concetto di thread per connessione. Un esempio spesso citato è mod_php, sebbene ciò non si applichi alle versioni più recenti.

4
tylerl

hai Apache (il server web) davanti al tuo gatto? in tal caso -> upgrade. Apache non è vulnerabile al rallentamento dal 2.2.16 IIRC e 2.2.16 viene spedito con debian squeeze, che è oldstable.

se non si dispone di un proxy inverso davanti al Tomcat: utilizzare uno, vernice preferibile o nginx.

per motivi di utilizzo di un proxy inverso, vedere this answer @ serverfault

Ecco una soluzione Ciò non influirà sulle persone che utilizzano un proxy. Il team Apache Tomcat non considera questa vulnerabilità in Tomcat o prevede di rilasciare una patch. Questo codice fermerà anche altri metodi di attacco ddos. ps non ho scritto questo.

BLACKLIST = cat /usr/local/AS/etc/blacklist.txt

per i in $ BLACKLIST; iptables -A INPUT -p tcp -m tcp --dport http -s $ i -j DROP fatto

- # IP che non verranno mai rifiutati - host partner

WHITELIST = * *** INSERISCI IL TUO ELENCO PERMANENTE IPS QUI ** * ***

per i in $ WHITELIST; iptables -A INPUT -p tcp -m tcp --dport http -s $ i -j ACCETTA fatto

- # non abbassare troppo - i browser aprono più connessioni

OVERLIM_NEW = 500
- # limite complessivo per le nuove connessioni al secondo
INDILIM_NEW = 30
- Limite # per IP individuale, nuove connessioni al secondo - previene le inondazioni
INDILIM_CURRENT = 200
- Limite # per IP individuale, connessioni totali - evita il sovraccarico
CURRENT_EVAL_INTERVAL = 300
- # lunghezza intervallo per la valutazione dell'utilizzo dell'IP

iptables -N LIMIT_INDIVIDUAL_NEW
iptables -N LIMIT_INDIVIDUAL_CURRENT
iptables -N LIMIT_OVERALL_NEW

iptables -A INPUT -p tcp --dport 80 -m state --state ESTABLISHED -j LIMIT_INDIVIDUAL_CURRENT
iptables -A INPUT -p tcp --dport 80 --syn -m state --state NEW -j LIMIT_INDIVIDUAL_NEW

iptables -A LIMIT_INDIVIDUAL_CURRENT -m recent --set
iptables -A LIMIT_INDIVIDUAL_CURRENT -p tcp --tcp-flags FIN FIN -m recent --remove
iptables -A LIMIT_INDIVIDUAL_CURRENT -m recente --update --seconds $ CURRENT_EVAL_INTERVAL --hitcount $ INDILIM_CURRENT -j DROP
iptables -A LIMIT_INDIVIDUAL_CURRENT -j ACCEPT

iptables -A LIMIT_INDIVIDUAL_NEW -m recente --set
iptables -A LIMIT_INDIVIDUAL_NEW -m recente --update --seconds 1 --hitcount $ INDILIM_NEW -j DROP
iptables -A LIMIT_INDIVIDUAL_NEW -j LIMIT_OVERALL_NEW
iptables -A LIMIT_OVERALL_NEW -m limit --limit $ OVERLIM_NEW/second -j ACCEPT
iptables -A LIMIT_OVERALL_NEW -j DROP

1
Tim Jonas