fail2ban

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

Leave a Reply

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

This site uses Akismet to reduce spam. Learn how your comment data is processed.