Social Media / construktiv 10. August 2009

Safety first: Wordpress gegen Angriffe absichern

Das Opensource Blog-System WordPress erfreut sich immer größerer Beliebtheit im Netz. Dank der Funktionsvielfalt wird es längst nicht mehr ausschließlich als Blog eingesetzt, sondern ersetzt oftmals auch aufwendige Content-Management-Systeme bei kleineren Webauftritten.

Doch der steigende Funktionsumfang ist für den Anwender Fluch und Segen gleichermaßen, denn mit den Möglichkeiten wächst auch die Zahl potentieller Schwachstellen, die von Hackern ausgenutzt werden können, um Inhalte zu manipulieren oder an Daten zu kommen, die nicht für die Öffentlichkeit bestimmt sind. Wir haben deshalb an dieser Stelle die gängigsten Maßnahmen zusammengestellt, um WordPress sicherer zu machen.

Tabellen-Präfix ändern

Bei einer Standardinstallation verwendet WordPress den Präfix „wp_“ um seine Tabellen in der MySQL Datenbank zu kennzeichnen. Das wissen auch Hacker und versuchen so über Schwachstellen im Code Daten in der Datenbank zu manipulieren. Die einfachste Abwehr dagegen ist ein individueller, kryptischer Präfix. Festgelegt werden kann dieser während der WordPress Installation.

Wer sein Blog bereits seit einiger Zeit im Netz hat kann auch die bestehenden Datenbanken ändern, am einfachsten geht das mit dem Plugin WP Prefix Table Changer. Wichtig ist, dass der verwendete Präfix auch in der Datei wp-config.php angegeben wird, die im Stammverzeichnis von WordPress zu finden ist.

Secret-Keys generieren

Seit einiger Zeit verwendet WordPress die so genannten Secret-Keys, um Cookies zu verschlüsseln. Mittlerweile sind 4 dieser Keys im Einsatz. Sie werden ebenfalls in der Datei wp-config.php definiert und müssen derzeit noch von Hand eingesetzt werden. Mit Hilfe dieses Generators kann man sich die vier Codezeilen inkl. zufällig vergebener Keys generieren lassen. In zukünftigen WordPress-Versionen sollen die Secret-Keys automatisch während der Installation in die Konfiguration geschrieben werden.

Standard-User „admin“ löschen

Bei der Installation eines WordPress Blogs wird der User „admin“ automatisch angelegt, dieser sollte direkt nach dem Setup gelöscht und durch einen neuen Nutzer mit Administrator-Rechten ersetzt werden. Zusätzlich empfiehlt es sich die User-ID des neuen Admins in der Datenbank zu ändern, so dass dieser nicht die IDs 1 oder 2 bekommt, da Hacker versuchen könnten über die User-ID einen Admin vorzutäuschen, um Zugriff auf Posts, Plugins oder Einstellungen zu bekommen.

Wer nicht direkt auf die MySQL Datenbank zugreifen kann oder möchte, dem hilft das Plugin Search & Replace.

WordPress Version verschleiern

Die Ausgabe der WordPress Version gibt Angreifern Aufschluss über eventuell vorhandene Schwachstellen durch veralteten Quellcode. Um die Ausgabe zu verhindern muss die folgende Zeile in die Datei functions.php geschrieben werden.

remove_action('wp_head', 'wp_generator');

Die functions.php gehört zu jedem WordPress Theme und findet sich daher im jeweiligen Verzeichnis des verwendeten Themes.

Achtung bei einem Relaunch oder beim Wechsel zu einem anderen Theme: Da jedes Design seine eigene funtions.php mitbringt, muss diese auch jedes mal wieder indvividuell angepasst werden.

Windows LiveWriter und XMLRPC Schnittstellen deaktivieren

Diese Windows LiveWriter und XMLRPC  Schnittstellen erlauben das Bloggen mittels Software auf dem eigenen PC oder auch unterwegs per Handy. Ab der WordPress Version 2.6 sind sie bei der Installation standarmäßig bereits deaktiviert, sicherheitshalber sollten dennoch die folgenden Zeilen in der gerade schon beschriebenen Datei functions.php ergänzt werden.

remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'rsd_link');

Um Risiken vollkommen auszuschließen sollte außerdem die Datei xmlrpc.php im WordPress Stammverzeichnis gelöscht oder zumindest umbenannt werden.

Fehlerausgabe unterbinden

Bei der Web-Entwicklung sind Fehlerausgaben nützlich. In einer Live-Umgebung geben Sie Angreifern jedoch unter Umständen fatale Hinweise auf den Maschinenraum eines Blogs.

Mit Hilfe der folgenden Zeile in der Datei wp-config.php kann die Ausgabe von PHP und MySQL Fehlern deaktiviert werden.

define('WP_DEBUG', false);

Plugin-Verzeichnis schützen

Das Plugin-Verzeichnis und ggf. auch andere kritische Ordner sollten durch eine leere index.html oder index.php Datei vor Ausgabe des Ordnerinhaltes geschützt werden, egal ob der Server dies erlaubt oder nicht. Ab Version 2.8 bringt WordPress diese Maßnahme bereits mit, doch auch Blogger, die regelmäßig Updates einspielen, sollten prüfen, ob ihr Plugin-Verzeichnis bereits geschützt ist.

