Sicherheit

Fail2ban im Produktivbetrieb: mehr als das SSH-Tutorial

Fail2ban zu installieren dauert fünf Minuten; es im Produktivbetrieb richtig zum Laufen zu bringen, ist eine andere Geschichte. journald als Backend, progressive Sperren, HTTP-Jails hinter einem Reverse Proxy und die selbst erlebten Fallstricke: die echte Client-IP, der Unternehmens-Proxy, der nie gesperrt werden darf, der nftables-Restart, der alles löscht.

Schild vor einem Serverschrank, an dem die wiederholten Verbindungsversuche zerschellen
Inhalt (6 Abschnitte)
  1. Fail2ban richtig einordnen
  2. Die Basis, Stand 2026: journald, nicht auth.log
  3. Die nächste Stufe: HTTP-Jails hinter einem Reverse Proxy
  4. Die zwei Fallstricke, die teuer werden
  5. Der Unternehmens-Proxy: eine IP = Dutzende Menschen
  6. nftables: der Restart, der alles löscht

Öffnen Sie einen SSH-Port zum Internet und sehen Sie sich die Logs an: Die Versuche kommen ununterbrochen, zu Tausenden, von Botnetzen, die in Endlosschleife Kombinationen aus Benutzername und Passwort durchprobieren. Fail2ban ist die klassische Antwort: Logs lesen, wiederholte Fehlschläge erkennen, die Quelladresse sperren. Fünf Minuten für die Installation, und genau das ist das Problem: Die meisten Installationen bleiben beim Tutorial stehen, mit einer SSH-Jail in der Standardkonfiguration, die mehr beruhigt als schützt. Hier sehen Sie, was eine Produktionskonfiguration ändert, einschließlich der selbst erlebten Fallstricke.

Fail2ban richtig einordnen #

Zunächst klar gesagt: Fail2ban ist ein Rauschunterdrücker, keine primäre Verteidigung. Akzeptiert Ihr SSH Passwörter, bremst Fail2ban die Angreifer; akzeptiert Ihr SSH nur Schlüssel (PasswordAuthentication no), ist Brute Force bereits erledigt: Fail2ban hält dann nur noch die Logs sauber und spart Ressourcen. Die Reihenfolge der Prioritäten lautet also: ausschließlich Schlüsselauthentifizierung, minimale Angriffsfläche (eine Firewall, die nur das Nötige öffnet, IP-Allowlists für die Administration) und danach Fail2ban für das verbleibende Rauschen. So sind unsere Frontend-Server aufgebaut: Die Firewall des Hypervisors lässt aus dem öffentlichen Netz nur HTTP/HTTPS durch, SSH läuft mit Schlüsseln, und Fail2ban räumt den Rest auf.

Die Basis, Stand 2026: journald, nicht auth.log #

Erster Fallstrick älterer Tutorials: sie richten Fail2ban auf /var/log/auth.log aus… das es auf modernen Systemen ohne rsyslog nicht mehr gibt, denn dort liegt alles im systemd-Journal. Eine Jail, die eine fehlende oder eingefrorene Datei liest, sperrt niemanden, und zwar ohne jede Meldung. Die Abhilfe: backend = systemd. Hier unsere Grundkonfiguration in jail.local, mit der zweiten Einstellung, die alles verändert, der progressiven Sperre:

INI
# /etc/fail2ban/jail.local
[DEFAULT]
backend = systemd
banaction = nftables-multiport

# Progressive Sperre: Jeder Rückfall vervielfacht die Strafe.
bantime = 1h
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 1w

findtime = 10m
maxretry = 5

# IPs, die NIE gesperrt werden dürfen: Überwachung, Admin. Kurze, begründete Liste.
ignoreip = 127.0.0.1/8 ::1 <ip-supervision>

[sshd]
enabled = true
mode = aggressive

Die progressive Sperre macht auf Dauer den Unterschied: Ein gelegentlicher Scanner bekommt eine Stunde, ein Wiederholungstäter ist am Ende eine Woche gesperrt. Und prüfen Sie immer, ob eine Jail tatsächlich arbeitet: fail2ban-client status sshd muss steigende Trefferzahlen zeigen. Eine Jail, die auf einem exponierten Server seit Wochen bei null steht, ist eine kaputte Jail, kein verschonter Server.

Die nächste Stufe: HTTP-Jails hinter einem Reverse Proxy #

