Inhalt

Schützen Sie Ihren Server mit Fail2Ban: Der ultimative Leitfaden

Entdecken Sie, wie Sie die Sicherheit Ihres Servers mit Fail2Ban, der leistungsstarken Intrusion Prevention Software, erhöhen können. Erfahren Sie, wie Sie die Software einrichten und konfigurieren, um Ihren Server vor unbefugten Zugriffsversuchen zu schützen.

Sobald Sie Ihren Server starten, stürzt er sich sofort in den Ozean der Botnets, die versuchen, sich mit den üblichen Anmeldedaten anzumelden. Und wenn Ihr Server irgendetwas Nützliches enthält, kann er früher oder später zum Ziel von Skript-Kiddies oder sogar von fortgeschritteneren Leuten mit leistungsstarken Computern und neuesten Technologien, einschließlich künstlicher Intelligenz, werden.

Mit Fail2ban können Sie Ihren Server vor den Botnetzen schützen und den Hackern das Leben etwas erschweren.

Was ist Fail2ban (F2B)

Fail2Ban ist ein IPF - Intrusion Prevention Framework, das Server vor externen Angriffen schützt. Es wurde von Cyril Jaquier (Schweiz) im Jahr 2004 entwickelt und wird seitdem von einer wachsenden Gemeinschaft aktiv weiterentwickelt.

F2B überwacht Protokolldateien, z.B. auth.log, apache- oder nginx-Zugriffsprotokolle, und ergreift Maßnahmen gegen IPs mit zu vielen unerwünschten Aktivitäten innerhalb einer vordefinierten Zeitspanne.

Mögliche Aktionen sind:

  • die Aktualisierung von Firewall-Regeln,
  • das Versenden von E-Mail-Benachrichtigungen,
  • Meldung von schlechten IPs an einen speziellen Dienst,
  • jede andere Aktion, die mit einem Python-Skript durchgeführt werden kann.

Die Standardkonfiguration enthält bereits Filter für verschiedene Dienste, z.B. sshd, postfix und viele andere. Jeder Filter ist so konzipiert, dass er durch die Verwendung komplexer regulärer Ausdrücke Fehler für diesen speziellen Dienst identifiziert. Er definiert diese regulären Ausdrücke in einer Variablen namens failregex. Eine Kombination aus einem Filter und vordefinierten Aktionen wird als “Jail” bezeichnet.

Was die Schwächen von F2B betrifft, so müssen Sie wissen, dass es nicht sehr gut gegen verteilte Brute-Force-Angriffe funktioniert. Der Grund dafür ist, dass die überwachten Protokolldateien etwa einmal pro Sekunde neu gescannt werden. Das sollte in den meisten Fällen ausreichen, aber es ist möglich, dass mehr Anmeldeversuche fehlschlagen als im Parameter “maxretry” angegeben.

Hier muss ich eine optionale, aber empfohlene Software erwähnen - Gamin, der File Alteration Monitor von Daniel Veillard. (Aktualisierung von 2022: der Link zu einer Bibliothek war tot, daher stelle ich Ihnen den Link zur Homepage des Autors zur Verfügung und Sie können bei Bedarf auch versuchen, selbst nach dieser Software zu suchen). Wenn Gamin installiert ist und Backend in jail.conf auf auto oder gamin eingestellt ist, ist eine aktive Abfrage der Protokolldateien nicht mehr erforderlich. Die Aktionen werden ausgelöst, sobald die Protokolldateien geändert werden.

Die Systemanforderungen von F2B sind recht gering. Wenn F2B nur mit sshd und recidive Jails konfiguriert ist, benötigt es etwa 500 MB Arbeitsspeicher und belastet 1 CPU-Kern im Durchschnitt zu weniger als 0,2%.

Links:

Wenn Sie bei der Entwicklung von F2B mithelfen und/oder ein tieferes Verständnis der Filter erlangen möchten, dann sind Sie herzlich willkommen:

Zwei Wege zur Installation

Führen Sie zunächst eine Standardaktualisierung der Repos und Pakete mit durch:

1
sudo apt update && sudo apt upgrade -y

Dann haben Sie zwei Möglichkeiten, die Software zu installieren.

Einfach mit stabiler Version

Wenn Sie den schnelleren Weg bevorzugen, das vom System verwaltete Paket und die stabile Version, dann verwenden Sie einfach diesen Befehl:

1
sudo apt install fail2ban -y

Techy mit der neuesten Version

Wenn Sie das Neueste und Beste bevorzugen, dann installieren Sie es von GitHub. Denken Sie daran, dass dies ein wenig mehr Tanz erfordert. Stellen Sie zunächst sicher, dass Sie Python oder Python 3 in Ihrem System installiert haben. Ich werde Python 3 verwenden, also überprüfen Sie bitte, ob Sie Python 3 installiert haben:

