linux-ubuntu-debian security fail2ban hardening intrusion-prevention

Fail2Ban: Brute-Force Protection (Artikel 028)

Abwehr von automatisierten Angriffen mit Fail2Ban. Konfiguration von Jails für SSH, Webserver und andere Dienste zur automatischen Sperrung bösartiger IP-Adressen.

# Fail2Ban: Der Türsteher für Ihre Server-Dienste

TL;DR / Management Summary Jede Sekunde versuchen tausende Bots im Internet, SSH- oder Webserver-Passwörter zu knacken. Fail2Ban ist die reaktive Lösung: Es scannt Logdateien nach verdächtigen Mustern (z.B. 5 falsche Passwörter in 10 Minuten) und sperrt die IP des Angreifers automatisch in der Firewall. Ein absolutes Muss für jeden Server, der direkt aus dem Internet erreichbar ist.


# 1. Einführung & Architektur

Wie Fail2Ban arbeitet.

Fail2Ban ist kein aktiver Filter, sondern ein Log-Monitor.

graph TD
    A[Attacker: SSH Attempt] --> B[sshd: Log failed attempt]
    B --> C[/var/log/auth.log]
    D[Fail2Ban Daemon] -->|Scans| C
    D -->|Match Filter?| E{Max Retries?}
    E -->|Yes| F[Action: Add IP to Iptables/UFW]
    E -->|No| D
    F --> G[Attacker IP Blocked for X min]
  • Filter: Regex-Muster, die definieren, was als “Fehler” gilt.
  • Jail: Die Kombination aus Filter, Logdatei und Aktion.

# 2. Installation & Basiskonfiguration

Sicher starten.

# Installation

sudo apt update
sudo apt install fail2ban

# Die jail.local Strategie

Ändern Sie niemals /etc/fail2ban/jail.conf. Erstellen Sie eine Kopie namens jail.local, um Ihre Änderungen bei Updates zu behalten.

# Eigene Config erstellen
cat <<EOF | sudo tee /etc/fail2ban/jail.local
[DEFAULT]
# IPs von der Sperrung ausnehmen (Eigene Admin-IP!)
ignoreip = 127.0.0.1/8 192.168.1.0/24
bantime  = 1h
findtime  = 10m
maxretry = 5

[sshd]
enabled = true
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
EOF

# 3. Fortgeschrittene Jails

Mehr als nur SSH schützen.

# Beispiel: Nginx Brute-Force (HTTP 401)

Schützt passwortgeschützte Web-Bereiche.

[nginx-http-auth]
enabled = true
filter  = nginx-http-auth
port    = http,https
logpath = /var/log/nginx/error.log
maxretry = 3

# 4. Day-2 Operations: Management & Unbanning

Wenn man sich selbst gesperrt hat.

# Status der Jails prüfen

# Welche Jails sind aktiv?
sudo fail2ban-client status

# Details zu einer Jail (und Liste der gesperrten IPs)
sudo fail2ban-client status sshd

# Eine IP manuell entsperren

sudo fail2ban-client set sshd unbanip 192.168.1.100

# 5. Troubleshooting & “War Stories”

Wenn der Türsteher zu streng ist.

# Story 1: “Der falsche Alarm (False Positive)”

Symptom: Ein ganzer Firmenstandort kann nicht mehr per SSH auf den Cloud-Server zugreifen. Ursache: Alle Mitarbeiter gehen über das gleiche NAT-Gateway nach draußen. Ein Kollege hat sein Passwort 5x falsch eingegeben -> Die öffentliche IP des Gateways wird gesperrt -> Alle sind ausgesperrt. Lösung: Whitelisting! Tragen Sie die öffentlichen IPs Ihrer Büros/VPNs immer in ignoreip ein.

# Story 2: “Persistence der Sperren”

Symptom: Nach einem Server-Reboot können die Angreifer sofort wieder angreifen. Ursache: Fail2Ban speichert Bans standardmäßig im RAM. Lösung: Nutzen Sie eine moderne Datenbank-Backend-Konfiguration (Standard in neueren Versionen), oder setzen Sie die bantime sehr hoch (z.B. 1 Woche), um Bots dauerhaft zu entmutigen.


# 6. Monitoring & Reporting

Integrieren Sie Fail2Ban in Ihr Monitoring.

  • Log: /var/log/fail2ban.log
  • Metrics: Es gibt Prometheus-Exporter für Fail2Ban, die anzeigen, wie viele IPs pro Stunde geblockt werden. Ein plötzlicher Anstieg deutet auf eine gezielte Kampagne hin.

# 7. Fazit & Empfehlung

  • SSH: Ein Muss, wenn Port 22 offen ist.
  • Whitelisting: Das Wichtigste für Admins (ignoreip).
  • Kombination: Nutzen Sie Fail2Ban zusammen mit einer Firewall (UFW) und SSH-Keys. Fail2Ban ist die letzte Warnung, bevor der Angreifer gar nicht mehr rankommt.

# Anhang: Cheatsheet

Aufgabe Befehl
Client Befehlsliste fail2ban-client --help
Filter testen fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
Jail neu laden sudo fail2ban-client reload
IP manuell bannen sudo fail2ban-client set sshd banip <IP>
Logfile Rotation /etc/logrotate.d/fail2ban