Heutzutage gehören Angriffe auf Websites, Server etc. zum Alltäglichen und es gibt viele IP-Adressen bzw. ganze Netzwerke, die bekannt sind für teils aggressive und oft automatisierte Angriffe. Daher wäre es ideal, wenn man diesen immer wieder nervenden Angriffen der gleichen IP-Adressen direkt den Zugriff sperrt, und zwar möglichst früh in der Softwarekette. Damit lässt sich dann einiges an Ressourcen/Leistung sparen, sodass die Ladezeit der Website optimalerweise nicht negativ beeinflusst wird. Dies lässt sich praktischerweise sehr gut mit der serverseitigen Anwendung fail2ban lösen. Wie das funktioniert und was ihr dafür tun müsst möchte ich mit diesem Artikel beschreiben.

Was ist Fail2Ban?

Fail2Ban ist ein Software-Tool, das grob umrissen sämtlichen Netzwerkverkehr auf Auffälligkeiten und Missbrauch überwachen kann. Werden festgelegte Muster für einen Angriff erkannt, werden die entsprechenden IP-Adressen, die der Rechner/Server des Angreifers nutzt, auf die Sperrliste der Firewall hinzugefügt. Weitere Zugriffs- und Angriffsversuche laufen damit ins Leere und sorgen dafür, dass die Ressourcen und damit die Performance nicht negativ beeinflusst werden. Das Praktische daran ist: Fail2ban macht dies alles völlig automatisiert.

Was fehlt Fail2Ban?

Fail2ban sperrt und entsperrt zwar die Bösewichte völlig automatisch, doch wird eine dauerhafte Sperre hinterlegter IP-Adressen nicht durchgeführt. Nicht selten aber nerven dieselben Bots und Bösewichte immer wieder, und genau dafür wollen wir eine dauerhafte Sperre.

Warum Fail2Ban und nicht etwas anderes?

Zwar könnten Nginx und Apache das Blacklisting ebenfalls übernehmen, doch das wäre ein Kettenglied zu spät und daher eine nicht wirklich effiziente Lösung. Eine Lösung über entsprechende IP-Tables wäre ebenfalls denkbar und würde denselben Schutz bieten, allerdings nicht so komfortabel und nicht automatisiert.

Das Ziel:

Eine schwarze Liste mit IP-Adressen, die dauerhaft gesperrt werden können, und eine Lösung, bei der die Sperre möglichst früh in der Softwarekette greift, um so wenig Leistung wie möglich zu verlieren. Optimal wären zudem eine leichte Bedienung, eine gute Übersicht der gesperrten IP-Adressen und keine Lösungen, wofür Shell-Befehle und iptables notwendig sind.

Der Lösungsansatz:

  • Erweiterung der „Fail2Ban-Chain“ um einen zusätzlichen Jail (sog. Käfig) mit der jail.conf-Datei
  • Ein Filter für die Fail2Ban-Chain bzw. dem fail2ban-Jail
  • Eine Blacklist-Datei, die sämtliche IP-Adressen enthält

Die Umsetzung:

1. Fail2Ban um einen weiteren Jail erweitern

Zuerst erweitern wir fail2ban um einen weiteren jail. Dazu fügen wir in der Datei jail.conf (zu finden in /etc/fail2ban) Folgendes ein:

[ip-blacklist]

enabled = true
banaction = iptables-allports
port = anyport
filter = ip-blacklist
logpath = /etc/fail2ban/ip.blacklist
maxretry = 0
findtime = 15552000
bantime = -1

Dadurch dass bantime = -1 gesetzt ist, werden Zugriffe mit IP-Adressen aus der Blacklist für immer blockiert. Mit dem Parameter findtime kann der Zeitraum festgelegt werden, innerhalb dessen die IP-Adressen berücksichtigt werden sollen. Im Beispiel entspricht 15552000 einem halben Jahr, ältere Datensätze werden ignoriert.

2. Die Konfiguration für den fail2ban Jail erstellen

Nun erstellen wir die Konfiguration mit dem failregex (Muster für die Sperre). Dazu erstellen wir einfach die Datei ip-blacklist.conf in /etc/fail2ban/filter.d und fügen folgenden Inhalt ein:

[Definition]

# Option: failregex
# Notes : Detection of blocked ip addresses.
# Values: TEXT
#

failregex = ^ \[.*\]$

# Option: ignoreregex
# Notes : Regex to ignore.
# Values: TEXT
#

ignoreregex =

Fail2Ban nutzt den failregex (das Muster), um die Blacklist einzulesen, und sperrt die dort enthaltenen IP-Adressen.

3. Erstellen der Blacklist-Datei

Nun erstellen wir die Blacklist-Datei ip.blacklist in /etc/fail2ban/ und fügen dort alle unsere IP-Adressen ein, denen wir den Zugriff dauerhaft sperren wollen. Pro Zeile kann nur eine IP-Adresse eingetragen werden, und das Format wie im Beispiel muss eingehalten werden, damit Fail2ban die Backlist richtig parsen bzw. einlesen kann.

127.0.0.1 [16/08/2017 12:00:00]
192.168.178.1 [16/08/2017 12:00:00]

4. Dienst neustarten

Nun noch den Fail2Ban Dienst neustarten mit sudo service fail2ban restart und mit iptables -L kontrollieren, ob alle eingetragenen IP-Adressen im Fail2ban-Chain der IP-Table berücksichtigt werden. Teilweise kommt es vor, dass die Blacklist beim ersten Mal nicht richtig erkannt wird, dann kann man dies mit einem simplen Trick beheben: Dazu in der Blacklist einfach eine leere Zeile einfügen, wieder löschen und die Datei speichern. Danach sollte Fail2Ban alle IP-Adressen der Blacklist berücksichtigen.

IP-Backlist erweitern:

Die IP-Blacklist kann direkt erweitert werden und benötigt keinen Neustart von Fail2ban. Fail2Ban erkennt dies automatisch und fügt die neuen IP-Adressen hinzu. Entfernt man allerdings IP-Adressen, so muss der Fail2Ban Dienst neugestartet werden.