Wie man SSH mit Fail2Ban auf Ubuntu 22.04 schützt

Einführung

SSH ist die Standardmethode zum Verbinden mit einem Cloud-Server. Es ist robust und erweiterbar – neue Verschlüsselungsstandards können verwendet werden, um neue SSH-Schlüssel zu generieren, was sicherstellt, dass das Kernprotokoll sicher bleibt. Allerdings ist kein Protokoll oder Software-Stack völlig narrensicher, und da SSH so weit im Internet verbreitet ist, stellt es eine sehr vorhersehbare Angriffsfläche oder Angriffsvektor dar, über den Personen versuchen können, Zugang zu erhalten.

Jeder Dienst, der dem Netzwerk ausgesetzt ist, ist auf diese Weise ein potenzielles Ziel. Wenn Sie die Protokolle für Ihren SSH-Dienst auf einem stark frequentierten Server überprüfen, sehen Sie oft wiederholte, systematische Anmeldeversuche, die Brute-Force-Angriffe von Benutzern und Bots gleichermaßen darstellen. Obwohl Sie einige Optimierungen an Ihrem SSH-Dienst vornehmen können, um die Erfolgschance dieser Angriffe auf nahezu Null zu reduzieren, wie z.B. Abschalten der Passwortauthentifizierung zugunsten von SSH-Schlüsseln, können sie dennoch eine geringfügige, fortlaufende Haftung darstellen.

Großangelegte Produktionsbereitstellungen, für die diese Haftung völlig inakzeptabel ist, implementieren in der Regel ein VPN wie WireGuard vor ihrem SSH-Dienst, damit es unmöglich ist, direkt über den Standard-SSH-Port 22 aus dem externen Internet eine Verbindung herzustellen, ohne zusätzliche Softwareabstraktionen oder Gateways. Diese VPN-Lösungen genießen weitgehendes Vertrauen, können jedoch Komplexität hinzufügen und einige Automatisierungen oder andere kleine Softwarehooks beeinträchtigen.

Vor oder zusätzlich zur Implementierung eines vollständigen VPN-Setups können Sie ein Tool namens Fail2ban implementieren. Fail2ban kann Brute-Force-Angriffe erheblich reduzieren, indem es Regeln erstellt, die Ihre Firewall-Konfiguration automatisch so ändern, dass bestimmte IPs nach einer bestimmten Anzahl erfolgloser Anmeldeversuche gesperrt werden. Dies ermöglicht es Ihrem Server, sich gegen diese Zugriffsversuche abzusichern, ohne dass Sie eingreifen müssen.

In dieser Anleitung erfahren Sie, wie Sie Fail2ban auf einem Ubuntu 22.04 Server installieren und verwenden können.

Voraussetzungen

Um diese Anleitung abzuschließen, benötigen Sie:

  • Einen Ubuntu 22.04 Server und einen nicht-root-Benutzer mit sudo-Berechtigungen. Weitere Informationen zum Einrichten eines Benutzers mit diesen Berechtigungen finden Sie in unserer Anleitung „Erstkonfiguration des Servers mit Ubuntu 22.04“.

  • Optional: Ein zweiter Server, von dem aus Sie eine Verbindung zu Ihrem ersten Server herstellen können, den Sie verwenden werden, um absichtlich gesperrt zu werden.

Schritt 1 – Installation von Fail2ban

Fail2ban ist in den Software-Repositories von Ubuntu verfügbar. Beginnen Sie damit, die folgenden Befehle als Nicht-Root-Benutzer auszuführen, um Ihre Paketlisten zu aktualisieren und Fail2ban zu installieren:

  1. sudo apt update
  2. sudo apt install fail2ban

Nach der Installation von Fail2ban wird automatisch ein Hintergrunddienst eingerichtet. Er ist jedoch standardmäßig deaktiviert, da einige seiner Standardkonfigurationen unerwünschte Auswirkungen haben können. Sie können dies mit dem Befehl systemctl überprüfen:

  1. systemctl status fail2ban.service
Output
○ fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enabled Active: inactive (dead) Docs: man:fail2ban(1)

Sie könnten Fail2ban sofort aktivieren, aber zunächst werden einige seiner Funktionen überprüft.

Schritt 2 – Konfiguration von Fail2ban

Der fail2ban-Dienst speichert seine Konfigurationsdateien im Verzeichnis /etc/fail2ban. Es gibt eine Datei mit Standardeinstellungen namens jail.conf. Gehen Sie zu diesem Verzeichnis und drucken Sie die ersten 20 Zeilen dieser Datei mit head -20 aus:

  1. cd /etc/fail2ban
  2. head -20 jail.conf