Brute Force zielt nicht nur auf SSH: Die Anmeldeseiten von Webanwendungen, API-Endpunkte und Administrationspfade bekommen denselben Verkehr ab. Fail2ban kann sie schützen, sofern es die Logs des Reverse Proxy (Traefik, nginx…) liest und dort Salven von 401/403 erkennt. Zwei nicht verhandelbare Bedingungen, beide aus eigener schmerzlicher Erfahrung gelernt:

  • Die echte Client-IP sperren, nie die des Proxys. Liegt Ihre Anwendung hinter einem Reverse Proxy (oder schlimmer, macht Docker davor NAT), zeigen die Logs womöglich nur die interne IP des Proxys. Sperren Sie diese, kappen Sie den gesamten Verkehr. Die Kette muss die Quelladresse durchgehend erhalten; auf einem unserer Server mussten wir dafür den Proxy ins Host-Netzwerk verlegen, sonst erschienen alle IPv6-Besucher mit derselben internen IP des Docker-Gateways.
  • Strukturierte Logs. Ein Access-Log im JSON-Format lässt sich ohne fragile Regex parsen: Der Fail2ban-Filter wird zu einer zuverlässigen Zeile statt zu einem Ausdruck, der beim ersten Formatwechsel bricht.

Die zwei Fallstricke, die teuer werden #

Der Unternehmens-Proxy: eine IP = Dutzende Menschen #

Im Produktivbetrieb erlebt: Salven verdächtiger Anfragen von einer einzigen IP, der Reflex, sie zu sperren… und es war ein Unternehmens-Proxy (etwa Zscaler): Hinter dieser Adresse saßen Dutzende legitimer Beschäftigter, darunter womöglich Ihr Kunde. Dasselbe gilt für externe Überwachungssensoren, deren Verhalten (regelmäßige Anfragen, wechselnde Ports) einem Scan zum Verwechseln ähnlich sieht. Bevor Sie eine „seltsame“ IP sperren: Ein whois dauert zehn Sekunden; Unternehmens-Proxys und Ihre Sensoren gehören in ignoreip, dokumentiert, mit dem Grund als Kommentar.

nftables: der Restart, der alles löscht #

Fail2ban schreibt seine Sperren in die Firewall (heute nftables). systemctl restart nftables löscht jedoch das komplette Ruleset, bevor die Datei neu geladen wird, und reißt dabei die dynamischen Tabellen von Fail2ban mit und, falls Docker läuft, auch dessen NAT-Regeln: Wir haben erlebt, wie ein harmloser Restart das DNS eines Containers im Produktivbetrieb lahmlegte. Um eine nftables-Konfiguration neu zu laden, verwenden Sie nft -f (atomar, additiv), niemals einen Restart des Dienstes auf einer Maschine mit Fail2ban oder Docker.

Fail2ban zeigt gut, wovon wir überzeugt sind: Sicherheit ist kein Produkt, das man installiert, sondern eine Reihe von Details, die man prüft. Genau das decken unsere Managed Services ab: Härtung, Überwachung der Jails und unveränderliche Backups für den Tag, an dem alles andere versagt hat. Zweifel, wie exponiert Ihre Server wirklich sind? Sprechen wir darüber.

Über uns
01/Als Nächstes lesenDrei Artikel

Verwandte Artikel

Sicherheit

Eine veraltete Lock-Datei ist ein Scan, der lügt

Lock-Dateien für Abhängigkeiten sind die maßgebliche Quelle für Sicherheitsanalysen. Wenn eine CI-Pipeline sie stillschweigend umschreibt, statt zu scheitern, liest die Analyse falsche Versionen und liefert ein beruhigendes Urteil. Wie wir das entdeckt haben und was wir geändert haben.

abhängigkeitensoftware-lieferkette
Sicherheit

446 Schwachstellen, dann null: was ein Inventar ändert, das die Wahrheit sagt

Jede Maschine scannte ihre eigenen Images, niemand sah den ganzen Bestand. Mit einer zentralen Analyse auf Basis des tatsächlichen Inventars (111 eindeutige Images statt 25 lokaler Datenbanken) fiel der Zähler an einem Abend von 446 auf 0. Bericht über eine Messaktion, nicht über eine Korrektur.

schwachstellencontainer
Sicherheit

Ein SIEM für eine Flotte von 38 Maschinen: Wazuh, von der Dimensionierung bis zur Feinabstimmung

Ein Protokoll, das auf der kompromittierten Maschine bleibt, ist nichts wert. Wir haben Wazuh in zwei Tagen auf der gesamten Serverflotte eingeführt: eigene VM, zwölf Monate Aufbewahrung, 38 Agenten in drei Wellen und vor allem eine Feinabstimmung, die das Rauschen von 1.250 Alarmen pro Maschine auf 8 für die gesamte Flotte senkt. Die Fallstricke des Installers, der Konformitätsprüfung in Containern und die eigenen Erkennungsregeln, auf die es wirklich ankommt.

wazuhsiem

Und jetzt

Erkennen, bevor es teuer wird?

Zentralisierte Logs, Alarme, bewusst eingespielte Updates, Backups, die wirklich wiederhergestellt werden. Erstgespräch kostenlos.

Ihr Projekt besprechen

Antwort binnen 24 Stunden an Werktagen, von einem der beiden Gründer. Oder telefonisch: +33 7 59 96 14 99.