1
python3 --version

Wenn Sie als Ergebnis dieses Befehls die Meldung erhalten: “Der Befehl ‘python3’ wurde nicht gefunden, kann aber mit… installiert werden “, dann:

1
2
sudo apt install python3
sudo apt install python3-setuptools

Und, nur für den Fall der Fälle:

1
sudo apt install git

Dann laden Sie die Version aus dem offiziellen F2B-Repository herunter:

1
2
3
4
cd ~
git clone https://github.com/fail2ban/fail2ban.git
cd fail2ban
sudo python3 setup.py install

Hoffentlich haben Sie keine Fehlermeldung erhalten. Falls doch, googeln Sie bitte nach der Lösung, da dies den Rahmen dieses Beitrags sprengen würde.

Mit dem nächsten Befehl können Sie bequemer arbeiten und F2B-bezogene Befehle wie fail2ban-client, fail2ban-server, fail2ban-regex automatisch vervollständigen, indem Sie in der Konsole die Tabulator-Taste drücken:

1
sudo cp files/bash-completion /etc/bash_completion.d/fail2ban

Wenn auf Ihrem Server viel passiert, ist es eine gute Idee, eine Log-Rotation einzurichten. Nachdem das Protokoll eine bestimmte Größe erreicht hat, wird es archiviert und F2B beginnt, in eine neue Datei zu schreiben. So richten Sie die Rotation der F2B-Protokolle ein:

1
sudo wget -O /etc/logrotate.d/fail2ban https://raw.githubusercontent.com/fail2ban/fail2ban/debian/debian/fail2ban.logrotate

Jetzt müssen Sie F2B als Dienst aktivieren.

1
2
3
sudo cp ~/fail2ban/build/fail2ban.service /lib/systemd/system/
cd /etc/systemd/system/
sudo ln /lib/systemd/system/fail2ban.service fail2ban.service

Sie erhalten daraufhin diese Nachricht:

Created symlink /etc/systemd/system/multi-user.target.wants/fail2ban.service → /etc/systemd/system/fail2ban.service.

Lassen Sie uns nun F2B starten:

1
sudo systemctl start fail2ban

Und überprüfen Sie den Status des Dienstes:

1
sudo systemctl status fail2ban

Version prüfen:

1
sudo fail2ban-client version

Im November 2021 ist die neueste und stabile Version 0.11.2. Sie können die neueste Version hier überprüfen.

Aktivieren Sie den Dienst fail2ban, damit er nach Neustarts ausgeführt wird:

1
sudo systemctl enable fail2ban.service

Starten Sie auch den Dienst rsyslog neu:

1
sudo service rsyslog restart

Erledigt.

Grundlegende Konfiguration

Sie konfigurieren Fail2Ban mithilfe der Dateien in /etc/fail2ban.

Die wichtigste Datei ist jail.conf, die ich nicht empfehle, direkt zu bearbeiten, da sie nach jeder Aktualisierung von F2B neu geschrieben wird. Die gängige Praxis ist, alle Ihre Anpassungen in der Datei jail.local vorzunehmen. Beim Start liest F2B zuerst die *.conf-Dateien und dann die *.local-Versionen, falls sie existieren. Die Einstellungen in letzterer werden übernommen.

In allen folgenden Befehlen können Sie vim durch Ihren Lieblingseditor ersetzen, z.B. nano. Lassen Sie uns nun eine neue Datei erstellen, jail.local:

1
sudo vim /etc/fail2ban/jail.local

Um in dieser neuen Datei Parameter für alle Jails einzurichten, definieren Sie diese im Abschnitt DEFAULT:

1
2
3
4
5
[DEFAULT]

bantime  = 3h
findtime = 10m
maxretry = 5

Diese Einstellungen sperren jede IP-Adresse für drei Stunden {bantime = 3h}, wenn innerhalb eines Intervalls von 10 Minuten {findtime = 10m} 5 {maxretry = 5} fehlgeschlagene Verbindungsversuche von dieser bestimmten IP festgestellt werden.

Dieselben Parameter, die unter einer einzelnen Jail eingestellt sind, haben Vorrang vor den allgemeinen Einstellungen, so dass Sie die Einstellungen für jede Jail separat feinabstimmen können.

Wenn Sie sich ständig von statischen IPs aus mit Ihrem Server verbinden, ist es eine gute Idee, diese auf eine Whitelist zu setzen, damit sie nicht gebannt werden. Sie können mehrere IPs auf die Whitelist setzen, indem Sie sie mit Leerzeichen voneinander trennen. Localhost ist standardmäßig auf der Whitelist.