Output
# # WARNUNG: stark umstrukturiert in der Version 0.9.0. Bitte überprüfen und # anpassen für Ihre Konfiguration. # # Änderungen: In den meisten Fällen sollten Sie diese Datei nicht ändern # sondern Anpassungen in der jail.local-Datei bereitstellen, # oder separate .conf-Dateien im Verzeichnis jail.d/ verwenden, z.B.: # # AKTIVIERUNG VON JAILS: # # SIE SOLLTEN DIESE DATEI NICHT ÄNDERN. # # Sie wird wahrscheinlich überschrieben oder bei einem Distributionsupdate verbessert. # # Bereitstellen von Anpassungen in einer jail.local-Datei oder einer jail.d/customisation.local. # Zum Beispiel um die Standard-Bantime für alle Jails zu ändern und den # ssh-iptables-Jail zu aktivieren, würden folgende (auskommentierte) Zeilen in der .local-Datei erscheinen. # Siehe man 5 jail.conf für Details. # # [DEFAULT]

Wie Sie sehen werden, sind die ersten mehreren Zeilen dieser Datei auskommentiert – sie beginnen mit #-Zeichen, was darauf hinweist, dass sie als Dokumentation und nicht als Einstellungen gelesen werden sollen. Wie Sie auch sehen werden, weisen diese Kommentare darauf hin, dass Sie diese Datei nicht direkt ändern sollen. Stattdessen haben Sie zwei Optionen: Entweder erstellen Sie einzelne Profile für Fail2ban in mehreren Dateien im Verzeichnis jail.d/ oder erstellen und sammeln alle Ihre lokalen Einstellungen in einer jail.local-Datei. Die Datei jail.conf wird regelmäßig aktualisiert, wenn Fail2ban selbst aktualisiert wird, und wird als Quelle für Standardwerte verwendet, für die Sie keine Überschreibungen erstellt haben.

In diesem Tutorial erstellen Sie jail.local. Sie können dies tun, indem Sie jail.conf kopieren:

  1. sudo cp jail.conf jail.local

Jetzt können Sie mit der Konfigurationsänderung beginnen. Öffnen Sie die Datei in nano oder Ihrem bevorzugten Texteditor:

  1. sudo nano jail.local

Während Sie durch die Datei scrollen, wird dieses Tutorial einige Optionen überprüfen, die Sie möglicherweise aktualisieren möchten. Die Einstellungen unter der [DEFAULT]-Sektion nahe dem oberen Teil der Datei werden auf alle von Fail2ban unterstützten Dienste angewendet. Anderswo in der Datei gibt es Überschriften für [sshd] und für andere Dienste, die dienstspezifische Einstellungen enthalten, die über den Standards liegen.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
bantime = 10m
. . .

Der Parameter bantime legt die Dauer fest, für die ein Client gesperrt wird, wenn er sich nicht korrekt authentifiziert hat. Dies wird in Sekunden gemessen. Standardmäßig ist dies auf 10 Minuten eingestellt.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .

Die nächsten beiden Parameter sind findtime und maxretry. Diese arbeiten zusammen, um die Bedingungen festzulegen, unter denen ein Client als illegitimer Benutzer angesehen wird, der gesperrt werden sollte.

Die Variable maxretry legt die Anzahl der Versuche fest, die ein Client innerhalb eines von findtime definierten Zeitfensters zur Authentifizierung hat, bevor er gesperrt wird. Mit den Standard-Einstellungen sperrt der Fail2ban-Dienst einen Client, der innerhalb eines 10-minütigen Zeitfensters 5 erfolglose Anmeldeversuche unternimmt.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .

Wenn Sie E-Mail-Benachrichtigungen erhalten möchten, wenn Fail2ban Maßnahmen ergreift, sollten Sie die Einstellungen destemail, sendername und mta evaluieren. Der Parameter destemail legt die E-Mail-Adresse fest, die Sperrnachrichten erhalten soll. Der Parameter sendername legt den Wert des „Von“-Felds in der E-Mail fest. Der Parameter mta konfiguriert, welcher Mail-Service zum Versenden von E-Mails verwendet wird. Standardmäßig ist dies sendmail, aber Sie können auch Postfix oder eine andere Mail-Lösung verwenden.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
action = $(action_)s
. . .

Dieser Parameter konfiguriert die Aktion, die Fail2ban ausführt, wenn es eine Sperrung durchführen möchte. Der Wert action_ ist in der Datei kurz vor diesem Parameter definiert. Die Standardaktion besteht darin, die Firewall-Konfiguration zu aktualisieren, um den Datenverkehr von dem betroffenen Host abzulehnen, bis die Sperrzeit abgelaufen ist.

