Wiedemal auf otaku's Anregung hin, habe ich mir heute einmal mod_evasive naeher angesehen.
Durch mod_evasive koennen mit wenig Aufwand DoS-Attacken abgewehrt werden, indem man einfach Parameter definiert, wie oft eine Seite binnen einem ebenfalls einstellbaren Intervalls aufgerufen werden darf. Wird diese Grenze überschritten werden zukuenftige Anfragen für einen Zeitraum X mit einem 403 Fehler quittiert.

In diesem HOWTO werde ich nur naeher auf die Installation von mod_evasive v1.10.1 für apache 2.2 auf einem debian etch eingehen, da dies mein Setting ist.. Die Installation ist aber fuer andere apache-versionen aehnlich einfach moeglich. Siehe hierzu einfach das README in dem Quell-Archiv...


Inhalt
1. Einleitung
2. Installation
3. Konfiguration
4. Erweiterte Konfiguration
5. Test

Die Installation:


Den Quellcode auf der Projektseite herunterladen, entpacken und mit einem apache-eigenenen Befehl compilieren und installieren:

~#> wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz
~#> tar -zxvf mod_evasive_1.10.1.tar.gz
~#> cd mod_evasive
mod_evasive#> apxs2 -i -a -c mod_evasive20.c


Das war's eigentlich auch schon - nach dem naechsten restart von apache wird mod_evasive mit den standard-Einstellungen gespeichert.

Die Konfiguration:


Die Standardeinstellungen sind zwar weitestgehend okay, ein paar Aenderungen sind aber trotzdem empfehlenswert..
Zunächst einmal räumen wir auf:
Bei der Installation wurde der Aufruf fuer mod_evasive in die Datei /etc/apache2/httpd.conf geschrieben. Das ist nicht sonderlich schoen. Also entfernen wir den Eintrag aus der httpd.conf und legen eine neue Datei in /etc/apache2/mods-available:

~#> grep -v mod_evasive /etc/apache2/httpd.conf > /etc/apache2/httpd.conf
~#> echo "LoadModule evasive20_module   /usr/lib/apache2/modules/mod_evasive20.so" > /etc/apache2/sites-available/evasive.load
~#> cd /etc/apache2/mods-enabled
~#> ln -s ../mods-available/evasive.load .

Ausserdem muessen wir in der apache-config (/etc/apache2/apache2.conf) den Wert "MaxRequestsPerChild" anpassen. Per default steht dieser auf "0", also "unlimited" - das wuerde verhindern, dass mod_evasive seine hash-tables jemals "aufraeumt". Ein hoher Wert ist trotzdem gut, damit das Modul effektiv arbeitet - in der README stehen 10000 - diesen Wert habe ich einmal uebernommen..

Da wir eben doch noch ein bisschen was an den Standard-Einstellungen des Moduls drehen wollen, erstellen wir nun noch eine Configurations-Datei mit dem Editor unseres Vertrauens, z.B. vim:

~#> vim /etc/apache2/mods-available/evasive.conf

Hier erstmal ein einfaches Beispiel - die Erklärungen folgen..

<IfModule mod_evasive20.c>
    DOSHashTableSize 3097
    DOSPageCount 2
    DOSSiteCount 50
    DOSPageInterval 1
    DOSSiteInterval 1
    DOSBlockingPeriod 10
    DOSLogDir "/var/lock/mod_evasive"
</IfModule>


  • DOSHashTableSize
    Die Groesse der HashTables pro child-prozess (und somit pro Verbindung..) Groessere HashTables = hoehere Geschwindigkeit = mehr RAM-Verbrauch...
  • DOSPageCount
    Anzahl der Requests pro Seite innerhalb des mit DOSPageInterval (siehe unten) angegebenen Zeitraumes, nach denen weitere Verbindungen unterbunden werden.
  • DOSSiteCount
    Anzahl der Requests pro Website innerhalb des mit DOSSiteInterval (siehe unten) angegebenen Zeitraumes, nach denen weitere Verbindungen unterbunden werden.
  • DOSPageInterval
    Der Zeitraum (in Sekunden) in dem nicht mehr Requests pro Seite, als in DOSPageCount (siehe oben) angegeben, erlaubt sind.
  • DOSSiteInterval
    Der Zeitraum (in Sekunden) in dem nicht mehr Requests pro Website, als in DOSSiteCount (siehe oben) angegeben, erlaubt sind.
  • DOSBlockingPeriod
    Der Zeitraum (in Sekunden) für den eine Sperre aufrecht erhalten wird. Der Zaehler wird bei erneuten Anfragen innerhalb dieses Zeitraumes zurueckgesetzt, weshalb hier sehr niedrige Werte ausreichend sind.
  • DOSLogDir
    Wo die HashTables abgelegt werden sollen. (Default ist "/tmp" was auf Systemen mit mehreren Shell-Usern ein Sicherheitsrisiko ist, da dieses Verzeichnis von jedermann gelesen werden kann...
Verständlich ausgedrueckt bedeutet das in unserem Beispiel, dass jeder für 10 Sekunden geblockt wuerde, der öfter als zwei mal pro Sekunde die gleiche Seite oder mehr als 50 mal pro Sekunde irgendeine Seite auf einer WebSite aufruft.
Wenn er dann innerhalb dieser 10 Sekunden wieder versucht, eine Seite aufzurufen, bekommt er eine 403 Fehlermeldung praesentiert und der Zaehler wird wieder zurueckgesetzt.
Somit koennen DoS-Attacken sehr schnell unterbunden werden, ein normaler User muesste aber schon wie wild auf reload druecken um fuer 10 Sekunden gesperrt zu werden..

Erweiterte Konfiguration

DOSSystemCommand
Das bisher beschriebene ist ja schon ganz schoen.. Noch schoener wird es, wenn man mod_evasive mit der Aussenwelt verbindet:
Mittels des Befehles DOSSystemCommand koennen im "Erfolgsfall" weitere tools aufgerufen werden. Hier sind der Phantasie keine (?) Grenzen gesetzt.. Naheliegend und sicher nicht verkehrt ist eine Verbindung mit iptables um blacklisted IPs direkt zu sperren und gar nicht mehr an das System zu lassen:

DOSSystemCommand    "su - root -c 'iptables -I INPUT -s %s -j DROP'"

Dies ist natuerlich nur ein sehr einfaches Beispiel - eine einmal geblockte IP wuerde nie mehr zugelassen werden.. Hier wird ein kleines script noetig, die blocks verwaltet und nach einer gewissen Zeit auch wieder "entblockt". Wenn ich sowas in den naechsten Tagen nicht finde, werde ich es selbst schreiben und hier davon berichten.. :)

