Wie man SSH mit Fail2Ban auf Ubuntu 20.04 schützt

Einführung

SSH ist die gängige Methode zur Verbindung mit einem Cloud-Server. Es ist robust und erweiterbar – neue Verschlüsselungsstandards können verwendet werden, um neue SSH-Schlüssel zu generieren, sodass 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 die Personen versuchen können, Zugang zu erlangen.

Jeder Dienst, der dem Netzwerk ausgesetzt ist, ist auf diese Weise ein potenzielles Angriffsziel. Wenn Sie die Protokolle für Ihren SSH-Dienst auf einem viel frequentierten Server überprüfen, werden Sie oft wiederholte, systematische Anmeldeversuche sehen, die Brute-Force-Angriffe durch Benutzer und Bots gleichermaßen darstellen. Obwohl Sie einige Optimierungen an Ihrem SSH-Dienst vornehmen können, um die Erfolgschance dieser Angriffe nahezu auf 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, sodass es unmöglich ist, direkt über den Standard-SSH-Port 22 aus dem Internet eine Verbindung herzustellen, ohne zusätzliche Software-Abstraktionen oder Gateways. Diese VPN-Lösungen genießen weites Vertrauen, können jedoch die Komplexität erhöhen und einige Automatisierungen oder andere kleine Softwareanbindungen unterbrechen.

Vor oder zusätzlich zur Implementierung eines vollständigen VPN-Setups können Sie ein Tool namens Fail2ban einsetzen. Fail2ban kann Brute-Force-Angriffe erheblich eindämmen, indem es Regeln erstellt, die automatisch Ihre Firewall-Konfiguration ändern, um bestimmte IPs nach einer bestimmten Anzahl erfolgloser Anmeldeversuche zu sperren. Dadurch kann sich Ihr Server gegen diese Zugriffsversuche absichern, ohne dass Ihr Eingreifen erforderlich ist.

In dieser Anleitung erfahren Sie, wie Sie Fail2ban auf einem Ubuntu 20.04 Server installieren und verwenden.

Voraussetzungen

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

  • Einen Ubuntu 20.04 Server und einen nicht-root-Benutzer mit sudo-Berechtigungen. Sie können mehr darüber erfahren, wie Sie einen Benutzer mit diesen Berechtigungen in unserem Anfangs-Server-Setup mit Ubuntu 20.04-Leitfaden einrichten.

  • Optional ein zweiter Server, von dem aus Sie sich mit Ihrem ersten Server verbinden 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, indem Sie die folgenden Befehle als nicht-root Benutzer ausführen, um Ihre Paketlisten zu aktualisieren und Fail2ban zu installieren:

  1. sudo apt update
  2. sudo apt install fail2ban

Nach der Installation wird Fail2ban automatisch einen Hintergrunddienst einrichten. Es ist jedoch standardmäßig deaktiviert, da einige seiner Standardeinstellungen unerwünschte Effekte verursachen 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 zuerst werden Sie einige seiner Funktionen überprüfen.

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 überarbeitet in der Version 0.9.0. Bitte überprüfen und # anpassen Einstellungen für Ihre Einrichtung. # # Änderungen: in den meisten Fällen sollten Sie diese Datei nicht ändern # aber Anpassungen in der jail.local-Datei bereitstellen, # oder separate .conf-Dateien im Verzeichnis jail.d/ z.B.: # # WIE AKTIVIEREN SIE GEFÄNGNISSE: # # SIE SOLLTEN DIESE DATEI NICHT ÄNDERN. # # Sie wird wahrscheinlich überschrieben oder verbessert bei einem Vertriebsupdate. # # Bieten Sie Anpassungen in einer jail.local-Datei oder einer jail.d/customization.local-Datei. # Zum Beispiel um die Standard-Bantime für alle Gefängnisse zu ändern und um das # ssh-iptables-Gefängnis zu aktivieren, würden die folgenden (auskommentierten) im .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, die anzeigen, dass sie als Dokumentation und nicht als Einstellungen zu lesen sind. 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 individuelle 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 periodisch aktualisiert, wenn Fail2ban selbst aktualisiert wird, und wird als Quelle für Standards verwendet, für die Sie keine Overrides erstellt haben.

In diesem Tutorial erstellen Sie jail.local. Sie können das 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 im Abschnitt [DEFAULT] 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 gelten werden.

/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 betrachtet wird, der gesperrt werden sollte.