wp-admin Verzeichnis schützen

Wichtigster Angriffspunkt in WordPress und damit die größte Schwachstelle sind die Dateien im Verzeichnis wp-admin, da hier sämtliche Funktionen des Blogs gesteuert werden, und, neben Veränderungen an der Datenbank (bei falscher Serverkonfiguration) selbst, Dateien manipuliert werden können. Der einfachste Weg diese Schwachstelle zu schließen, ist es Angreifer erst gar nicht bis dorthin kommen zu lassen.

Eine Möglichkeit dies zu realisieren ist der Schutz des wp-admin Verzeichnisses durch eine .htaccess + .htpasswd Kombination bzw. eine IP-Sperre per .htaccess. Somit ist das gesamte Verzeichnis und damit auch der eigentliche Login zum Backend für nicht authorisierte Benutzer gesperrt. Die benötigten Dateien können beispielsweise mit diesem Generator erzeugt werden und müssen anschließend im wp-admin Verzeichnis abgelegt werden. Alternativ können diese Aufgabe aber auch die Plugins wie Login Lockdown oder AskApache Password Protect übernehmen.

Wichtig hierbei ist natürlich sicherzustellen, dass alle zugelassenen Autoren über die benötigten Zugangsdaten verfügen. Eine IP-Sperre eignet sich vor allem für Unternehmen, da diese häufig über einen Internetzugang mit fester IP-Adresse verfügen. Normale Internetuser haben meist jedoch eine dynamische IP, die sich spätestens nach 24 Stunden ändert. In diesem Fall würde man sich hierüber aus seinem eigenen Blog aussperren.

Login-Versuche limitieren

WordPress erlaubt unendlich viele Anmeldeversuche mit falschen Zugangsdaten, Brute-Force-Angriffe werden dadurch erleichtert.

Mit dem Plugin Limit Login Attempts kann die Zahl von Falscheingaben bestimmt werden, nach der ein User für weitere Login-Versuche gesperrt wird. Der Administrator wird per Mail über diese Sperre informiert und kann im Ernstfall schnell weitere Maßnahmen ergreifen.

Login Fehlermeldungen unterdrücken

Hinweise über fehlerhafte Passwörter oder Nutzernamen unterstützen den Hacker bei der Suche nach gültigen Zugangsdaten. Die Ausgabe solcher Hinweise kann über folgende Codezeile in der Datei functions.php unterbunden werden

add_filter( 'login_errors', create_function( '$a', "return null;" ) );

wp-config.php schützen

Bei einem falsch konfigurierten Server könnte es möglich sein, den Inhalt der Datei wp-config.php anzuzeigen und so an Zugangsdaten für die Datenbank zu gelangen. Um dies zuverlässig zu verhindern, sollte die .htaccess Datei im WordPress Stammverzeichnis durch die folgenden Zeilen ergänzt werden.

# protect wp-config.php
<files wp-config.php>
Order deny,allow
Deny from all
</files>

Registrierung neuer Nutzer verbieten

Sofern die Möglichkeit der Registrierung neuer User nicht benötigt wird, sollte diese über die entsprechende Einstellung im WordPress Backend deaktiviert werden. Ist in der vorliegenden Installation noch die Datei wp-register.php im Stammverzeichnis vorhanden, so kann diese gelöscht werden, da sie seit der Version 2.6 nicht mehr verwendet wird.

Backups durchführen

In Regelmäßigen Abständen sollten unbedingt Backups der Datenbank erstellt werden. Auch eine Sicherung der aktuellen Theme-Version sollte stets vorhanden sein, um bei eventuellen Totalabstürzen wieder schnell online gehen zu können.

Das Plugin WP-DBManager hilft bei der Erstellung automatisierter Datenbank-Backups.

Updates durchführen

Auch die beste Absicherung nützt nichts, wenn das System selbst kritische Schwachstellen aufweist. WordPress wird ständig von einer großen Gemeinde erfahrener Programmierer weiterentwickelt und verbessert. Deshalb sollte das Kernsystem stets auf dem aktuellsten Stand gehalten werden und auch Plugins und Themes sollten regelmäßig auf die aktuellste Version gebracht werden.

Vor einem Update sollte jedoch stets ein Backup erstellt werden, sodass im Fall eines Fehlers die bisherige Version wiederhergestellt werden kann.

Zum Schluss noch ein allgemeiner Tipp: Verwenden Sie, wenn immer möglich, für den Datentransfer auf Ihre Server nicht das FTP-Protokoll, sondern greifen Sie auf FTPS oder sFTP (via SSH) zurück. FTP überträgt sämtliche Login-Daten unverschlüsselt, ein Hacker könnte ihre Daten abfangen und erhält somit vollen Zugriff auf Ihren Server. FTPS und sFTP übertragen sämtliche Daten verschlüsselt und bieten so optimalen Schutz vor neugierigen Blicken.

Ähnliches gilt auch für den WordPress Login. Dieser sollte wenn möglich via SSL geschützt werden – auch wenn in der Praxis wohl den wenigsten ein gültiges SSL-Zertifikat auf dem Server zur Vergügung stehen dürfte.