Um sich gegen Brute-Force-Angriffe zu wehren, ist es möglich, mit Hilfe von fail2ban den Zugriff von einer bestimmten IP-Adresse automatisch zu sperren.
Server im Internet werden quasi ununterbrochen auf Schwachstellen gescannt. Wie in diesem Artikel beschrieben, kann man unter Linux mit iptables Verbindungsanfragen an den Server ablehnen.
Soll das ganze automatisiert ablaufen, kann man sich mit fail2ban behelfen. Damit können Log-Dateien per Regex durchsucht werden. Trifft eine Regex-Regel auf einen Eintrag zu, so kann die entsprechende IP automatisch über iptables gesperrt werden. Es gibt hierbei vorgefertigte Filter, etwa für SSH, oder man kann eigene Filter definieren.
In nachfolgendem Beispiel zeige ich, wie man den vorgefertigten Filter für SSH konfiguriert und zusätzlich zu häufige Login-Versuche für WordPress blockiert, indem ein neuer Filter hinzugefügt wird.
fail2ban installieren
Zunächst muss fail2ban installiert werden. Man findet es in den üblichen Paketquellen von Ubuntu, also genügt hier ein
apt-get install fail2ban
Anschließend sollte die Konfigurationsdatei kopiert werden, sodass die eigenen Änderungen bei einem Update nicht überschrieben werden.
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Die Datei jail.local wird dabei bevorzugt verwendet, sofern diese vorhanden ist, d.h. es muss nicht explizit auf die neu erstellte Datei verwiesen werden (sofern man sich an die Namenskonvention hält).
Filter für WordPress-Logins anlegen
Wir legen eine neue Datei wordpress.conf im Ordner /etc/fail2ban/filter.d/ an.
nano /etc/fail2ban/filter.d/wordpress.conf
Hier kommt nun folgender Inhalt rein:
[Definition] failregex = <HOST>.*] \"POST \/wp-login.php ignoreregex =
Dies definiert den Ausdruck, über welchen der „bösartige“ Zugriff ermittelt wird. Der zweite Ausdruck bleibt leer, hier könnte man die Ergebnisse noch einmal nachfiltern. Wieso ist ein Zugriff auf /wp-login denn nun ein böser Zugriff? Nun ein einziger Zugriff ist noch nicht böse, sonst könnte man sich selbst auch nicht mehr in WordPress einloggen. Zehn Zugriffe innerhalb von fünf Sekunden sind mit aller Wahrscheinlichkeit dann doch nicht der normale Admin, der sein eigenes Passwort gerne über Raten ausprobiert.
Wir konzentrieren uns also im ersten Schritt um die Login-Seite von WordPress. Wann wir einen Zugriff als „böse“ einstufen und blockieren, konfigurieren wir im Anschluss.
Filter aktiveren und konfigurieren
Als nächstes werden die Filter aktiviert und auf unsere Bedürfnisse angepasst. Also öffnen wir mit dem Editor unserer Wahl die oben erstellte Konfig-Datei. Die einzelnen Filter sind z.B. mit „[sshd]“ in Blöcke unterteilt. Wir ergänzen die Parameter unter „sshd“ bzw. „ssh“ (je nach System) und fügen einen weiteren Block inklusive Parameter für WordPress hinzu:
nano /etc/fail2ban/jail.local # folgende Zeilen unterhalb "[sshd]" suchen und ergänzen: [sshd] enabled = true port = ssh filter = sshd bantime = 86400 maxretry= 3 logpath = %(sshd_log)s backend = %(sshd_backend)s [wordpress] enabled = true port = http,https filter = wordpress logpath = /var/log/apache2/<path to access.log>/access.log maxretry = 3 findtime = 3600 bantime = 86400
Mit den Parametern kann man natürlich selbst noch etwas herumprobieren und auf seinen Anwendungsfall anpassen. Die Bedeutung der Parameter sind anhand des WordPress-Eintrags schnell erklärt:
Im Beispiel für den WordPress-Login wird der Zugriff dann blockiert, wenn innerhalb von einer Stunde (3600 Sekunden) 3 Zugriffe registriert wurden. Man wird dann für 24 Stunden blockiert (86400 Sekunden).
Diese Datei muss nun noch gespeichert und der Deamon fail2ban neu gestartet werden, um die Änderungen zu übernehmen:
/etc/init.d/fail2ban restart
Testen des Filters
Anschließend kann man die Sperre testen, indem man sich z.B. mehr als drei Mal erfolglos versucht in WordPress anzumelden. Dies sollte man aber z.B. über einen Proxy durchführen, sonst ist man logischerweise selbst eine gewisse Zeit ausgesperrt.
Hierzu kann man aber auch einfach den Tor-Browser oder das Smartphone mit deaktiviertem WLAN verwenden (sofern man sich nicht anschließend mit dem Smartphone anmelden will –> logisch).
Hinweis: Es reicht hierbei nicht, die WordPress-Loginseite aufzurufen (dies wäre eine GET-Anfrage), da wir nur auf POST-Anfragen reagieren (siehe Regex-Ausdruck in der wordpress.conf). Man muss sich also drei mal mit einem falschen Benutzernamen / Passwort anmelden. Beim weiteren Zugriff wird man blockiert, die Loginseite ist dann vorübergehend nicht mehr über diese IP-Adresse errichbar.