Es gibt andere action_-Skripte, die standardmäßig bereitgestellt werden, die Sie oben mit $(action_) ersetzen können:

/etc/fail2ban/jail.local
…
# Sperren und eine E-Mail mit einem WHOIS-Bericht an die Ziele-Mail senden.
action_mw = %(action_)s
            %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

# Sperren und eine E-Mail mit einem WHOIS-Bericht und relevanten Protokollzeilen
# an die Ziele-Mail senden.
action_mwl = %(action_)s
             %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]

# Siehe die WICHTIGE Notiz in action.d/xarf-login-attack, wann diese Aktion verwendet werden soll
#
# Sperren und eine XARF-E-Mail an den Missbrauchskontakt der IP-Adresse senden und relevante Protokollzeilen
# an die Ziele-Mail senden.
action_xarf = %(action_)s
             xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]

# IP auf CloudFlare sperren und eine E-Mail mit einem WHOIS-Bericht und relevanten Protokollzeilen
# an die Ziele-Mail senden.
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
                %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
…

Zum Beispiel nimmt action_mw eine Aktion vor und sendet eine E-Mail, action_mwl nimmt eine Aktion vor, sendet eine E-Mail und beinhaltet Logging, und action_cf_mwl führt all dies zusätzlich dazu aus, ein Update an die Cloudflare-API zu senden, die mit Ihrem Konto verbunden ist, um den Täter auch dort zu sperren.

Einstellungen für einzelne Jails

Als Nächstes folgt der Teil der Konfigurationsdatei, der sich mit einzelnen Diensten befasst. Diese werden durch Abschnittsüberschriften wie [sshd] angegeben.

Jeder dieser Abschnitte muss einzeln aktiviert werden, indem unter der Überschrift eine Zeile enabled = true mit ihren anderen Einstellungen hinzugefügt wird.

/etc/fail2ban/jail.local
[jail_to_enable]
. . .
enabled = true
. . .

Standardmäßig ist der SSH-Dienst aktiviert und alle anderen sind deaktiviert.
.
Einige andere Einstellungen, die hier festgelegt sind, sind das filter, das verwendet wird, um zu entscheiden, ob eine Zeile in einem Protokoll eine fehlgeschlagene Authentifizierung anzeigt, und das logpath, das fail2ban mitteilt, wo die Protokolle für diesen bestimmten Dienst gespeichert sind.

Der Wert des filter ist tatsächlich ein Verweis auf eine Datei im Verzeichnis /etc/fail2ban/filter.d, bei der die Dateiendung .conf entfernt ist. Diese Dateien enthalten reguläre Ausdrücke (eine gängige Abkürzung für die Textanalyse), die bestimmen, ob eine Zeile im Protokoll einen fehlgeschlagenen Authentifizierungsversuch darstellt. Wir werden diese Dateien in diesem Leitfaden nicht im Detail behandeln, da sie ziemlich komplex sind und die vordefinierten Einstellungen gut zu entsprechenden Zeilen passen.

Sie können jedoch sehen, welche Art von Filtern verfügbar sind, indem Sie in dieses Verzeichnis schauen:

  1. ls /etc/fail2ban/filter.d

Wenn Sie eine Datei sehen, die mit einem Dienst zusammenhängt, den Sie verwenden, sollten Sie sie mit einem Texteditor öffnen. Die meisten Dateien sind ziemlich gut kommentiert, und Sie sollten zumindest erkennen können, gegen welche Art von Bedingung das Skript geschützt werden sollte. Die meisten dieser Filter haben entsprechende (deaktivierte) Abschnitte in der Datei jail.conf, die wir bei Bedarf in der Datei jail.local aktivieren können.

Zum Beispiel, stellen Sie sich vor, Sie bedienen eine Website mit Nginx und stellen fest, dass ein passwortgeschützter Teil Ihrer Website mit Anmeldeversuchen überlastet wird. Sie können fail2ban anweisen, die Datei nginx-http-auth.conf zu verwenden, um diesen Zustand in der Datei /var/log/nginx/error.log zu überprüfen.

Dies ist tatsächlich bereits in einem Abschnitt namens [nginx-http-auth] in Ihrer Datei /etc/fail2ban/jail.conf eingerichtet. Sie müssten nur den Parameter enabled hinzufügen:

/etc/fail2ban/jail.local
. . .
[nginx-http-auth]

enabled = true
. . .

