Zum Inhalt

Fail2Ban

Fail2Ban überwacht Log-Dateien und sperrt IPs, die verdächtige Aktivitäten zeigen.

Warum Fail2Ban?

Defense in Depth

Fail2Ban ergänzt die SSH-Härtung und Firewall als weitere Sicherheitsebene. Selbst wenn ein Angreifer die Firewall passiert, wird er nach wenigen Fehlversuchen gesperrt.

sequenceDiagram
    participant A as Angreifer
    participant F as Fail2Ban
    participant S as SSH-Server
    participant FW as Firewall

    A->>S: Login-Versuch 1 (falsch)
    S->>F: Log: Failed password
    A->>S: Login-Versuch 2 (falsch)
    S->>F: Log: Failed password
    A->>S: Login-Versuch 3 (falsch)
    S->>F: Log: Failed password
    F->>FW: Ban IP für 1h
    A->>FW: Login-Versuch 4
    FW-->>A: Connection refused

1. Fail2Ban installieren

sudo apt install fail2ban -y

2. Konfiguration erstellen

Niemals jail.conf direkt bearbeiten

Die Datei /etc/fail2ban/jail.conf wird bei Updates überschrieben. Erstelle stattdessen eine eigene Konfiguration.

Erstelle die lokale Konfigurationsdatei:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

3. Jail-Konfiguration anpassen

Bearbeite die lokale Konfiguration:

sudo vim /etc/fail2ban/jail.local

Globale Einstellungen

Ersetze die [DEFAULT] Sektion:

/etc/fail2ban/jail.local
[DEFAULT]
# Ignorierte IPs (deine eigene IP hinzufügen!)
ignoreip = 127.0.0.1/8 ::1

# Ban-Dauer (in Sekunden)
bantime = 1h  # (1)!

# Zeitfenster für Fehlversuche
findtime = 10m  # (2)!

# Anzahl Fehlversuche bis zum Ban
maxretry = 3  # (3)!

# Backend für Log-Überwachung
backend = systemd  # (4)!

# Ban-Aktion (iptables/nftables)
banaction = iptables-multiport
banaction_allports = iptables-allports
  1. Ban-Dauer: 1 Stunde. Kann erhöht werden (z.B. 24h, 1w).
  2. Zeitfenster: 3 Fehlversuche in 10 Minuten = Ban.
  3. Maximal 3 Fehlversuche.
  4. Verwendet systemd für Log-Zugriff (modern und zuverlässig).

SSH-Jail konfigurieren

Füge am Ende der Datei hinzu oder bearbeite den existierenden [sshd] Block:

/etc/fail2ban/jail.local
[sshd]
enabled = true
mode = aggressive  # (1)!
port = 2222
filter = sshd
logpath = /var/log/auth.log
backend = systemd
maxretry = 3
findtime = 10m
bantime = 1h
  1. Aggressiver Modus: Erkennt mehr Angriffsmuster.

Erweiterte Jails (optional)

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

[nginx-botsearch]
enabled = true
filter = nginx-botsearch
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 2
bantime = 1d
Recidive-Jail (Wiederholungstäter)
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
banaction = %(banaction_allports)s
bantime = 1w  # 1 Woche
findtime = 1d  # 1 Tag
maxretry = 3  # Nach 3 Bans = langer Ban

Dieses Jail sperrt IPs, die wiederholt gesperrt wurden, für eine längere Zeit.

4. Fail2Ban starten

# Dienst starten
sudo systemctl start fail2ban

# Beim Boot automatisch starten
sudo systemctl enable fail2ban

5. Status überprüfen

Dienst-Status

sudo systemctl status fail2ban

Erwartete Ausgabe:

● fail2ban.service - Fail2Ban Service
     Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled)
     Active: active (running) since ...

Jail-Status

sudo fail2ban-client status

Ausgabe:

Status
|- Number of jail:      1
`- Jail list:   sshd

Detaillierter SSH-Jail-Status

sudo fail2ban-client status sshd

Ausgabe:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     5
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 1
   |- Total banned:     2
   `- Banned IP list:   192.168.1.100

6. Testen der Konfiguration

Nur von einer anderen IP testen!

Teste nicht von deiner eigenen IP, sonst sperrst du dich aus.

Von einem anderen System aus (z.B. VPN oder anderem Server):

# Mehrere fehlgeschlagene Login-Versuche
for i in {1..5}; do
    ssh invalid_user@DEINE_SERVER_IP
done

Nach 3 Versuchen sollte die Verbindung blockiert werden.

Auf dem Server überprüfen:

sudo fail2ban-client status sshd

Zusammenfassung

Nach Abschluss dieses Abschnitts:

  • Fail2Ban installiert und konfiguriert
  • SSH-Jail aktiviert mit sinnvollen Schwellenwerten
  • Dienst gestartet und für Autostart aktiviert

Server-Härtung abgeschlossen!

Gratulation! Die grundlegende Server-Härtung ist abgeschlossen.

Du hast folgende Sicherheitsmaßnahmen implementiert:

  • System aktualisiert und Basis-Setup durchgeführt
  • SSH gehärtet
  • Firewall konfiguriert
  • Fail2Ban für Brute-Force-Schutz