Dieses Tutorial zeigt wie man ein Fail2ban Custom Filter (benutzerdefinierten Filter) für Web Applikationen (z.B. Joomla, Wordpress, etc.) erstellt.
Fail2ban wird benötigt um Brute-Force-Attacken zu blockieren. Einfacheste Erklärung: Eine Brute-Force-Attacke wird durch geführt, wenn man versucht sich in eine Webseite einzuloggen, durch das Ausprobieren von unzähligen Passworts bis das Einloggen erfolgreich gelingt. Mit diesem Fail2ban-Filter wird dieses Problem vermieden.
Mehr über Brute force attacken:
https://de.wikipedia.org/wiki/Brute-Force-Methode
Wenn die von Ihnen verwendete Webanwendung (z.B.: Moodle) Anmeldeversuche nicht in Log-Dateien auf Ihrem Betriebssystem speichert, dann können Sie diesen fail2ban-Filter auf den Access Logdateien Ihres Webservers verwenden (in apache2: es ist die Datei access.log). Wie in diesem Tutorial gezeigt, erkennt der fail2ban-Filter Login-Versuche, wenn der Benutzer über einen Befehl "POST" auf die Login-Seite zugreift (in moodle: die Seite "login/index.php").
Einen benutzerdefinierten Filter für Fail2ban einrichten
Zuerst muss eine Fail2ban Filter-Conf-Datei für den Webdienst angelegt werden. Hier als Beispiel der Webdienst "SERVICENAME"
vim /etc/fail2ban/filter.d/SERVICENAME.conf
In der Datei SERVICENAME.conf folgenden Code einfügen und die URL nach "POST" ANPASSEN:
# SERVICENAME configuration file
#
[Definition]
# Option: failregex
# Notes.: regex to match the password failures messages in the logfile. The
# host must be matched by a group named "host". The tag "<HOST>" can
# be used for standard IP/hostname matching and is only an alias for
# (?:::f{4,6}:)?(?P<host>\S+)
# Values: TEXT
#
failregex = ^<HOST> -.*POST /myurl/login/index.php HTTP/1.1
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
Fail2ban überprüft Loginversuche auf Webseiten mittels dem Failregex. In diesem Beispiel vermeidet das failregex folgenden Vorfall.
Auszug eines Logineintrags von Apache2:
127.0.0.1 - - [28/Feb/2018:14:40:54 +0100] "POST /myurl/login/index.php HTTP/1.1" 303 906 "https://somewebsite.tld/myurl/login/index.php" "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0"
Jetzt müssen Sie einen Jail für den bentzerdefinierten Filter erstellen. Das Jail für den erstellen benutzerdefinierten Filter wird dann in der Datei jail.local hinzugefügt.
[SERVICENAME]
enabled = true
filter = SERVICENAME
action = iptables-multiport[name=web, port="http,https", protocol=tcp]
logpath = /var/log/apache2/access.log
maxretry = 5
ACHTUNG: action kann ausgelassen werden (um Standardeinstellung zu übernehmen). Eventuell müssen logpath oder der failregex angepasst werden. Bei einer Standardkonfigurationen von Apache2 (unter Ubuntu oder Debian) sollte dies passen.
Damit sind wir mit dem Einrichten eines benutzerdefnierten Fail2ban-Filters fertig. Fail2ban wird nach matches (Vorfälle) gemäß der Einstellungen des benutzerdefinierten Filters überprüfen. Bitte vergessen Sie nicht fail2ban neuzustarten!
Fail2ban-Filter testen
Der Fail2ban-Filter kann mit dem Programm fail2ban-regex getestet werden.
fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/SERVICENAME.conf
Mehrere Überprüfungen / Mehrere Zeilen verwenden im failregex
Wenn Sie auf mehrere matches (Vorfälle / Zeilen in den Logdateien) überprüfen möchten, dann müssen Sie das regex in seperate Zeilen hinzufügen. Ein Failregex kann mehrere Zeile haben. Eine dieser Zeilen wird aber auf eine Zeile der Logdatei überprüft (für matches).
Beispielcode:
failregex = Authentication failure for .* from <HOST>
Failed [-/\w]+ for .* from <HOST>
ROOT LOGIN REFUSED .* FROM <HOST>
[iI](?:llegal|nvalid) user .* from <HOST>