1
ignoreip = 127.0.0.1 x.x.x.x y.y.y.y

Sagen wir F2B nun, dass es das sshd-Gefängnis aktivieren soll:

1
2
[sshd]
enabled = true

Die vollständige Version einer sehr einfachen Datei jail.local sieht nun wie folgt aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# Fail2Ban LOCAL configuration file.

[DEFAULT]

bantime  = 3h
findtime = 10m
maxretry = 5

ignoreip = 127.0.0.1

# JAILS

[sshd]
enabled = true

Zeit-Abkürzungsformate

Die Zeitangaben in der F2B-Konfiguration (wie findtime oder bantime) können als Ganzzahl in Sekunden oder als String unter Verwendung eines speziellen Abkürzungsformats angegeben werden, z. B. 600 ist das gleiche wie 10m (10 Minuten).

Akzeptable Abkürzungs-Token:

1
2
3
4
5
6
7
years?, yea?, yy?
months?, mon?
weeks?, wee?, ww?
days?, da, dd?
hours?, hou?, hh?
minutes?, min?, mm?
seconds?, sec?, ss?

Das Fragezeichen (?) folgt auf das optionale Zeichen. Um die Zeit in Tagen anzugeben, können Sie days oder day, da, dd oder d verwenden. Sie können mehrere Token im Format mit Leerzeichen getrennt bzw. ohne Trennzeichen kombinieren, z. B.: 1j 6mo oder 1d12h30m.

Beachten Sie, dass die Token m sowie mm für Minuten stehen, für Monat verwenden Sie die Abkürzung mo oder mon.

Sie können das Zeitabkürzungsformat in Sekunden umwandeln, indem Sie fail2ban-client mit der Option --str2sec:

1
2
> fail2ban-client --str2sec 1d12h
129600

It is also possible to configure the server using commands sent via fail2ban-client. The available commands are described in the fail2ban-client(1) manpage.

Bear in mind that fail2ban-client set only updates values for a running F2B server, so do not forget to update the configuration file accordingly if they have to be persistent!

Also see fail2ban(1) and jail.conf(5) man pages for further references:

Erweiterte Konfiguration

Eine sehr einfache Möglichkeit, die Sicherheit zu erhöhen, ist das Hinzufügen von recidive jail. Das Standard-Gefängnis sperrt die IP und gibt sie nach einer bestimmten Zeit wieder frei, so dass diese IP nicht daran gehindert wird, ihre Verbindungsversuche zu wiederholen. Lassen Sie uns ein spezielles Gefängnis für solche Rückfalltäter einrichten. Kopieren Sie dies und fügen Sie es in Ihre Datei jail.local ein:

1
2
3
4
[recidive]
enabled   = true
bantime   = 9w
findtime  = 3d

Der Unterschied ist, dass das [recidive]-Gefängnis auf das F2B-Protokoll selbst in /var/log/fail2ban.log verweist. Wenn dieselbe IP dort innerhalb der findtime Zeitspanne (hier 3 Tage) auftaucht, wird sie für die in dieser Jail angegebene bantime gebannt, in diesem Fall 9 Wochen.

Lassen Sie uns nun ein ausgeklügeltes Verbotssystem einrichten, das die Verbotszeit bei jedem Versuch um eine zufällige Zeitspanne erhöht, um das Leben für “clevere” Botnetze zu erschweren. Fügen Sie diese Information zu Ihrer jail.local hinzu:

1
2
3
4
5
6
7
8
[DEFAULT]

bantime.increment    = true
bantime.rndtime      = 30m
bantime.maxtime      = 60d
bantime.factor       = 2
bantime.formula      = ban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)
bantime.overalljails = true

Lassen Sie uns jeden Parameter einzeln betrachten.

  • bantime.increment ermöglicht es, die Datenbank für die Suche nach zuvor gesperrten IPs zu verwenden, um die Standard-Bannzeit mit einer speziellen Formel zu erhöhen, die standardmäßig banTime 1, 2, 4, 8, 16, 32…* ist.
  • bantime.rndtime ist die maximale Anzahl von Sekunden, die für die Vermischung mit der Zufallszeit verwendet wird, um zu verhindern, dass “clevere” Botnets die genaue Zeit berechnen, nach der eine IP wieder entsperrt werden kann.
  • bantime.maxtime ist die maximale Anzahl von Sekunden, die die Bannzeit erreichen kann (wächst nicht weiter an)
  • bantime.factor ist ein Koeffizient für die Formel zur Berechnung des exponentiellen Wachstums oder des allgemeinen Multiplikators. Der Standardwert ist 1 und damit wächst die Bannzeit um 1, 2, 4, 8, 16…
  • bantime.formula wird standardmäßig verwendet, um den nächsten Wert der Bannzeit zu berechnen; der Standardwert wird unten angezeigt. Die gleiche Erhöhung der Bannzeit wird mit den Multiplikatoren 1, 2, 4, 8, 16, 32… erreicht.

