Anleitung zum Absichern unseres Apache Webservers gegen die gefürchteten DoS-Angriffe unter Verwendung des mod_evasive Moduls.
Feedback & Fragen zu diesem Beitrag sind nicht nur willkommen sondern ausdrücklich erwünscht ;-)!
Was kann mod_evasive?Das Apache Modul mod_evasive kann unseren Webserver gegen DoS-Angriffe / Attacken schützen und basiert im Grunde auf einer Blacklist. Dazu legt mod_evasive in einer internen Hash Tabelle die IP Adessen der Clients ab, zählt diese und verhindert innerhalb eines bestimmten (definierbaren) Zeitraumes den erneuten Zugriff. Nachdem der Aufrufer das Limit der Anfragen überschritten hat erhält er im Webbrowser/Client die 403 Forbidden Meldung und kann vorerst unter der IP-Adresse keine Inhalte mehr abrufen.
Das schöne ist das wir hiermit auch BruteForce-Attacken aller Art über das HTTP-Protokoll verhindern können oder es dem Angreifer zumindest deutlich schwerer machen diese durchzuführen..
Was ist so schlimm an DoS Attacken?Das Problem liegt auf der Hand, ruft ein Client innerhalb kurzer Zeit sehr oft Inhalte unserer Servers ab wird dieser entspr. belastet und geht je nach Auslastung des Servers schnell in die "Kinie". Das ganze führt zum Nachteil der normalen Besuchehr, weil der Server dann entweder nur sehr langsam antwortet oder wenn es schlimmer kommt auch gar nicht mehr. Bei statischen HTML Dokumenten ist ein solcher Angriff nicht so wirkungsvoll, setzen wir aber Scriptsprache wie PHP auf unseren Server ein um Inhalte dynamisch zu erstellen benötigt der Server für jede Anfrage deutlich mehr Ressourcen, ganz davon abgesehen das dynamische Inhalte auch noch an Datenbanken gekoppelt sind. In einem solchen Fall hat der Angreifer die Möglichkeit über eine DoS Attacke alle Dienste zu überlasten die an die Auslieferung der Dokumente gebunden sind.
Wo gegen hilft mod_evasive nicht?Gegen massive DoS Angriffe.
Sobald ein Angriff die gesamte Bandbreite des Servers beansprucht ist das Modul mod_evasive hilflos und kann die Angriffe nicht mehr verhindern. Hier helfen nur weitere Massnahmen auf Software-Ebene oder viel besser, Lösungen die bereits vor der eigentlichen Serverhardware zum Einsatz kommen - Stichwort Router.
Wie installiere ich mod_evasive?Zu unserer Freude ist das Modul in den offiziellen Paketquellen von Debian Lenny enthalten, die Installation des Moduls ist daher denkbar einfach und erfolgt wie gehabt durch ein einfaches:
apt-get install libapache2-mod-evasive
Damit ist das Modul dann auch schon installiert, evtl. müssen wir unsere Apache-Config einmal neuladen, welches wir mit:
/etc/init.d/apache2 force-reload
durchführen können.
Um unser mod_evasive zu konfigurieren müssen wir in unserer Apache Konfiguration das Modul konfigurieren:
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
</IfModule>
Optional können wir die folgenden Direktiven mit in unsere Konfiguration einbringen um uns über eine Attacke informieren zu lassen, eine bestimmte Aktion auszuführen oder ein Logfile zu schreiben:
DOSEmailNotify me@example.com
DOSSystemCommand "su - someuser -c '/sbin/... %s ...'"
DOSLogDir "/var/lock/mod_evasive"
Der Entwickler vom mod_evasive hat an alles gedacht, wir können sogar eine eigene Whitelist anlegen:
DOSWhitelist 127.0.0.1
DOSWhitelist 127.0.0.*
Und woher weis ich ob mod_evasive funktioniert?Wenn wir das Modul testen möchten um zu schauen wann es anschlägt oder um ein "Fine-Tuning" auf unsere Bedürfnisse durch zuführen können wir das Testscript aus den Quellpaketen des Entwicklers "test.pl" nutzen:
#!/usr/bin/perl
# test.pl: small script to test mod_dosevasive's effectiveness
use IO::Socket;
use strict;
for(0..100) {
my($response);
my($SOCKET) = new IO::Socket::INET( Proto => "tcp",
PeerAddr=> "127.0.0.1:80");
if (! defined $SOCKET) { die $!; }
print $SOCKET "GET /?$_ HTTP/1.0\n\n";
$response = <$SOCKET>;
print $response;
close($SOCKET);
}