Nachdem Sie die Bearbeitung abgeschlossen haben, speichern Sie die Datei und schließen Sie sie. Zu diesem Zeitpunkt können Sie Ihren Fail2ban-Dienst aktivieren, damit er von nun an automatisch ausgeführt wird. Führen Sie zunächst systemctl enable aus:

  1. sudo systemctl enable fail2ban

Dann starten Sie ihn manuell zum ersten Mal mit systemctl start:

  1. sudo systemctl start fail2ban

Sie können überprüfen, ob er läuft, mit systemctl status:

  1. sudo systemctl status fail2ban
Output
● fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enab> Active: active (running) since Mon 2022-06-27 19:25:15 UTC; 3s ago Docs: man:fail2ban(1) Main PID: 39396 (fail2ban-server) Tasks: 5 (limit: 1119) Memory: 12.9M CPU: 278ms CGroup: /system.slice/fail2ban.service └─39396 /usr/bin/python3 /usr/bin/fail2ban-server -xf start Jun 27 19:25:15 fail2ban22 systemd[1]: Started Fail2Ban Service. Jun 27 19:25:15 fail2ban22 fail2ban-server[39396]: Server ready

Im nächsten Schritt werden Sie Fail2ban in Aktion demonstrieren.

Schritt 3 — Testen der Sperrrichtlinien (optional)

Von einem anderen Server, der sich in Zukunft nicht auf Ihrem Fail2ban-Server anmelden muss, können Sie die Regeln testen, indem Sie diesen zweiten Server sperren lassen. Nachdem Sie sich auf Ihrem zweiten Server angemeldet haben, versuchen Sie, eine SSH-Verbindung zum Fail2ban-Server herzustellen. Sie können versuchen, sich mit einem nicht vorhandenen Namen anzumelden:

  1. ssh blah@your_server

Geben Sie zufällige Zeichen in die Passwortabfrage ein. Wiederholen Sie dies einige Male. Irgendwann sollte der Fehler, den Sie erhalten, von Permission denied auf Connection refused wechseln. Dies signalisiert, dass Ihr zweiter Server vom Fail2ban-Server gesperrt wurde.

Auf Ihrem Fail2ban-Server können Sie die neue Regel überprüfen, indem Sie die Ausgabe von iptables überprüfen. iptables ist ein Befehl zum Interagieren mit Low-Level-Port- und Firewall-Regeln auf Ihrem Server. Wenn Sie der Anleitung von DigitalOcean zur Initialservereinrichtung gefolgt sind, verwenden Sie ufw, um Firewall-Regeln auf einer höheren Ebene zu verwalten. Wenn Sie iptables -S ausführen, werden Ihnen alle Firewall-Regeln angezeigt, die ufw bereits erstellt hat:

  1. sudo iptables -S
Output
-P INPUT DROP -P FORWARD DROP -P OUTPUT ACCEPT -N f2b-sshd -N ufw-after-forward -N ufw-after-input -N ufw-after-logging-forward -N ufw-after-logging-input -N ufw-after-logging-output -N ufw-after-output -N ufw-before-forward -N ufw-before-input -N ufw-before-logging-forward -N ufw-before-logging-input -N ufw-before-logging-output …

Wenn Sie die Ausgabe von iptables -S an grep weiterleiten, um innerhalb dieser Regeln nach dem String f2b zu suchen, können Sie die Regeln sehen, die von fail2ban hinzugefügt wurden:

  1. sudo iptables -S | grep f2b
Output
-N f2b-sshd -A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd -A f2b-sshd -s 134.209.165.184/32 -j REJECT --reject-with icmp-port-unreachable -A f2b-sshd -j RETURN

Die Zeile mit REJECT --reject-with icmp-port-unreachable wurde von Fail2ban hinzugefügt und sollte die IP-Adresse Ihres zweiten Servers widerspiegeln.

Abschluss

Sie sollten jetzt in der Lage sein, einige Sperrrichtlinien für Ihre Dienste zu konfigurieren. Fail2ban ist eine nützliche Möglichkeit, um jeden Dienst zu schützen, der Authentifizierung verwendet. Wenn Sie mehr darüber erfahren möchten, wie fail2ban funktioniert, können Sie unser Tutorial über wie fail2ban-Regeln und -Dateien funktionieren überprüfen.

Für Informationen darüber, wie Sie fail2ban verwenden können, um andere Dienste zu schützen, können Sie sich über So schützen Sie einen Nginx-Server mit Fail2Ban unter Ubuntu 14.04 und So schützen Sie einen Apache-Server mit Fail2Ban unter Ubuntu 14.04 informieren.

Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-ubuntu-22-04