fail2ban – eigene Filter erstellen (apache-404)

Vor kurzem habe ich einen Artikel zu fail2ban veröffentlicht in dem ich erkläre, wie man fail2ban einrichtet.
Hier gehe ich jetzt darauf ein, wie man eigene Filter erstellt.

Wozu eigene Filter erstellen?

fail2ban bringt zwar schon einiges an Filtern mit, mit denen man auf allerlei Sachen prüfen kann. Mit eigenen, individuellen Filtern lassen sich aber genauso spezielle Fehlern filtern und fail2ban wunderbar ergänzen. So kann man spezielle Software, die nicht auf jedem Server läuft, wunderbar überprüfen.

Wozu auf 404 Fehler prüfen?

Vulnerability Scanner prüfen oft auf alte Software, die bekannte Sicherheitslücken hat. Es ist natürlich jedem zu raten, sein System auf dem aktuellstem Stand zu halten. So kann auch nichts passieren. Aber was, wenn eine Sicherheitslücke bekannt wird und die Entwickler sie nicht in absehbarer Zeit (2-4 Tage) schließen? Was wenn dann ein Vulnerability Scanner zufällig seines Weges kommt? Genau! Wir sperren ihn aus.
Und da kommt der 404 Fehler zum tragen. Eine Blacklist währe zwar weitaus effektiver, will aber auch gepflegt werden. Da diese Scanner aber auch viele 404 Fehler auf der Suche nach Software werfen kann man sie sehr leicht daran erkennen und aussperren.

Wie erstelle ich ein apache-404 Filter?

Was suchen wir?

Thu Apr 01 14:35:12 2010] [error] [client 220.112.88.XXX] Invalid URI in request GET HTTP/1.1 HTTP/1.1
[Thu Apr 01 14:35:13 2010] [error] [client 220.112.88.XXX] File does not exist: /var/www/webmail
[Thu Apr 01 14:35:14 2010] [error] [client 220.112.88.XXX] File does not exist: /var/www/roundcube
[Thu Apr 01 14:35:14 2010] [error] [client 220.112.88.XXX] File does not exist: /var/www/rc
[Thu Apr 01 14:35:15 2010] [error] [client 220.112.88.XXX] File does not exist: /var/www/roundcubemail
[Thu Apr 01 14:35:16 2010] [error] [client 220.112.88.XXX] File does not exist: /var/www/mail
[Thu Apr 01 14:35:17 2010] [error] [client 220.112.88.XXX] File does not exist: /var/www/bin
[Thu Apr 01 14:35:18 2010] [error] [client 220.112.88.XXX] File does not exist: /var/www/roundcubemail-0.1

Das ist ein Auszug aus meiner Logdatei error.log von Apache. Unter Debian zu finden unter /var/log/apache2/error.log.  Dieser Scanner meldet sich auch noch mit dem schönem Satz „Toata dragostea mea pentru diavola“ anstelle einer Browserversion was so viel bedeutet wie: „All meine Liebe gilt dem Teufel“. Was wir brauchen sind folgende Informationen:
[Thu Apr 01 14:35:13 2010] [error] [client 220.112.88.XXX] File does not exist: /var/www/webmail
Die IP Adresse, das Datum des Zugriffes und den 404 – Fehler (File does not exist:) müssen wir mit fail2ban heraus filtern und überprüfen.

Anpassen von jail.conf

Als erstes muss die Datei /etc/fail2ban/jail.conf angepasst werden. Sucht dort den Abschnitt „HTTP Servers“ (oder schon vorhandene Blöcke für Apache).

#
# HTTP servers
#

Fügt an dieser Stelle einen Block für unseren apache-404 Filter hinzu.

