Website-Suche

Installieren und Verwenden von Fail2ban auf Debian 12


Installieren und Verwenden von Fail2ban auf Debian 12

Auf dieser Seite

  1. Wie es funktioniert
  2. Fail2ban einrichten

    1. Ein Gefängnis aktivieren
    2. Folge den Protokollen
    3. Fehlerbehebung
    4. Whitelisting eigener IP-Adressen
    5. Manuelles Bannen
    6. Manuelles Entsperren
    7. Schlussfolgerung

Fail2ban überwacht Protokolldateien auf Anmeldefehler und sperrt vorübergehend die fehleranfällige Quell-IP-Adresse, um den Zugang zum Host zu verhindern. Dies ist eine Abwehrmaßnahme gegen Passwort-Rate-Angriffe. Es ist sehr nützlich, Fail2ban auf Hosts zu haben, die dem Internet ausgesetzt sind.

Die Version von fail2ban auf Debian 12 ist 1.0.2.

root@posti:~# fail2ban-client version
1.0.2

Um zu sehen, ob fail2ban derzeit läuft, senden Sie den Befehl ping mit fail2ban-client an den Server. Der fail2ban-Server antwortet mit "pong", wenn er läuft.

root@posti:/etc/fail2ban# fail2ban-client ping
Server replied: pong
root@posti:/etc/fail2ban#

Wie es funktioniert

Fail2ban sammelt Filter, Aktionen und überwachte Dateien in einem Gefängnis. Mehrere Gefängnisse sind bereits mit der Distribution enthalten. Sie müssen aktiviert werden, um zu funktionieren. Der Filter legt fest, wie Authentifizierungsfehler erkannt werden. Die Aktion definiert, wie das Sperren und Entsperren erfolgt.

Einbruchsversuche führen zu einem Bann, wenn während der Findzeit mindestens maxretry Anmeldefehler von derselben IP-Adresse erkannt werden. Dann wird die IP für bantime Sekunden gesperrt. Nach Ablauf der bantime Sekunden wird der Bann aufgehoben und die IP kann wieder auf den Host zugreifen. Fail2ban kann sowohl IPv4 als auch IPv6 verarbeiten.

Weitere Informationen können in den Dateien im Verzeichnis /usr/share/doc/fail2ban/ gelesen werden.

Fail2ban einrichten

Auf Debian GNU/Linux-Systemen wird fail2ban standardmäßig mit dem aktivierten sshd-Gefängnis und angemessenen Einstellungen installiert. Dies geschieht in der Datei /etc/fail2ban/jail.d/defaults-debian.conf. Dies ist das einzige Gefängnis, das standardmäßig funktioniert. Andere Gefängnisse müssen vom Systemadministrator aktiviert werden.

Wenn Sie also nur SSH-Logins überwachen und sich falsch verhaltende Eindringlinge sperren lassen möchten, sind keine zusätzlichen Konfigurationen erforderlich.

Leider funktioniert fail2ban auf Debian 12 möglicherweise nicht mit den Standardeinstellungen. Debian 12 hat das rsyslog-Paket als optional markiert, was bedeutet, dass es möglicherweise nicht installiert ist, sodass Protokolle nur in journald gesammelt werden.

Auf ISPConfig-Systemen funktioniert fail2ban, da der ISPConfig-Autoinstaller rsyslog installiert und das ISPConfig Perfect Server Tutorial anweist, rsyslog zu installieren.

Mit rsyslog erscheinen Protokolldateien im Verzeichnis /var/log/, wodurch die Standardkonfiguration von fail2ban die Protokolldateien findet. Wenn rsyslog nicht installiert ist, muss die fail2ban-Konfiguration geändert werden, damit sie die Protokolle aus dem systemd-Journal liest. Fügen Sie zur default-Sektion in jail.local backend=systemd hinzu, so:

[DEFAULT]
backend = systemd

Ein Gefängnis aktivieren

Die Dokumentation empfiehlt, alle eigenen Änderungen in .local-Dateien zu speichern. Dies vermeidet Probleme, wenn die von der Distribution bereitgestellten Dateien aktualisiert oder vom Maintainer geändert werden [Lesen Sie die Datei /usr/share/doc/fail2ban/README.Debian.gz].

