Fail2Ban Advanced: Intrusion Prevention (Artikel 331)
Fortgeschrittene Intrusion-Prevention-Strategien mit Fail2Ban. Erfahren Sie alles über die Abwehr von Wiederholungstätern, die Erstellung eigener Regex-Filter und die Cloud-Integration.
# Fail2Ban Masterclass: Proaktive Abwehr von Angriffen
TL;DR / Management Summary Ein einfacher IP-Bann für 10 Minuten ist nur ein Tropfen auf den heißen Stein. In diesem Modul heben wir Fail2Ban auf das Enterprise-Niveau. Wir implementieren die Recidive-Jail für Langzeit-Sperren von Wiederholungstätern, lernen das Schreiben von Custom Regex Filtern für spezialisierte Applikationen und integrieren eine Cloud-Intelligence (AbuseIPDB), um bekannte Angreifer bereits vor dem ersten Paket zu blockieren.
# 1. Einführung & Architektur
Vom einfachen Bann zum IPS.
Fail2Ban arbeitet standardmäßig reaktiv. Durch die Integration von Reputations-Datenbanken wird es zu einem proaktiven Intrusion Prevention System (IPS).
# Die erweiterte Abwehr-Kette (Mermaid)
graph TD
A[Attacker IP] --> B{Local Firewall Check}
B -->|Banned?| C[Drop Packet]
B -->|Unknown| D[App Log / Journald]
D --> E[Fail2Ban Filter: Regex]
E --> F{Match Found?}
F -->|Count Threshold| G[Action: Ban IP]
G --> H[Action: Report to AbuseIPDB]
I[Global Intel: AbuseIPDB] -->|Blacklist| B
# 2. Abwehr von Wiederholungstätern (Recidive)
Den Lerneffekt nutzen.
Wenn ein Angreifer immer wieder kommt, setzen wir ihn auf die “schwarze Liste”.
# Konfiguration (/etc/fail2ban/jail.local)
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
filter = recidive
# Wer 5 Mal in 24h gebannt wurde...
findtime = 1d
maxretry = 5
# ...wird für eine Woche gesperrt!
bantime = 1w
# 3. Custom Filter schreiben
Eigene Applikationen schützen.
Angenommen, Ihre App loggt Fehler wie: FAILED_LOGIN user=admin from=1.2.3.4.
# Schritt 1: Filter definieren (/etc/fail2ban/filter.d/myapp.conf)
[Definition]
failregex = ^FAILED_LOGIN user=.* from=<HOST>$
ignoreregex =
# Schritt 2: Jail aktivieren
[myapp]
enabled = true
port = http,https
logpath = /var/log/myapp/error.log
# 4. Day-2 Operations: Cloud Intelligence
Wissen, was das Internet weiß.
Integrieren Sie AbuseIPDB, um Ihre Banns mit der Welt zu teilen und von den Meldungen anderer zu profitieren.
# Automatisches Reporting
Nutzen Sie eine action, die bei jedem Bann eine API-Anfrage sendet:
# In jail.local unter 'action'
action_mwl = %(action_mw)s
abuseipdb[apikey="YOUR_API_KEY", category="18"]
# 5. Troubleshooting & “War Stories”
Wenn die Regex fehlzündet.
# Story 1: “Der falsche Zeilenumbruch”
Symptom: Fail2Ban meldet Erfolg beim Testen des Filters, aber blockiert im Live-Betrieb niemanden.
Ursache: Das Log-Format im Journald enthält Metadaten, die der Regex-Parser nicht sieht, wenn man nur Text-Files testet.
Lösung: Testen Sie immer mit dem echten Stream:
fail2ban-regex --systemd sshd.
# Story 2: “Performance-Einbruch bei Riesen-Logs”
Symptom: Die CPU-Last von Fail2Ban steigt massiv an, sobald der Webserver unter Last steht.
Ursache: Fail2Ban muss jede einzelne Logzeile gegen hunderte Regex-Muster prüfen.
Lösung: Nutzen Sie das systemd backend, da es effizienter auf neue Events reagiert als das Polling von Textdateien. Optimieren Sie die Regex (Vermeiden Sie .* am Anfang).
# 6. Fazit & Empfehlung
- Strategie: Nutzen Sie kurze Bannzeiten (1h) für den ersten Verstoß und lange Zeiten (1w) für Recidive.
- Wartung: Prüfen Sie regelmäßig
fail2ban-client status, um zu sehen, ob Ihre Jails effektiv arbeiten. - Wahl: Nutzen Sie CrowdSec als moderne Alternative, wenn Sie eine Cloud-native Lösung mit nativer Threat-Intelligence-Anbindung suchen.
# Anhang: Cheatsheet für Profis
| Aufgabe | Befehl |
|---|---|
| Status aller Jails | fail2ban-client status |
| Regex live testen | fail2ban-regex <logfile> <filterfile> |
| IP manuell dauerhaft bannen | fail2ban-client set <jail> banip <IP> |
| Datenbank aufräumen | sqlite3 /var/lib/fail2ban/fail2ban.sqlite "DELETE FROM bans ..." |
| Logs des Dämons | journalctl -u fail2ban -f |
| IP-Reputation prüfen | curl -G https://api.abuseipdb.com/... |
| Ignorierte IPs sehen | fail2ban-client get <jail> ignoreip |