[apache-404]
enabled = true
port    = http,https
filter  = apache-404
logpath = /var/log/apache*/*error.log
maxretry = 3

Gesperrt wird der Port für http und https (Standard 80 u. 443). Die einzelnen Eigenschaften sollten eigentlich selbsterklärend sein. Ansonsten könnt ihr in dem Artikel nachschlagen, den ich oben verlinkt habe.
Habt ihr die Datei mit einem Editor eurer Wahl (ich verwende vi) angepasst, speichert ihr sie ab und wechselt in das Verzeichnis /etc/fail2ban/filter.d/ um den eigentlichen Filter zu erstellen.

Erstellen des Filters

Unter /etc/fail2ban/filter.d/ findet ihr die Filter für fail2ban. Beim erstellen eines Filters ist folgendes zu beachten

  • der Dateiname muss mit .conf enden
  • die Datei muss von fail2ban gelesen werden können
  • die Datei muss den Namen aus dem Soeben erstelltem Block haben (apache-404 + .conf)
  • die Filter sind regular Expressions

Erstellt ihr einen neuen Filter empfiehlt es sich, einen vorhandenen einfach zu kopieren und anzupassen (cp originaldatei kopie).
Erstellt jetzt die Datei apache-404.conf mit folgendem Inhalt:

# Fail2Ban configuration file
#
# Author: Dominic Derdau
# Website: www.erasel.net
# License: GPL
# You are free to Use this on other Sites if you link back to this Site.
# $Revision: 2.1.1 $
#
[Definition]
# Option:  failregex
# Notes.:  regex to match the "File does not exist" messages in the logfile. The
#          host must be matched by a group named "host". The tag "" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P\S+)
# Values:  TEXT
#
failregex = [[]client <host>[]] File does not exist: *
# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
#          standart search for favicon.ico  and robots.txt - this is often thrown and may do stupid mistakes
# Values:  TEXT
#
ignoreregex = .*(robots.txt|favicon.ico)

Interessant sind hier nur zwei Zeilen:

failregex

Diese Option definiert die Zeichenkette mit der wir nach etwas suchen können. In diesem Fall suchen wir nach einem 404-Fehler (File does not exist:) Die Uhrzeit erkennt fail2ban automatisch und der Client wird mit [[]client []] ausgefiltert. Das * steht als Wildcard für kommenden Code, der uns nicht mehr interessiert.

ignoreregex

Diese Option ist nötig um Unangenehme Nebeneffekte zu vermeiden. Zum Beispiel wird von einem Browser immer versucht eine Datei „favicon.ico“ herunterzuladen (die kleinen Bilder in der Browser leiste). Ist diese Datei nicht vorhanden wird von Apache genauso ein 404-Fehler geworfen. Es währe natürlich fatal, wenn ein User auf einer Website 5x etwas anklickt, und dann gesperrt wird, weil 5x die Datei favicons.ico nicht vorhanden war. Genauso davon betroffen ist die Datei robots.txt welche von Suchmaschinen abgerufen wird.
In beiden Fällen währe es ziemlich dumm, diese Clients zu sperren. Also suchen wir in den zu sperrenden Strings nach robots.txt oder favicon.ico und ignorieren diese Zeilen im Nachhinein da sonst unter Umständen reihenweise User gesperrt werden.

Alles Überprüfen

Jetzt fail2ban neu starten:

linux:~# /etc/init.d/fail2ban restart

Um zu überprüfen ob euer Filter erfolgreich gestartet wurde führt folgenden Befehlt aus:

linux:~# tail /var/log/fail2ban.log

Es werden euch die letzten Zeilen des Logs ausgegeben. Dort sollte diese Zeile auftauchen.
2010-04-02 11:48:01,913 fail2ban.jail : INFO Jail ‚apache-404‘ started
Sollte fail2ban nicht über das init-script starten, könnt ihr fail2ban direkt starten und die Fehlerausgabe analysieren. Meistens sind es Fehler in der Konfiguration oder Namensgebung der Dateien.

linux:~# /usr/bin/fail2ban-client start

Schlusswort

Solche Filter sind, wie ich schon in einem anderem Beitrag erwähnte, keine Sicherheitsmaßname sondern hilft lediglich gegen ScriptKiddis, die sich ein paar Milchzähne aus beißen, und Vulnerability Scanner.

12 Gedanken zu „fail2ban – eigene Filter erstellen (apache-404)

  1. Hallo bei der aktuellen Version scheint es wie bereits oben beschrieben wichtig zu sein das HOST auch wicklich groß geschrieben wird da sonst der Filter nicht greift.
    Evtl. muss man das oben im Tut mal korrigieren. Trotzdem vielen Dank echt Top erklärt.

  2. Danke.
    10GB sind wirklich ein bisschen heftig.
    Wenn Apache aber seit einiger Zeit läuft kann so ein Volumen schnell erreicht werden. Bei mir wurden trotz fail2ban in einer Nacht auch 2GB Datenmüll produziert.
    Eventuell musst du mal logrotate mit installieren. Damit werden Logfiles automatisch ausgetauscht. Somit wird verhindert dass das System uralte Logfiles aufhebt.
    Über Logrotate werde ich demnächst auch einen Blogeintrag veröffentlichen…

  3. Hab den Fehler gefunden … sorry fürs spammen. Meine logdatei war wohl einfach zu gross… ich weiß noch nicht wieso die auf über 10GB angewachsen ist, werde das aber herausfinden.

    Super tut, wird mir bestimmt helfen ;)

  4. ERROR No ‚host‘ group in ‚[[]client []] File does not exist: *‘

    HOST musste bei mir gross geschrieben werden… nur zur Info

  5. Hey,
    mit folgendem Befehl kannst du das mal auf deinem Server testen:

    fail2ban-regex /var/log/apache2/error.log “[[]client []].*w00tw00t*”

    Dein regex für w00tw00t sieht also so aus:

    [[]client <HOST>[]].*w00tw00t*

    Ob du auch einen ignoreregex brauchst weiß ich nicht. Mir fällt auf alle fälle nichts ein ;)
    Gruß,
    Erasel

  6. Schönes Tut. und endlich versteh auch ein wenig die Regex ;)
    Aber wie würde sie denn für meinen speziellen Freund DFind aussehen?
    Im Moment banne ich alles das keinen hostname sendet.
    Würde es aber gerne spezieller gestalten.
    Hier ein kleiner Logauszug:
    [Sat Apr 10 14:59:45 2010] [error] [client 88.191.61.XXX] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)
    Wie müsste ich also meine Regex gestalten damit F2B nur auf das w00tw00t anspringt?
    MfG.: realx :)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload the CAPTCHA.