Als Beispiel wird das Aktivieren von pure-ftpd jail durch das Hinzufügen der folgenden Zeilen zur Datei /etc/fail2ban/jail.local (erstellen Sie die Datei, falls sie noch nicht existiert) durchgeführt.

[pure-ftpd]
enabled = true

Der Name des Gefängnisses in eckigen Klammern beginnt den Abschnitt für die Einstellungen dieses Gefängnisses.

Nachdem die Änderungen abgeschlossen sind, erzwingen Sie das erneute Lesen der Konfigurationsdateien mit dem Befehl.

systemctl reload fail2ban

Das Gefängnis sollte jetzt laufen, was mit fail2ban-client überprüft werden kann:

root@posti:/etc/fail2ban# fail2ban-client status pure-ftpd
Status for the jail: pure-ftpd
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	106
|  `- File list:	/var/log/syslog
`- Actions
   |- Currently banned:	0
   |- Total banned:	4
   `- Banned IP list:	
root@posti:/etc/fail2ban# 

Da jail.local nur die Einstellung "enabled" für dieses Gefängnis hat, sind alle anderen Einstellungen Standardwerte aus der Distribution. In der Regel haben sie gute Werte, sodass eine weitere Konfiguration nicht erforderlich ist. Falls nötig, kann der Abschnitt jail.local für dieses Gefängnis Einstellungen enthalten, die die in den .conf-Dateien festgelegten Werte überschreiben.

Dieses Beispiel ändert findtime, maxretry und bantime für das pure-ftpd Gefängnis:

[pure-ftpd]
enabled = true
findtime = 2h
maxretry = 6
bantime = 1d

Der Fail2ban-Client zeigt Zeiten in Sekunden an, aber Zeiten können in den Konfigurationsdateien in einem einfacheren Format eingegeben werden, zum Beispiel 10h anstelle von 36000 Sekunden. Das manuelle Kapitel "TIME ABBREVIATION FORMAT" in der jail.conf erklärt die benutzerfreundlichen Zeitformate zur Eingabe.

fail2ban-client hat die Option, von einem benutzerfreundlichen Zeitformat in Sekunden zu konvertieren.

fail2ban-client --str2sec 1d3h7m
97620

Folge den Protokollen

Um zu bestimmen, welche Jail aktiviert werden sollen, folgen Sie den Protokollen, die von Diensten auf dem Host erstellt werden. Ein Tool, das Zusammenfassungen von Protokollen erstellt, wie logwatch oder pflogsumm, ist hilfreich. Rohprotokolle zu lesen ist zeitaufwendig und mühsam.

Überprüfen Sie, ob es ein Jail für einen Dienst gibt, der auf dem Host läuft, möglicherweise indem Sie jail.conf lesen.

Sobald Protokolle etwas Interessantes oder Besorgniserregendes zeigen, ist es an der Zeit, sie zu überprüfen. Zum Beispiel sendete pflogsumm eine E-Mail-Zusammenfassung mit Zeilen wie dieser:

136   unknown[91.224.92.40]: SASL LOGIN authentication failed: UGFzc3...
136   hostname srv-91-224-92-40.serveroffer.net does not resolve to a...
123   unknown[193.32.162.23]: SASL LOGIN authentication failed: UGFzc...
123   hostname mail.whatami.co does not resolve to address 193.32.162.23

Das zeigt, dass die IP 91.224.92.40 136 Mal beim Einloggen ins E-Mail-Konto gescheitert ist, sowie einen weiteren ähnlichen Fall. Fail2ban hätte so viele Versuche verhindern sollen. Um zu sehen, warum das nicht passiert ist, überprüfen Sie das Fail2ban-Log.

root@posti:/etc/apt/apt.conf.d# grep 91.224.92.40 /var/log/fail2ban.log | head
2024-02-18 00:01:38,718 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:01:38
2024-02-18 00:11:50,261 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:11:50
2024-02-18 00:21:54,337 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:21:54
2024-02-18 00:32:14,232 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:32:14
2024-02-18 00:42:37,921 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:42:37
2024-02-18 00:53:06,796 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:53:06
2024-02-18 01:03:35,293 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:03:35
2024-02-18 01:14:03,765 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:14:03
2024-02-18 01:24:24,628 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:24:24
2024-02-18 01:34:43,876 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:34:43
root@posti:/etc/apt/apt.conf.d#

Diese IP versucht alle etwa 10 Minuten zu verbinden, und die fail2ban-Sperre postfix-sasl erkennt dies.

Es ist eine gute Idee herauszufinden, ob diese IP vielleicht zu einem legitimen Benutzer des Hosts gehört, der einfach ein altes Passwort auf seinem Smartphone oder einem anderen Gerät hat und versucht, sich in regelmäßigen Abständen zu verbinden. Ich benutze geoiplookup, es zeigt, aus welchem Land die IP stammt. Meine Nutzer sind aus meinem Land, daher neigen ausländische Benutzer dazu, schlechte Akteure zu sein. Geoiplookup stammt von den Debian-Paketen geoip-database und geoip-bin.

geoiplookup 91.224.92.40
GeoIP Country Edition: LT, Lithuania

Um herauszufinden, warum die IP nicht gesperrt wurde, untersuche die Findzeit dieses Gefängnisses:

root@posti:/etc/apt/apt.conf.d# fail2ban-client get postfix-sasl findtime
600
root@posti:/etc/apt/apt.conf.d#

Ich habe kürzlich diese langsamen Angriffe gesehen, der Täter weiß, dass die Findzeit 10 Minuten beträgt, also versucht er, das Verbot zu vermeiden, indem er sich in längeren Abständen anmeldet. Das hat in diesem Fall funktioniert. Um sicherzustellen, dass fehlgeschlagene Anmeldungen zu Sperren führen, erhöhen Sie die Findzeit für das Gefängnis, zum Beispiel auf 10 Stunden. Fügen Sie dazu der Datei jail.local im Abschnitt [postfix-sasl] hinzu:

findtime = 10h

Dann hat die Gefängnisstrafe nach dem Befehl 'systemctl reload fail2ban' eine längere Suchzeit:

root@posti:/etc/fail2ban# fail2ban-client get postfix-sasl findtime
36000
root@posti:/etc/fail2ban#

Eine weitere Methode, wie Eindringlinge versuchen, sich Zugang zu verschaffen, ist hartnäckig zu sein. Selbst wenn ein Eindringling gesperrt ist, wartet er einfach, bis die Sperre endet, und versucht weiterhin, das Passwort zu erraten. Die Sperrdauer könnte verlängert werden, aber das verursacht Probleme für legitime Benutzer, die ihr Passwort möglicherweise falsch eingeben und dann keinen Zugriff auf ihr Konto haben, bis die Sperrdauer endet. Es gibt ein Gefängnis für Rückfällige namens Recidive. Es funktioniert, indem es nach wiederholten Sperren für eine IP in den fail2ban-Protokollen sucht und dann für eine lange Zeit, zum Beispiel eine Woche, sperrt.

Die folgende Auflistung stammt aus dem Logwatch-Bericht:

--------------------- pam_unix Begin ------------------------ 

 sshd:

    Authentication Failures:

       unknown (212.70.149.150): 59 Time(s)

Die Suche nach dieser IP in der Protokolldatei zeigt:

2024-02-21 03:42:39,121 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 03:42:38
2024-02-21 03:42:39,508 fail2ban.actions        [895]: NOTICE  [sshd] Ban 212.70.149.150
2024-02-21 03:52:38,386 fail2ban.actions        [895]: NOTICE  [sshd] Unban 212.70.149.150
2024-02-21 03:54:33,560 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 03:54:33
2024-02-21 03:54:35,364 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 03:54:35
2024-02-21 04:00:37,017 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 04:00:36
2024-02-21 04:00:39,021 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 04:00:38
2024-02-21 04:06:43,036 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 04:06:42
2024-02-21 04:06:45,039 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 04:06:44
2024-02-21 04:06:45,426 fail2ban.actions        [895]: NOTICE  [sshd] Ban 212.70.149.150
2024-02-21 04:16:44,302 fail2ban.actions        [895]: NOTICE  [sshd] Unban 212.70.149.150
2024-02-21 04:19:04,868 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 04:19:04

Fail2ban funktioniert wie beabsichtigt, indem es die falschen Anmeldungen findet und für 10 Minuten ein Verbot verhängt. Während dieses Verbots wird dem Täter der Zugriff auf diesen Host verwehrt, aber er kann nach Aufhebung des Verbots wieder fortfahren. Dies scheint der Fall eines ernsthaften Versuchs zu sein, einzubrechen. Die Lösung besteht darin, das Rückfall-Gefängnis mit niedriger maxretry und langer bantime zu aktivieren.

Ich verwende gerne kurzfristige anfängliche Sperren, sagen wir 10 Minuten. Wenn ein echter Benutzer gesperrt wird, muss er einfach auf diese Zeit warten, in der Hoffnung, die richtige Passphrase zu finden und es dann erneut zu versuchen. Diejenigen, die am selben Tag erneut gesperrt werden, werden für eine Woche gesperrt. Die Standardwerte für die Rückfallhaft können in der Datei jail.conf gefunden werden, dort gibt es eine Sperrzeit von 1 Woche und eine Suchzeit von 1 Tag, die scheinen mir in Ordnung zu sein. Aber ich habe maxretry auf 2 gesetzt, sodass Täter schneller gesperrt werden. Ich habe zur Datei jail.local hinzugefügt:

[recidive]
enabled = true
maxretry = 2

Längere Sperren von mehr als einer Woche sind meiner Meinung nach nicht sinnvoll. Irgendwann wird die alte IP-Adresse überall gesperrt oder auf eine schwarze Liste gesetzt, sodass der Sünder eine neue IP erhält. Die alte IP wird einem unschuldigen neuen Internetnutzer zugewiesen, der nicht für die schlechten Dinge bestraft werden sollte, für die der vorherige Inhaber dieser IP schuldig ist.

Fehlerbehebung

Nach dem Booten des Betriebssystems oder dem Neustart wird der Status von fail2ban wiederhergestellt, sodass die Sperrungen fortgesetzt werden, bis die Sperrzeit abgelaufen ist. Daher können Tests und Fehlersuche Neustarts beinhalten.

Um die Konfiguration zu testen, gibt es eine Testoption:

fail2ban-server --test

Um herauszufinden, ob eine IP gesperrt ist, können neuere Versionen von fail2ban das machen.

fail2ban-client banned 43.131.9.186
[['recidive']]

Der Befehl zeigt eine Liste von Jail, in denen die gegebene IP derzeit gesperrt ist.

Ältere Versionen von fail2ban haben diesen Befehl nicht. Das Testen jeder Jail einzeln kann so durchgeführt werden:

fail2ban-client status recidive | tr " " "\n" | grep 43.163.219.232
43.163.219.232

Wenn die Ausgabe die IP zeigt, dann war sie in der Liste der gesperrten IP-Nummern. Der tr-Befehl dient dazu, die Liste der gesperrten IP-Nummern (es ist eine lange Zeile) auf eine IP pro Zeile zu unterteilen.

Um zu sehen, was mit einer bestimmten IP passiert ist, suche sie in fail2ban.log:

root@posti:/etc/mysql# grep 43.131.9.186 /var/log/fail2ban.log | cut --characters=-80

2024-03-06 09:00:40,295 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:02:53,954 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:02:55,958 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:04:34,193 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:04:36,195 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:04:36,388 fail2ban.actions [3574846]: NOTICE  [sshd] Ban 43
2024-03-06 09:04:36,626 fail2ban.filter  [3574846]: INFO    [recidive] Fo
2024-03-06 09:14:35,180 fail2ban.actions [3574846]: NOTICE  [sshd] Unban
2024-03-06 09:15:10,073 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:16:55,919 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:16:58,522 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:18:44,972 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:20:30,018 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:20:30,499 fail2ban.actions [3574846]: NOTICE  [sshd] Ban 43
2024-03-06 09:20:30,620 fail2ban.filter  [3574846]: INFO    [recidive] Fo
2024-03-06 09:20:30,899 fail2ban.actions [3574846]: NOTICE  [recidive] Ba
2024-03-06 09:20:32,021 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:30:29,289 fail2ban.actions [3574846]: NOTICE  [sshd] Unban

Ausführliches Dumping der fail2ban-Konfiguration zeigt Einstellungswerte zur Überprüfung:

fail2ban-client -vvv -d

Whitelisting eigener IP-Adressen

Vielleicht werden deine eigenen Hosts gesperrt oder du möchtest sicherstellen, dass einige ausländische Hosts niemals gesperrt werden, selbst wenn sie sich schlecht verhalten. Diese IP-Nummern können auf die Whitelist gesetzt werden. Standardmäßig ist nichts auf der Whitelist, du kannst dies überprüfen mit:

root@posti:~# fail2ban-client get sshd ignoreip
No IP address/network is ignored
root@posti:~

Die Einstellung ignoreip kann in jedem Abschnitt der Jails festgelegt werden, aber diese Einstellung sollte alle Jails betreffen, daher ist es besser, sie im DEFAULT-Abschnitt festzulegen. Es könnte am besten sein, ignore auf das interne Subnetz zu setzen, damit alle eigenen Hosts Banns vermeiden. Dies ist der Anfang von jail.local:

[DEFAULT]
ignoreip = 92.237.123.96/27

Der Standardabschnitt kann andere Einstellungen haben, die alle Gefängnisse betreffen. Zum Beispiel könnte dort findtime=10h hinzugefügt werden.

Manuelles Bannen

Um zu testen, was passiert, wenn man sperrt, setze die Sperre manuell. Teste zuerst mit einem Gefängnis mit kurzer Sperrdauer, damit du eventualmente zurückkommst, falls du dich versehentlich selbst sperrst. Zum Beispiel

fail2ban-client set sshd banip 8.8.4.4</>

Wenn eine bestimmte IP sich schlecht verhält, aber Sie fail2ban nicht dazu bringen können, sie zu erkennen und Sperren auszusprechen, entfernt eine manuelle Sperre im Rückfallgefängnis diese IP für eine Woche.

fail2ban-client set recidive banip 8.8.4.4

Das Sperren eines Subnetzes funktioniert mit CIDR-Notation:

fail2ban-client set recidive banip 5.188.87.0/24

Manuelles Entsperren

Ein Verbot aufzuheben ist möglich, aber bedenken Sie, dass die IP erneut gesperrt wird, wenn das schlechte Verhalten weiterhin anhält. Daher sollten Sie herausfinden, was passiert (zum Beispiel durch das Lesen der Protokolle) und das schlechte Verhalten beheben.

fail2ban-client set recidive unbanip 8.8.4.4

Die IP kann in mehreren Jail-Umgebungen gesperrt sein. Um eine IP in allen Jails zu entsperren, verwenden Sie

fail2ban-client unban 8.8.4.4

Ich muss das jedoch selten tun. Ich habe 10 Minuten Bantime, außer das Rückfallgefängnis hat 1 Woche, also entbanne ich nur die IP aus dem Rückfallgefängnis, andere Gefängnisse sind bereits abgelaufen. Wenn du das Rückfallgefängnis nicht verwendest, kann die IP in mehreren Gefängnissen gleichzeitig gesperrt werden, daher ist das nützlich.

Um alle IP-Adressen aus allen Haftanstalten zu entbannen

fail2ban-client unban --all

Schlussfolgerung

Fail2ban erschwert das Erraten von Passwörtern, verhindert jedoch nicht vollständig, dass Angreifer versuchen, auf den Host zuzugreifen. Bei SSH bietet die Verwendung von SSH-Schlüsseln einen besseren Schutz, da dadurch das Einloggen mit einem Passwort verhindert wird. Bei anderen Diensten verhindert die Multi-Faktor-Authentifizierung das Einloggen, wenn nur das Passwort bekannt ist.