Web-Server

ID #1181 Apache: DoS-Attacken abfangen

Problem:

Regelmäßig kommen auf gut besuchten Webseiten DoS (Denial of Service) Attacken vor. Entweder sind es spielende Script-Kiddies, schlecht programmierte Spider/Crawler oder echte Angriffe.

Funktion:

Ein (hier Web-)Server wird mit so vielen Anfragen bombardiert, daß er entweder ganz Langsam wird, oder auf Grund ausgehendem Speicher gar nicht mehr Antwortet.
Konsequenz ist häufig der Absturz des Serverdienstes oder manchmal sogar ein vollkommener Ausfall des Rechners selbst.

Abhilfe:

Um Apache selbst zu schützen, gibt es zwei Apache-Module:
1. mod_security
2. mod_evasive (Download auf huschi.net)

Während mod_security mehr für den Schutz vor seltsamen/verdächtigen Query-Strings zuständig ist, ist mod_evasive konkret gegen DoS-Angriffe.

mod_evasive erstellt eine interne Liste von IP-Adresse und angeforderten URLs. Sollten hier gewisse (frei definierbare) Schwellwerte überschritten werden, antwortet es automatisch mit einem 403, sperrt diese IP für 10 Sekunden und kann noch weitere Funktionen ausführen. (Z.B. Logging oder Warnungs-Mail versenden.)

Installation mod_security

Das Apache-Modul mod_security erhält man in den aktuellen Distributionen direkt als Software-Paket. So ist es z.B. unter Debian ganz schnell installiert:

apt-get install libapache2-mod-security
a2enmod mod-security

Es fehlen nur noch die richtigen Einstellungen in der apache2.conf:

