Mit fail2ban sichern Sie Ihren Linux-Rechner, indem es automatisch IP-Adressen blockiert, die wiederholt fehlerhafte Verbindungsversuche aufweisen. Es ist eine Art selbstregulierende Sicherheitsmaßnahme. Wir zeigen Ihnen, wie es funktioniert.
Sicherheit geht vor
Wie die berühmte Wallis Simpson einst sagte: „Man kann nie zu reich oder zu dünn sein.“ In unserer modernen, vernetzten Welt könnte man das so formulieren: Man kann nie zu vorsichtig oder zu sicher sein.
Wenn Ihr Rechner eingehende Verbindungsanfragen akzeptiert, beispielsweise für Secure Shell ( SSH ) oder als Web- oder E-Mail-Server dient, muss er vor Brute-Force-Angriffen und Versuchen, Passwörter zu erraten, geschützt werden.
Dafür ist es notwendig, Verbindungsanfragen zu überwachen, die fehlgeschlagen sind. Bei wiederholten Authentifizierungsfehlern innerhalb kurzer Zeit, sollten weitere Versuche unterbunden werden.
Dieser gesamte Prozess ist praktisch nur durch Automatisierung zu bewerkstelligen. Mit einer einfachen Konfiguration übernimmt fail2ban die Überwachung, Blockierung und Entsperrung für Sie.
fail2ban arbeitet mit der Linux-Firewall iptables zusammen und setzt die Sperrung verdächtiger IP-Adressen durch, indem es der Firewall neue Regeln hinzufügt. Für eine klare Darstellung verwenden wir iptables mit einem leeren Regelsatz.
Wenn Ihnen Sicherheit wichtig ist, haben Sie wahrscheinlich bereits eine Firewall mit einem umfangreichen Regelsatz eingerichtet. fail2ban ergänzt und entfernt lediglich eigene Regeln – Ihre bestehenden Firewall-Funktionen bleiben unberührt.
Unseren leeren Regelsatz können wir mit diesem Befehl einsehen:
sudo iptables -L
Installation von fail2ban
Die Installation von fail2ban ist auf allen Distributionen, die wir für diesen Artikel untersucht haben, unkompliziert. Unter Ubuntu 20.04 wird dies mit folgendem Befehl erledigt:
sudo apt-get install fail2ban
Unter Fedora 32 verwenden Sie:
sudo dnf install fail2ban
Auf Manjaro 20.0.1 nutzen wir Pacman:
sudo pacman -Sy fail2ban
Konfiguration von fail2ban
Die fail2ban-Installation enthält eine Standardkonfigurationsdatei namens jail.conf. Diese Datei wird bei Updates von fail2ban überschrieben, wodurch unsere Änderungen verloren gehen, wenn wir sie direkt bearbeiten.
Stattdessen kopieren wir die Datei jail.conf in eine Datei namens jail.local. Konfigurationsänderungen in jail.local bleiben so auch nach Updates erhalten. fail2ban liest beide Dateien automatisch ein.
Die Datei wird wie folgt kopiert:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Öffnen Sie die Datei nun mit Ihrem bevorzugten Editor. Wir verwenden hier gedit:
sudo gedit /etc/fail2ban/jail.local
Suchen Sie in der Datei nach den Abschnitten [DEFAULT] und [sshd]. Achten Sie darauf, die tatsächlichen Abschnitte zu finden. Diese Bezeichnungen sind auch in der Beschreibung oberhalb der eigentlichen Abschnitte zu finden, aber das ist nicht das, was wir suchen.
Der [DEFAULT]-Abschnitt befindet sich etwa ab Zeile 40. Es ist ein langer Abschnitt mit vielen Kommentaren und Erläuterungen.
Scrollen Sie bis etwa zu Zeile 90. Dort finden Sie die vier Einstellungen, die Sie anpassen können:
ignoreip: Eine Liste von IP-Adressen, die niemals blockiert werden. Sie haben eine Art „Freifahrtschein“. Die Localhost-IP-Adresse (127.0.0.1) ist standardmäßig mit ihrer IPv6-Entsprechung (::1) enthalten. Wenn Sie weitere IP-Adressen haben, die niemals gesperrt werden sollen, fügen Sie diese mit einem Leerzeichen dazwischen hinzu.
bantime: Gibt die Dauer der Sperrung einer IP-Adresse an (das „m“ steht für Minuten). Ein Wert ohne „m“ oder „h“ (für Stunden) wird als Sekunden interpretiert. Der Wert -1 führt zu einer permanenten Sperre. Seien Sie vorsichtig, dass Sie sich nicht selbst dauerhaft aussperren.
findtime: Der Zeitraum, in dem zu viele fehlgeschlagene Verbindungsversuche zu einer Sperrung führen.
maxretry: Die Anzahl der „zu vielen fehlgeschlagenen Versuche“.
Wenn Verbindungsversuche von derselben IP-Adresse innerhalb des findtime-Zeitraums die maximale Anzahl fehlgeschlagener Versuche (maxretry) überschreiten, wird diese IP-Adresse für die Dauer von bantime gesperrt. Die einzige Ausnahme bilden IP-Adressen in der ignoreip-Liste.
fail2ban sperrt IP-Adressen für eine festgelegte Zeit. fail2ban unterstützt verschiedene Jails, wobei jede Jail die Einstellungen für eine bestimmte Art von Verbindung festlegt. Dies ermöglicht es, unterschiedliche Einstellungen für verschiedene Verbindungsarten zu konfigurieren. Sie können fail2ban auch so einrichten, dass es nur bestimmte Verbindungstypen überwacht.
Wie der Name des [DEFAULT]-Abschnitts schon vermuten lässt, handelt es sich bei den von uns betrachteten Einstellungen um die Standardwerte. Betrachten wir nun die Einstellungen für die SSH-Jail.
Konfiguration einer Jail
Mit Jails können Sie festlegen, welche Verbindungstypen von fail2ban überwacht werden sollen. Falls die Standardeinstellungen nicht Ihren Vorstellungen für eine Jail entsprechen, können Sie spezifische Werte für bantime, findtime und maxretry setzen.
Scrollen Sie bis etwa zu Zeile 280, wo Sie den [sshd]-Abschnitt finden.
Hier können Sie die Werte für die SSH-Verbindungsjail konfigurieren. Um diese Jail in die Überwachung und Sperrung einzubeziehen, setzen wir die folgende Zeile:
enabled = true
Zusätzlich fügen wir diese Zeile hinzu:
maxretry = 3
Der Standardwert war fünf, aber wir möchten bei SSH-Verbindungen vorsichtiger sein. Wir haben den Wert auf drei reduziert und die Datei dann gespeichert und geschlossen.
Wir haben diese Jail zur Überwachung von fail2ban hinzugefügt und eine der Standardeinstellungen überschrieben. Eine Jail kann eine Kombination aus Standard- und Jail-spezifischen Einstellungen verwenden.
Aktivierung von Fail2ban
Bisher haben wir fail2ban installiert und konfiguriert. Nun müssen wir es aktivieren, damit es als Dienst automatisch startet. Anschließend werden wir es testen, um sicherzustellen, dass es wie erwartet funktioniert.
Um fail2ban als Dienst zu aktivieren, verwenden wir den systemctl-Befehl:
sudo systemctl enable fail2ban
Diesen Befehl verwenden wir auch, um den Dienst zu starten:
sudo systemctl start fail2ban
Den Status des Dienstes können wir ebenfalls mit systemctl überprüfen:
sudo systemctl status fail2ban.service
Alles sieht gut aus – wir haben grünes Licht.
Mal sehen, ob fail2ban zustimmt:
sudo fail2ban-client status
Dies spiegelt unsere Konfiguration wider. Wir haben eine einzelne Jail mit dem Namen [sshd] aktiviert. Wenn wir den Namen der Jail in unserem vorherigen Befehl verwenden, können wir weitere Details anzeigen:
sudo fail2ban-client status sshd
Hier werden die Anzahl der Fehler und gesperrten IP-Adressen angezeigt. Momentan sind diese Werte natürlich noch Null.
Test unserer Jail
Von einem anderen Rechner aus versuchen wir, eine SSH-Verbindung zu unserem Testrechner aufzubauen und geben absichtlich das falsche Passwort ein. Bei jedem Verbindungsversuch haben wir drei Versuche, das Passwort korrekt einzugeben.
Der Wert maxretry wird nach drei fehlgeschlagenen Verbindungsversuchen ausgelöst, nicht nach drei fehlgeschlagenen Passworteingaben. Daher müssen wir das Passwort dreimal falsch eingeben, um den ersten Verbindungsversuch fehlschlagen zu lassen.
Wir versuchen dann einen weiteren Verbindungsversuch und geben das Passwort nochmals dreimal falsch ein. Der erste falsche Passwortversuch bei der dritten Verbindungsanfrage sollte fail2ban auslösen.
Nach dem ersten falschen Passwort bei der dritten Verbindungsanfrage erhalten wir keine Antwort mehr vom Remote-Rechner. Es wird keine Erklärung ausgegeben, nur eine kalte Schulter.
Sie müssen Strg+C drücken, um zur Eingabeaufforderung zurückzukehren. Wenn wir es erneut versuchen, erhalten wir eine andere Antwort:
ssh [email protected]
Zuvor lautete die Fehlermeldung „Permission denied“. Diesmal wird die Verbindung komplett abgelehnt. Wir sind persona non grata. Wir wurden gesperrt.
Betrachten wir noch einmal die Details der [sshd]-Jail:
sudo fail2ban-client status sshd
Es wurden drei Fehler festgestellt und eine IP-Adresse (192.168.4.25) wurde gesperrt.
Wie bereits erwähnt, setzt fail2ban Sperrungen durch, indem es dem Firewall-Regelsatz Regeln hinzufügt. Sehen wir uns den Regelsatz erneut an (zuvor war er leer):
sudo iptables -L
Die INPUT-Regel wurde um eine Regel erweitert, die SSH-Datenverkehr an die f2b-sshd-Kette weiterleitet. Die Regel in der f2b-sshd-Kette lehnt SSH-Verbindungen von 192.168.4.25 ab. Wir haben den Standardwert für bantime nicht geändert, daher wird diese IP-Adresse in 10 Minuten wieder entsperrt und kann neue Verbindungsanfragen stellen.
Wenn Sie eine längere Sperrdauer einstellen (z. B. mehrere Stunden), aber einer IP-Adresse erlauben möchten, früher eine weitere Verbindungsanfrage zu senden, können Sie diese vorzeitig entsperren.
Dazu geben wir Folgendes ein:
sudo fail2ban-client set sshd unbanip 192.168.5.25
Wenn wir von unserem Remote-Rechner eine weitere SSH-Verbindungsanfrage stellen und das korrekte Passwort verwenden, können wir eine Verbindung herstellen:
ssh [email protected]
Einfach und effektiv
Einfach ist in der Regel besser, und fail2ban ist eine elegante Lösung für ein kniffliges Problem. Es erfordert nur eine geringe Konfiguration und verursacht kaum zusätzliche Last – weder für Sie noch für Ihren Computer.