Beispiel für die Standardformel:

1
bantime.formula = ban.Time * (1<<(ban.Count if ban.Count<20 else 20)) * banFactor

Aggressiveres Beispiel der Formel, es hat die gleichen Werte nur mit dem Faktor “2.0 / 2.885385”:

1
bantime.formula = ban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)

Unter Berücksichtigung unserer vorherigen Einstellungen und dieser erweiterten Einstellungen wird F2B nun Folgendes tun:

  • Jede IP-Adresse für 3 Stunden sperren, wenn sie innerhalb von 10 Minuten 5 fehlgeschlagene Verbindungsversuche unternimmt
  • Speichern Sie diese IP-Adresse in Ihrer internen Datenbank
  • Heben Sie die Sperre nach 3 Stunden auf.
  • Wenn diese IP-Adresse einen weiteren fehlgeschlagenen Verbindungsversuch unternimmt, berechnet F2B die neue “Bantime” nach einer Formel
  • Sperren Sie diese IP für diese neue, erhöhte und zufällige Zeit.
  • Die “bantime” wird mit jedem neuen Versuch zufällig und exponentiell erhöht, darf aber 60 Tage nicht überschreiten.
  • Wenn diese IP innerhalb von 3 Tagen 5 Mal geblockt wird, wird sie für 9 Wochen gesperrt (in ein Recidive-Gefängnis gesteckt).

Es gibt viel Spielraum für die Anpassung dieser Einstellungen an Ihre spezielle Situation, was die Überprüfung und Analyse von Protokollen beinhalten kann. Wie man so schön sagt: Sicherheit ist ein Prozess, keine einmalige Angelegenheit.

Andere Dienste schützen

Standardmäßig sind alle Jails deaktiviert. Sie müssen die für Ihre Einrichtung relevanten Jails in Ihrer Datei jail.local aktivieren, indem Sie unter einem Jail-Namen enabled = true hinzufügen. Wenn Sie zum Beispiel einen Apache-Webserver installiert haben, sollten Sie dies in Ihrer jail.local hinzufügen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[apache-auth]
# Hosts mit fehlgeschlagener Passwortauthentifizierung sperren
enabled  = true
port     = http,https
logpath  = %(apache_error_log)s

[apache-badbots]
# Verbieten Sie Spammer-Roboter, die das Web nach E-Mail-Adressen durchforsten
port     = http,https
logpath  = %(apache_access_log)s
bantime  = 172800
maxretry = 1

[apache-noscript]
# Verbot von Hosts, die auf der Website nach Skripten suchen, um diese auszuführen und auszunutzen
enabled  = true
port     = http,https
logpath  = %(apache_error_log)s
maxretry = 6

[apache-overflows]
# Verbieten Sie Hosts, die versuchen, ungewöhnlich lange und verdächtige URLs anzufordern
enabled  = true
port     = http,https
logpath  = %(apache_error_log)s
maxretry = 2

[apache-nohome]
# Wenn Sie keinen Zugriff auf Webinhalte in den Home-Verzeichnissen der Benutzer ermöglichen
enabled  = true
port     = http,https
logpath  = %(apache_error_log)s
maxretry = 2

Für exim, fügen Sie hinzu

1
2
[exim]
enabled = true

und optional

1
2
[exim-spam]
enabled = true

Für postfix, fügen Sie

1
2
[postfix]
enabled = true

und so weiter. Eine vollständige Liste aller vorkonfigurierten Jails finden Sie in der Datei /etc/fail2ban/jail.conf.

Für viele andere Dienste gibt es verschiedene Lösungen. Für WordPress gibt es zum Beispiel das spezielle Plugin. Nachdem Sie dieses Plugin über die Verwaltungskonsole installiert haben, müssen Sie den Filter

1
sudo cp /var/www/html/wp-content/plugins/wp-fail2ban/filters.d/wordpress-hard.conf /etc/fail2ban/filter.d/

Und aktivieren Sie dieses Gefängnis in jail.local:

1
2
3
4
5
6
7
[wordpress-hard]
enabled  = true
port     = http,https
filter   = wordpress-hard
logpath  = /var/log/auth.log
bantime  = 1h
maxretry = 1

Wenn Sie keinen Filter für Ihre Anwendung / Ihren Dienst haben und keinen im Internet finden können, können Sie Ihren eigenen schreiben, indem Sie eine Liste von Regexen in /etc/fail2ban/filter.d/non-standard.conf hinzufügen. Dann können Sie Ihr Nicht-Standard-Gefängnis aktivieren, indem Sie es zur jail.local hinzufügen:

1
2
3
4
[non-standard]
enabled = true
port    = port your app/service uses
logpath = where its log file is located

Wenn Sie nun die allgemeinen Prinzipien von F2B kennen, können Sie alle Einstellungen für jeden Dienst finden, konfigurieren und anpassen.

Hinzufügen eigener Regexe

Wie Sie bereits wissen, überwacht F2B die Protokolle, die Sie ihm zugewiesen haben, und sucht dort mit regulären Ausdrücken nach Einträgen. Die Regexes in /etc/fail2ban/filter.d/postfix.conf für das Postfix-Protokoll sehen zum Beispiel so aus:

1
2
3
4
failregex = ^%(__prefix_line)sNOQUEUE: reject: RCPT from \S+\[<HOST>\]: 554 5\.7\.1 .*$
            ^%(__prefix_line)sNOQUEUE: reject: RCPT from \S+\[<HOST>\]: 450 4\.7\.1 : Helo command rejected: Host not found; from=<> to=<> proto=ESMTP helo= *$
            ^%(__prefix_line)sNOQUEUE: reject: VRFY from \S+\[<HOST>\]: 550 5\.1\.1 .*$
            ^%(__prefix_line)simproper command pipelining after \S+ from [^[]*\[<HOST>\]:?$

Es kann jedoch vorkommen, dass Standardfilter einige Einträge in den Protokollen übersehen, weil sie ungewöhnlich sind. Sie sollten diese Situation also von Zeit zu Zeit überprüfen und benutzerdefinierte Regexe hinzufügen, um die Sicherheit zu erhöhen. Wie das geht?

F2B verfügt über ein spezielles Dienstprogramm namens fail2ban-regex, das reguläre Ausdrücke testet. Die allgemeine Verwendung ist wie folgt:

fail2ban-regex [OPTIONS] LOG FILTER [IGNOREREGEX]

  • [OPTIONS] - prüfen Sie die vollständige Liste der Optionen des Befehls fail2ban-regex -h.
  • LOG ist eine Zeichenkette für einen Protokolleintrag oder der Pfad zu einer Protokolldatei.
  • REGEX ist eine Zeichenkette (tatsächlicher Regex) oder ein Pfad zu einer Filterdatei, d.h. eine Liste von Regexen.
  • [IGNOREREGEX] ist dasselbe, eine Zeichenkette oder ein Pfad zu einer Datei.

Stellen Sie zunächst fest, welches Protokoll und welchen Dienst Sie testen möchten, z.B. auth.log und sshd.conf. Mit anderen Worten, Sie wollen sehen, welche Standardfilter in sshd.conf in auth.log fehlen. Geben Sie dann diesen Befehl in die Konsole ein:

1
fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf --print-all-missed > /home/user_name/missed.txt

Der Schlüssel dazu ist die Option --print-all-missed. Standardmäßig wird alles nach stdout, d.h. auf die Konsole, ausgegeben, aber vielleicht möchten Sie die Ausgabe in eine Textdatei (z.B. missed.txt) umleiten, um sie weiter zu untersuchen und zu verarbeiten. Lassen Sie uns das Ergebnis untersuchen:

Screenshot mit fehlenden Regexen
Screenshot mit fehlenden Regexen

Dies ist die tatsächliche Ausgabe des obigen Befehls für die Datei auth.log, die von der standardmäßigen sshd.conf und einem benutzerdefinierten Satz von Regexen in der Datei sshd.local verarbeitet wurde (leicht bearbeitet, um sensible Informationen zu entfernen). Selbst in diesem Fall haben die Filter, wie Sie sehen können, einige Einträge in der Protokolldatei übersehen. Schauen wir uns die wichtigen Punkte, die mit roten Pfeilen markiert sind, genauer an:

  1. Es gibt 812 Einträge in auth.log, die mit Failregexes übereinstimmten. Die Zahl in eckigen Klammern am Anfang jeder Regex zeigt an, wie oft sie funktioniert hat.
  2. Es gibt 2959 Einträge, die mit ignoreregex übereinstimmen, d.h. Einträge, die ich dem System mitgeteilt habe, zu ignorieren.
  3. Und schließlich wurden, wie Sie sehen können, 35 Zeilen übersehen. Das bedeutet, dass die IPs 146.52.214.41 und 37.135.222.203 von F2B nicht weiter verarbeitet wurden.

Wie kommt das? Nun, ausgelassene Zeilen entstehen, wenn keine Regex oder eine schlecht geschriebene Regex vorhanden ist. Sie müssen also / test Ihre eigene Regex erstellen, die die ausgelassenen Zeilen abfängt, und diese dann in /etc/fail2ban/filter.d/sshd.local einfügen. Für weitere Details empfehle ich Ihnen, den entsprechenden Abschnitt in der Entwicklerdokumentation zu lesen.

Dies ist eine gekürzte Version meiner Datei /etc/fail2ban/filter.d/sshd.local:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Fail2Ban filter for openssh - local additions

[Definition]

cmnfailre = ^Bad protocol version identification .* from <HOST>%(__on_port_opt)s$
            ^Connection closed by ((authenticating|invalid)? user \S+ )?<HOST>%(__on_port_opt)s%(__suff)s$
            ^Connection reset by <HOST>%(__on_port_opt)s%(__suff)s$
            ^Did not receive identification string from <HOST>%(__on_port_opt)s$
            ^Disconnected from ((?:authenticating|invalid) user \S+ )?<HOST>%(__on_port_opt)s%(__suff)s$
            ^Invalid user \S* from <HOST>%(__on_port_opt)s$
            ^message repeated \d+ times: \[ Failed password for root from <HOST>%(__on_port_opt)s ssh2\]$
            ^pam_unix\(sshd:auth\):\s+authentication failure;\s*logname=\S*\s*uid=\d*\s*euid=\d*\s*tty=\S*\s*ruser=<F-USER>\S*</F-USER>\
            ^PAM \d more authentication failure(s)?; logname= uid=0 euid=0 tty=ssh ruser= rhost=<HOST>(  user=root)?$
            ^Received disconnect from <HOST>%(__on_port_opt)s:.*\s%(__suff)s$
            ^Unable to negotiate with <HOST>%(__on_port_opt)s:\s.*\s%(__suff)s$
            ^User \S+ from <HOST> not allowed because not listed in AllowUsers$
            ^Disconnecting invalid user \S* <HOST>%(__on_port_opt)s:
            ^(error: )?maximum authentication attempts exceeded for .* from <HOST>(?: port \d*)?(?: ssh\d*)? \[preauth\]$

ignoreregex = pam_unix\((cron|sshd|sudo|systemd-user):session\): session (open|clos)ed for user (root|USER_NAME)( by \(uid=0\))?$
              pam_unix\(sudo:session\): session opened for user root by USER_NAME\(uid=0\)$
              pam_unix\(sshd:auth\): check pass\; user unknown$
              New session \d+ of user USER_NAME\.$
              Removed session \d+\.$
              User child is on pid \d+$
              Timeout, client not responding\.$
              \s+USER_NAME \: TTY=pts\/\d \; PWD=\/home\/USER_NAME(\/.*)? \; USER=root \; COMMAND=.*$
              Disconnected from user USER_NAME <HOST>%(__on_port_opt)s$

Wenn Sie es auf Ihren Server kopieren möchten, ersetzen Sie USER_NAME im obigen Text durch Ihren echten Benutzernamen.

Ich habe auch einen Crontab-Job hinzugefügt, der jeden Tag um 08:00 Uhr läuft:

1
/usr/local/bin/fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf --print-all-missed > /home/USER_NAME/missed.txt

und dann einfach cat missed.txt, um zu überprüfen, ob etwas Herausragendes von den F2B sshd-Filtern übersehen wurde.

Sie können auf diese Weise auch andere Protokolle und andere Filter überprüfen und Ihre Regexe hinzufügen.

Benachrichtigung per E-Mail

Sie können E-Mail-Benachrichtigungen aktivieren, wenn Sie eine E-Mail erhalten möchten, sobald eine Sperre erfolgt. Dazu müssen Sie zunächst einen MTA (Mail Transfer Agent) auf Ihrem Server einrichten, damit dieser E-Mails verschicken kann. Um zu erfahren, wie Sie Postfix für diese Aufgabe verwenden, folgen Sie dieser Anleitung. Sie können aber auch jeden anderen MTA verwenden und die Einstellungen unten entsprechend ändern.

Sobald Sie Ihren MTA eingerichtet haben, müssen Sie die Einstellungen im Abschnitt DEFAULT in der jail.local anpassen. Beginnen Sie mit der Einstellung der Direktive mta. Wenn Sie Postfix eingerichtet haben, wie es in der obigen Anleitung gezeigt wird, setzen Sie diesen Wert:

1
2
[DEFAULT]
mta = postfix

Jetzt müssen Sie E-Mails und einige andere Felder hinzufügen:

  • destemail: Die E-Mail-Adresse, an die Sie die E-Mails senden möchten.
  • sender: Die E-Mail-Adresse, von der aus F2B die E-Mails versendet (siehe die Anleitung oben).
  • sendername: Der Text im Feld “Absender” der Benachrichtigungs-E-Mails.
1
2
3
4
5
[DEFAULT]
mta        = postfix
destemail  = [email protected]
sender     = [email protected]
sendername = Fail2BanAlert

Aktionen

Jetzt müssen Sie die Einstellung für die Aktion anpassen. Nur zur Erinnerung: Im F2B-Jargon ist eine “Aktion” das Verfahren, das angewandt wird, wenn ein Client zu oft fehlschlägt.

  • Die Standardeinstellung %(action_)s verbannt nur einen Host.
  • Mit %(action_mw)s wird ein Host gesperrt und eine E-Mail mit einem WHOIS-Bericht über die betreffende IP-Adresse verschickt.
  • Mit %(action_mwl)s wird ein Verbot ausgesprochen und eine E-Mail mit dem WHOIS-Bericht und allen relevanten Zeilen in der Protokolldatei gesendet.

Wählen Sie den Grad der Detaillierung, der Ihnen am besten gefällt, und richten Sie ihn ein:

1
2
[DEFAULT]
action = %(action_mwl)s

Dies kann auch gefängnisspezifisch geändert werden (unter dem Namen eines Gefängnisses), so dass Sie für verschiedene Gefängnisse unterschiedliche Details erhalten.

Zum Abschluss dieses Kapitels finden Sie hier eine aufschlussreiche Geschichte von Ken Tossel zu den E-Mail-Benachrichtigungen.

“…bis Juli 2011 war in der Standardkonfigurationsdatei von Fail2Ban die From: Adresse [email protected] und die To: Adresse [email protected] angegeben, die beide vom Freemail-Anbieter Mail.com gehostet werden. Ich vermute, dass die Person, die dies eingerichtet hat, davon ausging, dass mail.com ungültig ist. [email protected] ist entweder reserviert oder bis zum Anschlag gefüllt, so dass, wenn Fail2Ban einen Angriff auf einen falsch konfigurierten Server erkennt, sein Bericht an den Absender [email protected] zurückgeschickt wird. Ich habe diese Adresse bereits 2010 registriert…”

Im Juli 2014 hatte Ken alle 500.000 Berichte ausgewertet und die Diagramme erstellt, die Sie auf seiner Website sehen können: https://ken.tossell.net/ftb/

Melden von schlechten IPs

Wenn Sie die Community unterstützen möchten, indem Sie anstößige IPs melden, damit andere von diesen Informationen profitieren können, gibt es mehrere Dienste, die Ihnen dies ermöglichen. Sehen wir uns einen davon genauer an, und andere werden am Ende dieses Abschnitts erwähnt.

AbuseIPDB

Um F2B dazu zu bringen, IPs zu melden, fügen Sie die folgenden Befehle zu Ihrer Datei jail.local hinzu. Fügen Sie diese Aktionen individuell zu Ihren Jails hinzu, damit Sie die AbuseIPDB-Berichtskategorien anpassen und Ihre Berichte spezifischer gestalten können. Um zum Beispiel IPs für sshd Brute Forcing zu melden, fügen Sie dies unter [sshd] jail hinzu:

1
2
3
4
[sshd]
action_abuseipdb = abuseipdb
action = %(action_)s
         %(action_abuseipdb)s[abuseipdb_apikey="YOUR.API.KEY", abuseipdb_category="18,22"

Die beliebtesten AbuseIPDB-Berichtskategorien:

Name #
FTP Brute-Force 5
Port Scan 14
Hacking 15
Brute-Force 18
Bad Web Bot 19
SSH 22
Web App Attack 21

Eine vollständige Liste aller Kategorien finden Sie hier: https://www.abuseipdb.com/categories

Optional können Sie die Meldung anpassen, indem Sie /etc/fail2ban/action.d/abuseipdb.conf bearbeiten:

1
2
3
4
5
6
actionban = curl --tlsv1.0 --fail 'https://api.abuseipdb.com/api/v2/report' \
    -H 'Accept: application/json' \
    -H 'Key: <abuseipdb_apikey>' \
    --data-urlencode 'ip=<ip>' \
    --data-urlencode 'comment=F2B blocked SSH BF' \
    --data 'categories=<abuseipdb_category>'

Dann sehen Ihre Berichte auf der AbuseIPDB-Website wie folgt aus: /images/2020/f2b-screen-abuseipdb.jpg

Sie können den Kommentar F2B blocked SSH BF durch Ihren eigenen ersetzen.

Weitere Informationen und Fehlerbehebungen finden Sie auf der offiziellen Website: https://www.abuseipdb.com/fail2ban.html

Andere Online-Dienste zur Meldung von IPs

Gesperrte IPs manuell entsperren

Dies ist ein sehr einfacher Befehl:

1
sudo fail2ban-client set JAIL_NAME unbanip IP_ADDRESS

Wenn die IP_ADDRESS von diesem bestimmten Gefängnis nicht blockiert wird, sehen Sie als Ausgabe 0, andernfalls 1.

Ein paar Mal habe ich es geschafft, dass meine eigene IP blockiert wurde :), als ich von verschiedenen geografischen Standorten aus arbeitete. Verbinden Sie sich in diesem Fall einfach wieder mit Ihrem Server über einen Proxy und heben Sie die Blockierung Ihrer aktuellen IP mit dem obigen Befehl auf.

F2B Logs und Datenbank zurücksetzen

Alle gesperrten IP-Adressen werden in dieser Datei gespeichert: /var/lib/fail2ban/fail2ban.sqlite3.

Auch wenn Sie alle Protokolle löschen, wird F2B nach jedem Neustart des Dienstes alle gesperrten IPs aus der Datenbank neu erstellen, bis die Bantime für die IP abgelaufen ist. Um das gesamte F2B-Protokoll und alle gesperrten IPs aus der Datenbank zu löschen, gehen Sie wie folgt vor. Es ist eine gute Methode, F2B auf den Nullpunkt zurückzusetzen und dabei alle gesperrten IPs zurückzusetzen.

1
2
3
4
sudo fail2ban-client stop
sudo truncate -s 0 /var/log/fail2ban.log
sudo rm /var/lib/fail2ban/fail2ban.sqlite3
sudo fail2ban-client restart

Keine Sorge - F2B erstellt die Datei fail2ban.sqlite3 nach dem Neustart des Dienstes neu.

Sie können die IP auch manuell aus der Datenbank löschen, ohne alle anderen gesperrten IPs zu verlieren und wenn Sie keine Whitelist verwenden möchten:

  1. Laden Sie den DB Browser für SQLite von https://sqlitebrowser.org/ herunter.
  2. Installieren Sie den DB Browser auf Ihrem lokalen Computer
  3. Laden Sie die Datei fail2ban.sqlite3 von /var/lib/fail2ban/fail2ban.sqlite3 herunter.
  4. Starten Sie den DB Browser und öffnen Sie Ihre Datei fail2ban.sqlite3
  5. Suchen Sie in der Datenbank nach der gesperrten IP
  6. Wählen Sie sie aus und klicken Sie auf “Zeile löschen”.
  7. Speichern Sie die Datei fail2ban.sqlite3 und schließen Sie das Programm
  8. Verbinden Sie sich mit Ihrem Server mit ssh und geben Sie service fail2ban stop ein.
  9. Geben Sie truncate -s 0 /var/log/fail2ban.log ein.
  10. Laden Sie die bearbeitete fail2ban.sqlite3 zurück nach /var/lib/fail2ban/fail2ban.sqlite3.
  11. Kehren Sie zu Ihrer ssh-Verbindung zurück und geben Sie service fail2ban restart ein.

Eine weitere Möglichkeit besteht darin, diese Datenbank direkt auf dem Server mit dem Kommandozeilenprogramm sqlite3 zu bearbeiten. https://manpages.ubuntu.com/manpages/bionic/en/man1/sqlite3.1.html

So deinstallieren Sie Fail2ban

Um nur das F2B-Paket zu entfernen, stoppen Sie den Dienst und entfernen das Paket:

1
2
sudo fail2ban-client stop
sudo apt remove fail2ban

So entfernen Sie das F2B-Paket und alle anderen abhängigen Pakete:

1
sudo apt remove --auto-remove fail2ban

Wenn Sie auch die Konfigurations- und/oder Datendateien von F2B löschen möchten:

1
sudo apt purge fail2ban

Zum Löschen von Konfigurations- und/oder Datendateien von F2B und seinen Abhängigkeiten:

1
sudo apt purge --auto-remove fail2ban

Fazit

Die Einrichtung von F2B zum Schutz Ihres Servers ist in den einfachsten Fällen recht unkompliziert. F2B bietet jedoch ein hohes Maß an Flexibilität bei der Erstellung von Richtlinien, die Ihren speziellen Sicherheitsanforderungen entsprechen. Sie können viele Teile anpassen und ändern, je nachdem, wie sich Ihre Bedürfnisse entwickeln. Wenn Sie die Grundlagen des Schutzes Ihres Servers mit F2B erlernen, können Sie mit minimalem Aufwand ein großes Maß an Sicherheit erreichen.

Ich hoffe, dass diese Informationen, die auf meinen sorgfältig gesammelten und seit vielen Jahren in der Praxis erprobten Notizen beruhen, Ihnen helfen werden, den Schutz Ihres Servers zu beginnen/zu konfigurieren.