<IfModule mod_security.c>
  SecFilterEngine On
  # URL-Validierung aktivieren
  SecFilterCheckURLEncoding On
  # Unicode-Validierung aktivieren
  SecFilterCheckUnicodeEncoding On
  # HTTP-POST-Daten verarbeiten
  SecFilterScanPOST On
  # Standard-Aktion für zutreffende Filterregeln
  SecFilterDefaultAction "deny,log,status:403"
  # Filterregeln aus mod-security.d einbinden
  Include /etc/apache2/mod-security.d/[^.#]*
</IfModule>

Mit dem letzten Befehl wird ein Verzeichnis für die weiteren, selbst zu erstellenden Config-Files angegenben. Dort platzieren wir die eigentlichen Filter.
Beispiele finden wir bereits auf der Platte: /usr/share/doc/libapache2-mod-security/examples/.

Installation mod_evasive

Das Modul mod_evasive gibt es noch nicht als Distributions-Pakete. Also müssen wir es selber kompilieren.
Voraussetzung für jede Kompilation mit Apache ist natürlich das Apache-Devel-Paket!

#Prüfe auf Apache-Devel
whereis apxs
whereis apxs2
#Download und entpacken:
cd /usr/local/src/
wget http://www.huschi.net/download/mod_evasive_1.10.1.tar.gz
tar xzf mod_evasive_*
cd mod_evasive

Nun prüfen wir, ob es den angegebenen Mailer gibt (whereis mail) und welche Parameter er braucht. Das Modul ist auf sendmail ausgerichtet. Das Programm /usr/bin/mail kann aber auch der mailx sein.
In dem Fall darf der Parameter -t nicht verwendet werden und es wird in den Emails keine Subjekts angegeben.

edit mod_evasive20.c
#suche nach "#define MAILER" und korrigiere den Pfad.

Wer den mailx einsetzt, muss folgende Code-Änderungen machen:

#define MAILER	"/usr/bin/mail -s \"HTTP BLACKLIST %s\" %s"
[....]
              snprintf(filename, sizeof(filename), MAILER, r->connection->remote_ip, email_notify);
              file = popen(filename, "w");
              if (file != NULL) {
//              fprintf(file, "To: %s\n", email_notify);
//              fprintf(file, "Subject: HTTP BLACKLIST %s\n\n", r->connection->remote_ip);
                fprintf(file, "mod_evasive HTTP Blacklisted %s\n", r->connection->remote_ip);

Nun bauen wir das Modul und binden es im Apache ein.

#Einfaches Compilieren mit Apache-Tool apxs:
apxs2 -cia mod_evasive20.c
#suchen wo das fertige Modul ist:
ls -l /usr/lib/apache2/mod_evasive*
ls -l /usr/lib/apache2/modules/mod_evasive*

#dementsprechend wird ein load-file angelegt:
echo "LoadModule evasive20_module  /usr/lib/apache2/mod_evasive20.so" > /etc/apache2/mods-available/mod_evasive.load
ln -s /etc/apache2/mods-available/mod_evasive.load /etc/apache2/mods-enabled/.

Nun fehlt nur noch die Datei /etc/apache2/mods-available/mod_evasive.conf die ebenfalls ins Verzeichnis mods-enabled gelinkt werden muß:

<IfModule mod_evasive20.c>
    DOSHashTableSize    3097
    DOSPageCount        2
    DOSSiteCount        50
    DOSPageInterval     1
    DOSSiteInterval     1
    DOSBlockingPeriod   10
    DOSEmailNotify      webmaster@meine-domain.tld
</IfModule>

Achtung: im beiliegenden Readme steht auch noch die Direktive DOSLogDir. Die ist recht ungünstig benannt, da sie nichts mit Logfiles zu tun hat, sondern eher mit Lock-Files. Am besten läßt man sie per Default auf /tmp/. Falls man die Lockfiles doch woanders ablegen möchte (z.B. in /var/lock/) so sollte man sicherstellen, dass der Apache-User (www-data oder wwwrun) Schreibrechte darauf hat.
(Dies wird leider in einigen Howto's nicht erwähnt. Weshalb mod_evasive dann nicht funktioniert.)

Links:

 

sozial Bookmarking
Bookmarken bei YIGG Bookmarken bei Mister-Wong Bookmarken bei Icio Bookmarken bei del.icio.us Bookmarken bei Technorati Bookmarken bei Furl Bookmarken bei Spurl Bookmarken bei Yahoo Bookmarken bei Google

vom 2006-07-17 09:22, zuletzt 2009-01-21 23:15     Artikel ausdrucken Artikel weiterempfehlen Als PDF-Datei anzeigen

Dieser Inhalt ist unter der Creative-Commons Lizenz lizensiert.

Probleme bitte im Server-Support-Forum diskutieren.

Rubriken zu diesem Artikel
überflüssig 1 2 3 4 5 wertvoll  
Durchschnittliche Bewertung:   3.74 von 5 (19 Bewertungen)

Artikel kommentieren

Kommentar von marneus (2006-07-18 13:19:50):
Sers Huschi,

pack doch den Kompilierungspart, den ich gestern Nacht ausgearbeitet habe auch noch mit rein.

Grüße,
marneus

Kommentar von Blade (2007-02-16 18:28:56):
das http://dspam.nuclearelephant.com/projects/mod_evasive/ ist leder offline.ist das der dspam das selbe?

und wird das einfach runtergeladen und entpackt? oder muss man andere sachen noch durchführen.

mfg

Kommentar von Werner (2007-09-10 16:11:35):
Moin,

man sollte vielleicht noch erwähnen, daß die konfigurierten Werte pro Thread gelten. D.h., daß ein Bot/Crawler/Angreifer bei 150 Apache-Threads nicht 1 mal pro Sekunde eine Seite aufrufen kann, sondern im ungünstigsten Fall 150 mal, bevor er abgeblockt wird. Auf der anderen Seite gibt es keine Garantie, daß man für jeden Aufruf einen anderen Thread bekommt, also wird vielleicht schon der 2. Aufruf geblockt. So wird das Ganze zu einem Glücksspiel und aus meiner Sicht nutzlos.

Gruß, Werner

Kommentar von bladeian (2008-01-17 22:21:27):
Gibt es andere, bessere Möglichkeiten was gegen "refresh click attacken" zu machen?

Kommentar von suther (2008-03-11 21:07:08):
Gibt es noch eine brauchbare Möglichkeit, die IP des Angreifers direkt für eine bestimmte Zeit zu sperren?

Beispielsweise bei einem Angriff die IP für 10 Minuten sperren, und dann wieder freigeben?

Kommentar von Florian (2008-03-16 14:17:57):
Hi, leider bekomme ich immer eine Fehlermeldung. Hier mal mein Log:
____
...# apt-get install libapache2-mod-security
Reading package lists... Done
Building dependency tree... Done
E: Couldn't find package libapache2-mod-security
____

Kommentar von Christoph Zysik (2008-12-07 18:20:45):
Debian Etch:
/usr/lib/apache2/mod_evasive20.so
wird zu
/usr/lib/apache2/modules/mod_evasive20.so

Allgemein:
ls -l /usr/lib/apache2/modules/mod_evansive*
kleiner Rechtschreibfehler ;)

Download-URL für
mod_evasive:
http://www.zdziarski.com/projects/mod_evasive/

Vielen Dank für die tolle Arbeit!

Kommentar von Brian (2009-06-03 18:51:33):
Kompliment zu den Howtos!! das muss unbedingt gesagt werden.

Speziell bei diesem habe ich ein Problem unter Debian Lemmy (5)

die Anpassungen für den xmail funktionieren nicht bei mir. Es wird keine Mail rausgesendet :(

hat sich da vielleicht etwas verändert ??

was Werner schreibt macht auch sinn. Kann ich verhindern, oder durch eine Konfiguration ausschließen, dass ich Suchmaschinen sperre ?? das wäre verheerend :(

Kommentar von huschi (2009-06-03 21:48:33):
Auch auf dieser Seite die Wiederholung:
DIES IST KEIN FORUM!!!

Was Google & Co angeht:
Die ziehen selten die selbe URL innerhalb weniger Sekunden. Wer sich darüber Gedanken macht, hat nicht verstanden wie mod_evasive arbeitet.

huschi.

Kommentar von jürgen (2010-09-07 16:13:22):
#dementsprechend wird ein load-file angelegt:
und wo?

Sonst echt genial .. diese Seite hier :D
Danke

Kommentar von Jan (2010-09-17 20:00:15):
apt-get install libapache2-mod-security

>> Nicht gefunden!
Habe Debian drauf.

Kommentar von Server-Futzi (2012-01-03 14:00:19):
einfach mal die 2 weglassen, dann funktioniert die Installation unter Debian ;)

ich hätte allerdings auch noch eine Frage.. unter Debian, ist beim mod_security keine Konfigurations-Erwähnung in der apache2.conf ...einfach mit reinpacken?