Titelbild: pixabay
Was ist fail2ban? Das ist ein in Python realisiertes Intrusion Prevention System, das aus den Log-Dateien angreifende IP-Adressen, die sich wiederholt versuchen auf deinem Rechner zB über SSH und andere Zugänge etc. anzumelden. fail2ban ermittelt diese IPs und kann sie in Abhängigkeit deiner konfigurierbaren Vorgaben blockieren. Meist sind das automatisierte Angriffe, die Usernamen, ggf. Password und Port variieren, um auf deinen Rechner zu gelangen und böses im Schilde führen.
Motivation
Leider sind solche bösartigen Angriffe (Brute-Force, DoS-Attaken, Hijacking-Versuche etc. etc.) sehr häufig und treten zB bei Servern, die in öffentlichen Netzen stehen permanent auf. Ein Blick in deine Logdateien zeigt sofort die andauernden Aktivitäten. Ich benutze dazu meist diesen Befehl und schaue der live Ausgabe der log-Datei einen Moment zu:
tail -f /var/log/secure (Alma)
tail -f /var/log/auth.log (Ubuntu)
Das motiviert mich in der Regel gegen diese Authentifizierungsversuche was zu tun.
Das freie und quelloffene fail2ban gibt’s bereits seit 2004. Die aktuelle Version ist von 2024 und unter GitHub verfügbar.
Installation
Ich zeige hier die Installation an einem Linux Alma System. Folgende Voraussetzungen sind für dieses Beispiel-Installation relevant. Sichere vorher dein System mit einem Backup, falls was schief geht!
Voraussetzungen
- Ein Server, auf dem Alma Linux 9 läuft.
- Ein Root-Passwort ist auf dem Server konfiguriert.
Standardmäßig ist das Firewalld-Paket auf Alma Linux vorinstalliert. Zuerst musst du überprüfen, ob es läuft oder nicht. Das kannst du mit dem folgenden Befehl überprüfen:
systemctl status firewalld
Wenn es wider erwarten nicht installiert ist, erhältst du eine Meldung, wie „Unit firewalld.service could not be found.“ Dann solltest du zuerst nachdenken, un dann entweder abrechen oder Firewalld installieren.
Wenn Du eine Meldung erhältst die eine Zeile ähnlich dieser beinhaltet, Active: inactive (dead) läuft firewalld nicht. Dann versucht Du den Dienst zu starten:
systemctl start firewalld
Dann überprüfst du den Status von firewalld mit dem folgenden Befehl erneut:
systemctl status firewalld
Das Ergebnis sollte dann in den ersten Zeilen ungefähr so aussehen:
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; preset: enabled)
Active: active (running) since Sat 2025-11-08 06:36:38 CET; 1 day 1h ago
Invocation: 8fbacc33f5054cc3a3de726d9fe8bb4c
Docs: man:firewalld(1)
Process: 834 ExecStartPost=/usr/bin/firewall-cmd --state (code=exited, status=0/SUCCESS)
Main PID: 826 (firewalld)
Als nächstes listest du alle von firewalld konfigurierten Dienste mit folgendem Befehl auf:
firewall-cmd --list-all
Das Ergebnis sollte dann so ähnlich aussehen:
public (default, active)
target: default
ingress-priority: 0
egress-priority: 0
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Erste Hürde geschafft.
fail2ban installieren
Standardmäßig ist das fail2ban-Paket nicht im Alma Linux Standard-Repository verfügbar. Daher musst du es aus dem EPEL-Repository installieren. Du kannst das EPEL Repo mit dem folgenden Befehl installieren:
dnf install epel-release -y
Die letzten Zeilen sollten das auf deinem Bildschirm so ähnlich aussehen:
Installed:
epel-release-10-6.el10.noarch
Complete!
Jetzt kannst du fail2ban mit folgendem Befehl installieren:
dnf install fail2ban fail2ban-firewalld -y
Nach Abschluss der fail2ban Installation sollten die letzten Zeilen auf dem Bildschirm so ähnlich aussehen:
Installed:
fail2ban-1.1.0-6.el10_0.noarch fail2ban-firewalld-1.1.0-6.el10_0.noarch fail2ban-selinux-1.1.0-6.el10_0.noarch
fail2ban-sendmail-1.1.0-6.el10_0.noarch fail2ban-server-1.1.0-6.el10_0.noarch info-7.1-6.el10.x86_64
libgsasl-1.10.0-12.el10_0.x86_64 libidn-1.42-4.el10_0.x86_64 libntlm-1.8-1.el10_0.x86_64
msmtp-1.8.25-6.el10_0.x86_64
Complete!
Nun den fail2ban Dienst starten und dauerhaft aktivieren mit folgenden zwei Befehlen:
systemctl start fail2ban
systemctl enable fail2ban
Du solltest in etwa folgende Ausgabe auf deinem Terminal-Bildschirm erhalten:
Created symlink '/etc/systemd/system/multi-user.target.wants/fail2ban.service' → '/usr/lib/systemd/system/fail2ban.service'.
Jetzt den Status des fail2ban-Dienstes überprüfen:
systemctl status fail2ban
Die letzten Zeilen der fail2ban Status-Meldung sollten ungefähr so aussehen:
Nov 09 09:29:11 alma-4gb-nbg1-1 systemd[1]: Starting fail2ban.service - Fail2Ban Service…
Nov 09 09:29:11 alma-4gb-nbg1-1 systemd[1]: Started fail2ban.service - Fail2Ban Service.
Nov 09 09:29:11 alma-4gb-nbg1-1 fail2ban-server[368816]: Server ready
Konfiguration
Die wesentlich Konfigurationsdatei jail.conf von fail2ban befindet sich unter /etc/fail2ban/jail.conf. Es ist zwingend angesagt, eine Kopie der relevante Konfigurationsdatei jail.local zu erstellen. Das machst du mit dem folgenden copy (cp) Befehl:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Standardmäßig verwendet fail2ban die Firewall Iptables. Um die Firewall-Unterstützung zu aktivieren, führe den folgenden Befehl aus:
mv /etc/fail2ban/jail.d/00-firewalld.conf /etc/fail2ban/jail.d/00-firewalld.local
Starte anschließend den fail2ban-Dienst neu, um die Änderungen zu übernehmen:
systemctl restart fail2ban
SSH mit fail2ban absichern
Standardmäßig ist fail2ban nicht so konfiguriert, dass entfernte IPs blockiert werden. Du musst die lokale fail2ban Jail-Konfigurationsdatei für jeden Dienst konfigurieren, den du schützen willst.
Um den SSH-Dienst zu schützen, erstellst du eine weitere Jail-Konfigurationsdatei für SSH mit dem folgenden Befehl:
nano /etc/fail2ban/jail.d/sshd.local
Kopiere die folgenden Zeilen hinzu und speichere mit <ctl> O <ret> <ctl> X
# This configuration will block the remote host for 3 hours after 3 failed SSH login attempts.[sshd]
enabled = true
bantime = 3h
maxretry = 3
Starte den SSH-Dienst neu, um die Änderungen zu übernehmen:
systemctl restart fail2ban
Die Jail-Konfiguration mit dem folgenden Befehl überprüfen:
fail2ban-client status
Du erhältst die konfigurierte Jail in der folgenden Ausgabe:
Status
|- Number of jail: 1
`- Jail list: sshd
Betrieb
Gebannte IPs anschauen
Um die SSH-Jail auf gesperrte IPs zu überprüfen, führe folgenden Befehl aus:
fail2ban-client status sshd
Das Ergebnis sieht dann zum Beispiel so aus: binnen kurzer Zeit sind schon diverse IPs blockiert:
Status for the jail: sshd
|- Filter
| |- Currently failed: 8
| |- Total failed: 122
| - Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd + _COMM=sshd-session - Actions
|- Currently banned: 10
|- Total banned: 10
`- Banned IP list: 170.64.232.49 139.59.93.202 146.190.111.235 61.190.114.203 14.103.120.242 103.181.143.232 193.46.255.103 49.247.37.22 45.78.194.233 193.46.255.244
Ein erneuter längerer Blick in die Logs zum Beispiel mit
tail -f /var/log/secure
zeigt deutlich weniger Angriffe, weil diese nun ausgebremst werden.
Entbannen
Gesperrte IP-Adresse manuell aufheben kannst Du mit dem Syntax
fail2ban-client set <JAILNAME> unbanip <IP-ADRESSE>
Dabei ersetzt du <JAILNAME> mit dem Namen des betroffenen Jails (z. B. sshd für SSH-Banns) und <IP-ADRESSE> mit der zu entbannenden Adresse. Beispiel:
fail2ban-client set sshd unbanip 193.46.255.44
Es gibt keinen Standardbefehl, um eine IP-Adresse aus allen Jails gleichzeitig zu entsannen, daher musst Du die Entsperrung pro Jail durchführen.
Ausnahmen
Ausnahmen sind konfigurierter, bergen aber zusätzliche Risiken, weil diese Ausnahme IP oder dieser IP-Bereich bekannt werden und von bösen Buben simuliert werden könnte. Deshalb sollte man Ausnahmen unbedingt vermeiden.
Fazit
fail2ban kann das Angriffspotential bereits zu einem großen Teil reduzieren, jedoch ist das alleine kein ausreichender Schutz.
Um Systeme wirksam gegen Brute-Force-Angriffe etc. abzusichern, sollten mehrere technische und organisatorische Maßnahmen miteinander kombiniert werden. Das hier gezeigte fail2ban ist nur eine Komponente dieser Abwehrtechniken, also nur eins von mehreren denkbaren Verfahren und Methoden zur Härtung eines Systems.
Hinweis: Ich bevorzuge in meinen Texten aus Gründen der besseren Lesbarkeit das Generisches Maskulinum. Weibliche und andere anderweitige Geschlechtsidentitäten werden dabei ausdrücklich mit gemeint, soweit es für die Aussage erforderlich ist.
Dieser Blog verfolgt keine kommerziellen Interessen. Etwaige Werbung ist kostenfrei! #supportyourlocal
One comment