DOSEmailNotify
Man kann auch eine email-adresse angeben, an die Nachrichten geschickt werden, sobald eine DoS-Attacke erkannt wurde:

DOSEmailNotify This email address is being protected from spambots. You need JavaScript enabled to view it.

DOSWhitelist
Natuerlich koennen einzelne IPs oder ganze Bereiche ge-whitelistet werden:

DOSWhitelist 127.0.0.1
DOSWhitelist 127.0.0.*


Der Test

Um nun zu testen ob auch wirklich alles funktioniert wie erwartet sehen wir uns die passenden logfiles fuer die website an, die unter "127.0.0.1" praesentiert wird und starten das mitgelieferte test-script:

~#> tail -f /var/log/apache2/hosts/default-access.log

~#> perl mod_evasive/test.pl


Wenn alles richtig funktioniert, sollten von dem Script erst ein paar 200 OK's und dann nur noch 403 forbidden's ausgegeben werden... Im Logfile finden wir ebenfalls entsprechende Eintragungen...


Zu guter letzt: Wie immer bin ich für alle Kommentare, Anregungen und Korrekturen sehr dankbar.. :)


stimpy Gravatar   01.01.2008 12:00
fail2ban howto now availible Yes No @slider: Nu hab ich mal etwas Zeit gehabt und das gewuenschte howto geschrieben.. Findeste auch in meinem Blog..
 
martin Gravatar   01.01.2008 12:00
compile-probs Yes No Hi,

ich bekomme beim installieren (nach pxs2 -i -a -c mod_evasive20.c) immer die Fehlermeldung

apxs2: command not found

woran kann das liegen? gcc ist installiert!

Grüße
Martin
 
stimpy Gravatar   01.01.2008 12:00
Yes No danke - wird ausprobiert..! :-)
 
Slider Gravatar   01.01.2008 12:00
Yes No Ich hab bloß wirklcih rgad keine Ahnung wie das mit fail2ban funktionieren soll. Wärst du so nett und könntest es beschreiben?
 
stimpy Gravatar   01.01.2008 12:00
Yes No Ne Du.. Da fehlt mir im Moment echt die Zeit zu.. Guck's Dir halt einfach mal an - es ist wirklich ganz einfach.. Die Config is super kommentiert und es gibt fuer die meisten Dienste schon ausfuehrliche Beispiele..
 
stimpy Gravatar   01.01.2008 12:00
Yes No > der habt ihr ein Programm der die log Ordner ausliest und die ips dann banned?

...das waere dann fail2ban... :-)
 
Slider Gravatar   01.01.2008 12:00
Yes No DOSSystemComman d -> Das funktioniert leider nicht sad Wie add ich ein User der rechte hat in iptables was zu schreiben mit su? oder habt ihr ein Programm der die log Ordner ausliest und die ips dann banned?
 
stimpy Gravatar   01.01.2008 12:00
Yes No Also RedHat-Pakete gibts auf deren Homepage..
 
stimpy Gravatar   01.01.2008 12:00
Yes No RedHat weiss ich nicht - hab ich nie benutzt.. Musst halt mal gucken.. :-) Ansonsten is selbst compilieren aber auch kein Akt - ich hab's letztens auch installiert und nach 10 Minuten lief es perfekt.. Kein Akt also.. :-)
 
Slider Gravatar   01.01.2008 12:00
fail2ban Yes No Wie funktioniert das mit Fail2ban? Gibt es auch ein komplettes Red Hat 5 Paket?
 
 
  • Bold
  • Italic
  • Underline
  • Stroke
  • Quote
  • Ordered List Unordered List
  • Add Code
  • Smileys
  • :confused:
  • :cool:
  • :cry:
  • :laugh:
  • :lol:
  • :normal:
  • :blush:
  • :rolleyes:
  • :sad:
  • :shocked:
  • :sick:
  • :sleeping:
  • :smile:
  • :surprised:
  • :tongue:
  • :unsure:
  • :whistle:
  • :wink: