Ein Anmeldeformular ist bei den meisten Anwendungen im Internet komplett unge­schützt und lädt u.U. interessierte Hacker regelrecht zum Überwinden dieser Hürden ein. Ein paar Zeilen Shell-Script (oder welche Programmiersprache man favorisiert) und schon kann eine Brute-Force-Attacke starten. Hierbei wird einfach immer wieder probiert ob eine Passwort-Nutzername-Kombination funktioniert.

Ist, wie bei vielen WordPress-Installationen noch immer üblich, der User-Account admin im Einsatz, hat der Hacker schon mal den Benutzernamen und 1 von 2 Eingabefeldern sind somit korrekt ausgefüllt. Oft genug steht der Anmeldename sogar irgendwo im Artikel (oder kommt euch dieser Satz nicht irgendwie bekannt vor?):

Der Artikel „Den Admin-Bereich von WordPress schützen“ wurde am 27. Juni durch den Benutzer admin veröffentlicht.


In diesem Artikel möchte ich zwei wirklich einfache, aber dennoch effektive Methoden vorstellen, die zumindest eine Brute-Force-Attacke verhindern können. Zum einen durch eine zusätzliche serverseitige Passwortabfrage und zum anderen durch das WordPress-Plugin Limit Login Attempts. Das Brute-Force-Problem ist auf praktisch alle Content Management Systeme, Foren, Blogs usw. übertragbar und sicherlich sind diese ebenso einfach abzusichern.

Das Passwort knacken

Kurz zurück zum Hacker-Script: Nun geht es an die Suche nach dem richtigen Passwort. Ein Wörterbuch, eine Liste mit Vor- und Kosenamen oder ein Lexikon als Datengrundlage und das bereits erwähnte Script, welches immer und immer wieder versucht mit Begriffen aus der Datenvorlage den Loginbereich zu überwinden, reichen oftmals aus.
Das Script hat Zeit! Und wenn es mit entsprechenden Pausenzeiten versehen ist, wird auch der Server auf dem der Blog läuft, nicht weiter belastet. Es fällt somit niemanden auf und auch unser Hacker muss nicht vor dem Bildschirm sitzen bleiben – er lässt sich einfach eine E-Mail generieren, wenn der Login erfolgreich verläuft.

Das zeigt natürlich auch wie wichtig es ist, unterschiedliche und sichere Passwörter zu verwenden. Etwas, was im Duden steht, geht überhaupt nicht. Wer „koethen123“ als Passwort verwendet, sollte doch wenigstens ein „Ko€th€n!23“ daraus machen. Ist genauso leicht zu merken, aber doch ganz schön kryptisch… Wird sicher demnächst Thema eines weiteren Artikels zum Thema Passwortschutz.

Serverseitiger Passwortschutz per htaccess-Datei

Es ist eigentlich kein großer Aufwand von Nöten, um nicht jedem daher gelaufenen Hacker mit bösen Absichten oder einem Script-Kiddy den Zugriff auf das WordPress-Login, und somit ein mögliches Eindringen in den Administrationsbereich, zu erschweren. Ein einfacher htaccess-Verzeichnisschutz kann hier dem Angreifer bereits die Lust nehmen, es weiter zu probieren.

Hierfür einfach die .htaccess-Datei beziehungsweise den vhost-Eintrag durch den folgendem Inhalt erweitern:

<Files wp-login.php>
    AuthType Basic
    AuthName "Verzeichnisschutz"
    AuthUserFile /pfad/zur/.htpasswd
    Require valid-user
</Files>

Im Artikel Einrichtung eines Verzeichnisschutz per htaccess-Datei ist ausführlich beschrieben, wie man die Passwort- und htaccess-Datei anlegt und was es zu beachten gibt. Fehlerhafte Logins lassen sich serverseitig sehr gut loggen und ggf. weiter verarbeiten. So zum Beispiel das Sperren der Angreifer-IP.

WordPress-Plugun: Limit Login Attempts

Mit dem WordPress-Plugin Limit Login Attempts lassen sich Einstellungen vornehmen, die nach einer konfigurierbaren Anzahl fehlgeschlagener Login-Versuche den wp-admin Bereich für eine ebenfalls konfigurierbare Zeit sperren. Die Sperre bezieht sich hierbei auf die IP-Adresse des potentiellen Angreifers.

Limit Login Attempts Einstellungen

Limit Login Attempts Einstellungen

Selbst ausgesperrt! Was nun?

Sperrt man sich selbst aus dem eigenen Blog, dann hilft es:

  • die eingestellte Zeit abzuwarten
  • das Ändern der eigenen IP-Adresse (wenn man die Möglichkeit hat)
  • über einen Proxy-Server (und somit von einer anderen IP) zuzugreifen
  • in der Datenbank den entsprechenden Eintrag zu löschen; per phpMyAdmin oder mit diesem SQL-Befehl
    UPDATE wp_options SET option_value = "" WHERE option_name = "limit_login_lockouts";
    
  • Umbenennen der Datei /wp-content/plugins/limit-login-attempts/limit-login-attempts.php und somit Deaktivieren des Plugins
Limit Login Attempts - Ungültiger Benutzername oder Passwort

Limit Login Attempts – Ungültiger Benutzername oder Passwort

Ein kleines unauffälliges Plugin, das ein Austesten des WordPress-Zugangs praktisch unmöglich macht und so das eigene System sichert.

403 Error nach fehlerhaftem Login

Bei einem fehlerhaften Login bekommt ein menschlicher Besucher von WordPress signalisiert, dass Benutzername und/ oder Passwort nicht korrekt waren und er darf es erneut probieren. Bei einem Bot sieht das ähnlich aus. Login fehlerhaft, Server-Status 200 (Anfrage erfolgreich) und ein neuer Versuch – oftmals im Sekundentakt. Das Spiel geht solange, bis letztendlich der Login erfolgreich war oder das Programm des Bots abgearbeitet ist (z.B. alle hinterlegten Passwort-Kombinationen erfolglos probiert wurden).

Crawler, Spam-Bots, Spider und andere auf Brute-Force-Attacken spezialisierte Anwendungen, die vollautomatisch versuchen sich in WordPress-Installationen einzuloggen, bekommen mit diesem Code-Schnipsel von Sergej Müller den Server-Status 403 (Error 403 / Forbidden) im Header zurück geliefert. Da sie diese Antwort nicht erwarten, verschwinden sie wieder und versuchen nicht durch ein Dauer-Bombardement die Zugangsdaten doch noch heraus zu bekommen.
Für einen menschlichen Besucher, der sich vertippt hat, gibt es keinen Unterschied zu sehen.

Sergej hat dies in seinem Google+-Post wie folgt beschrieben:

Es ist ein Kommen und Gehen. Aber nie ein Kommen, Bombardieren und Gehen.

Code-Snippet für die functions.php

<?php
add_action (
   'wp_login_failed',
   create_function(
   '$u',
   "status_header(403);"
   )
);
?>

Hier findet ihr weitere Ausführungen zum Thema WordPress Login, dessen Schutz und was ihr machen könnt, wenn das Passwort bzw. die URL dorthin mal vergessen wird. Habt ihr noch weitere Tipps zum Absichern des WordPress-Logins? Schreibt es in die Kommentare oder lasst uns darüber diskutieren.