Die Variable maxretry legt die Anzahl der Versuche fest, die ein Client innerhalb eines Zeitfensters, das durch findtime definiert ist, authentifizieren muss, bevor er gesperrt wird. Mit den Standardeinstellungen 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 aktiv wird, sollten Sie die Einstellungen destemail, sendername und mta überprüfen. Der Parameter destemail legt die E-Mail-Adresse fest, an die Sperrmeldungen gesendet werden sollen. Der Parameter sendername legt den Wert des „Von“-Felds in der E-Mail fest. Der Parameter mta konfiguriert den E-Mail-Dienst, der zum Senden von E-Mails verwendet werden soll. Standardmäßig ist dies sendmail, aber Sie möchten möglicherweise Postfix oder eine andere E-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 kurz vor diesem Parameter in der Datei definiert. Die Standardaktion besteht darin, die Firewall-Konfiguration zu aktualisieren, um den Datenverkehr des betroffenen Hosts abzulehnen, bis die Sperrzeit abläuft.

Es gibt weitere action_-Skripte, die standardmäßig bereitgestellt werden, die Sie anstelle von $(action_) oben verwenden können:

/etc/fail2ban/jail.local
…
# Sperren & senden Sie eine E-Mail mit dem Whois-Bericht an die Ziel-E-Mail-Adresse.
action_mw = %(action_)s
            %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

# Sperren & senden Sie eine E-Mail mit dem Whois-Bericht und relevanten Protokollzeilen
# an die Ziel-E-Mail-Adresse.
action_mwl = %(action_)s
             %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]

# Sehen Sie sich die WICHTIGE Notiz in action.d/xarf-login-attack an, wann Sie diese Aktion verwenden sollten
#
# Sperren & senden Sie eine XARF-E-Mail an den Missbrauchskontakt der IP-Adresse und fügen Sie relevante Protokollzeilen hinzu
# an die Ziel-E-Mail-Adresse.
action_xarf = %(action_)s
             xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]

# IP auf CloudFlare sperren & senden Sie eine E-Mail mit dem Whois-Bericht und relevanten Protokollzeilen
# an die Ziel-E-Mail-Adresse.
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 Maßnahmen und sendet eine E-Mail, action_mwl führt Maßnahmen durch, sendet eine E-Mail und beinhaltet das Protokollieren, und action_cf_mwl tut all dies zusätzlich dazu, ein Update an die Cloudflare-API zu senden, die mit Ihrem Konto verbunden ist, um den Täter auch dort zu sperren.

Einzelfall-Einstellungen

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

Jeder dieser Abschnitte muss einzeln aktiviert werden, indem eine enabled = true-Zeile unter der Überschrift 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 vorgenommen werden, sind das filter, das verwendet wird, um zu entscheiden, ob eine Zeile in einem Protokoll einen fehlgeschlagenen Authentifizierungsversuch anzeigt, und das logpath, das fail2ban mitteilt, wo die Protokolle für diesen bestimmten Dienst zu finden sind.

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

Sie können jedoch sehen, welche Arten 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 von Ihnen verwendeten Dienst in Verbindung zu stehen scheint, sollten Sie sie mit einem Texteditor öffnen. Die meisten Dateien sind recht gut kommentiert, und Sie sollten zumindest erkennen können, gegen welche Art von Bedingung das Skript entwickelt wurde. Die meisten dieser Filter haben geeignete (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 betreiben eine Website mit Nginx und stellen fest, dass ein passwortgeschützter Bereich Ihrer Website mit Anmeldeversuchen bombardiert 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 enabled-Parameter hinzufügen:

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

enabled = true
. . .

Wenn Sie mit der Bearbeitung fertig sind, 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 Tue 2022-06-28 19:29: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 28 19:29:15 fail2ban20 systemd[1]: Started Fail2Ban Service. Jun 28 19:29:15 fail2ban20 fail2ban-server[39396]: Server ready

Im nächsten Schritt demonstrieren Sie Fail2ban in Aktion.

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. Melden Sie sich nach der Anmeldung auf Ihrem zweiten Server versuchen Sie, eine SSH-Verbindung zum Fail2ban-Server herzustellen. Sie können versuchen, sich mit einem nicht existierenden Namen anzumelden:

  1. ssh blah@your_server

Geben Sie zufällige Zeichen in die Passwortabfrage ein. Wiederholen Sie dies einige Male. Irgendwann sollte sich der Fehler, den Sie erhalten, von Permission denied zu Connection refused ändern. 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 Ihrer 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 Einrichtung des Servers 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 bereits von ufw erstellt wurden:

  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 der Zeichenfolge 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 nun 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 zu Wie fail2ban-Regeln und -Dateien funktionieren lesen.

Für Informationen darüber, wie Sie fail2ban verwenden können, um andere Dienste zu schützen, können Sie lesen ü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.

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