- WordPress sicher installieren
- Tabelle-Präfix
- Authentication Unique Keys
- Datei- und Verzeichnisrechte
- wp-content umbenennen
- Gesicherter Zugang
- Sicherheit bestehender Installationen
- Username ändern
- WordPress-Version nicht preisgeben
- Fehler- und Hinweismeldungen deaktivieren
- Sicherheit per .htaccess
- Fazit
Sicher bloggen: WordPress mit wenigen Kniffen vor Angriffen schützen
Es gibt viele Wege, um eine WordPress-Installation abzusichern. In diesem Artikel werden lediglich jene beleuchtet, die mit geringem Aufwand in WordPress realisiert werden können. Eine Gewichtung ist dabei nur schwer möglich und im Einzelfall immer abhängig von den unterschiedlichen zur Verfügung stehenden Möglichkeiten. Hat man beispielsweise die Option, auf die Konfiguration des Servers zuzugreifen, kann bereits im Vorfeld ein hohes Maß an Sicherheit erreicht werden. Hier soll es lediglich um Sicherheitseinstellungen innerhalb von WordPress gehen.
WordPress sicher installieren
WordPress ist für seine einfache und unkomplizierte Installation bekannt. Diese Tatsache hat unter anderem zur Popularität der Software beigetragen, sorgt aber ebenso dafür, dass viele Einstellungen auf unterschiedlichsten Installationen gleich sind. Dies ermöglicht es Hackern, auf diverse Ausgangspositionen aufzusetzen und sich unbefugten Zutritt zu verschaffen.
Bereits bei der Installation von WordPress sollte man deshalb einige Punkte beachten, die dazu beitragen, dass das eigene Blog weniger Gemeinsamkeiten mit einer Default-WordPress-Installation hat. Eine Installation, die vom Standard abweicht, erschwert potenziellen Eindringlingen den unauthorisierten Zugang. In diesem Zusammenhang sollte man einige Punkte beim Aufsetzen einer neuen Installation von WordPress beachten.
Alle Tipps beschränken sich auf die Möglichkeiten der Basisinstallation ohne Erweiterungen. Es existieren allerdings auch einige nützliche Plugins für mehr Sicherheit in WordPress, die besonders für weniger versierte Nutzer eine Alternative darstellen.
Tabelle-Präfix
Der Zugang zur Datenbank wird in der Datei wp-config.php konfiguriert. In dieser Datei wird auch das Tabellen-Präfix definiert, mit dem WordPress bei der Installation alle erforderlichen Tabellen anlegt. Standardmäßig handelt es sich hierbei um das Präfix „wp_“. Sie sollten immer ein fiktives Präfix vergeben, das nicht dem Standard entspricht. Außerdem sollten Sie darauf achten, dass Sie ausschließlich Zahlen, Buchstaben und Unterstriche verwenden, denn andere Zeichen werden nicht unterstützt.
Authentication Unique Keys
Ebenfalls in der Datei wp-config.php haben Sie die Möglichkeit, vier Sicherheitsschlüssel zu definieren, die die Sicherheit von WordPress erhöhen. Die Schlüssel erzeugen Sie entweder manuell oder über einen
Generator von wordpress.org [1]. Die vier Schlüssel sind verschiedenen Cookies zugeordnet und werden an unterschiedlichen Stellen genutzt, um die Sicherheit von WordPress zu erhöhen, daher ist es auch wichtig, dass jede Installation unterschiedliche Schlüssel hat. Die relevanten Schlüssel sind folgende:
AUTH_KEY | Wird genutzt für unsichere Verbindungen via http. |
SECURE_AUTH_KEY | Mit dieser Konstante lässt sich eine gesicherte Verbindung über https realisieren. |
LOGGED_IN_KEY | Hält fest, ob sich ein Nutzer eingeloggt hat; nicht administrativer Cookie. |
NONCE_KEY | Kommt unter anderem bei $_POST-Abfragen von WordPress zum Einsatz und kann durch Erweiterungen mit der Funktion wp_nonce() genutzt werden. |
Wird eine bestehende Installation von WordPress aktualisiert, sollten die Schlüssel entsprechend ergänzt werden, hier am Beispiel von AUTH_KEY:
define('AUTH_KEY', 'put your unique phrase here'); // Hier gehört eine beliebige, möglichst zufällige Phrase rein
Listing 1
Datei- und Verzeichnisrechte
Unterscheiden Sie die Rechte der Dateien und Verzeichnisse angemessen. Je nach Arbeitsweise – ob Dateien in Themes und Plugins aus dem Backend heraus bearbeitet werden sollen oder ob Dateien abgelegt werden – sollten Sie die Rechte entsprechend setzen. Eingeschränkte Rechte erschweren es einem Angreifer, die Dateien und Verzeichnisse zu verändern.
Suchmaschinen nehmen in der Regel bis zu einer gewisse Tiefe, was sie bekommen können. Verhindern Sie mit Hilfe der Datei „robots.txt“ diesen Zugriff. Die internen Verzeichnisse von WordPress sollten in keinem Suchergebnis auftauchen – ein einfaches „Disallow“ genügt.
Je nach Serverkonfiguration besteht die Möglichkeit, dass man die Inhalte der Ordner im Browser listen kann. Dies gilt es zu verhindern, was durch das Ablegen einer leeren „index.html“ im jeweiligen Verzeichnis schnell erledigt ist. Alternativ kann dies mit Hilfe des Plugins „Secure WordPress“ [2] erledigt werden.
wp-content umbenennen
Alle Erweiterungen, Dateien und Themes werden bei der Standardinstallation im Ordner „wp-content“ abgelegt. Oft öffnen Themes oder Plugins eine Sicherheitslücke im System, daher ist es seit Version 2.6 möglich, diesem Ordner einen willkürlichen Namen zu geben und den Ordner an anderer Stelle abzulegen. Bei einer Neuinstallation ist das einfach und schnell gemacht. Es kann lediglich zu Problemen mit Plugins oder Themes führen, da nicht alle Autoren diesen Pfad mit Hilfe der bereitgestellten Konstanten und Funktionen abfragen. Daher ist diese Möglichkeit nur versierten Nutzern zu empfehlen.
Um den Ordner neu zu definieren, genügt es, diesen mit Hilfe der Konstanten in der wp-config.php festzulegen.
define('WP_CONTENT_DIR', ABSPATH . 'test'); // wp-content Directory define('WP_CONTENT_URL', 'http://examble.com/test'); // wp-content UR
Listing 2
Gesicherter Zugang
Mit der Version 2.6 ist eine neue Möglichkeit hinzugekommen, das Backend der Installation abzusichern: der Zugriff via SSL – Secure Sockets Layer ist ein Verschlüsselungsprotokoll zur Übertragung von Daten. Ihr Webspace-Provider muss die Nutzung von SSL allerdings unterstützen. Ist dies der Fall, können Sie das Protokoll in der wp-config.php aktivieren. Um die Möglichkeiten von SSL im Bereich des Backend zu nutzen, müssen Sie die Konstante „FORCE_SSL_LOGIN“ mit „TRUE“ definieren. Von nun an werden alle Daten im Backend verschlüsselt übertragen.
define ('FORCE_SSL_LOGIN', true);
Listing 3
Sicherheit bestehender Installationen
Auch bestehende Blogs können mit einigen Handgriffen sicherer gestaltet werden. Ist das Blog bereits aktiv und die Datenbank gefüllt, kann das Ändern des Tabellenpräfix fatale Folgen haben. Trotzdem besteht auch hier die Möglichkeit, dem Standard-Präfix den Rücken zu kehren. Dazu sind diverse Schritte mit Hilfe von SQL nötig, die Sie in der dafür zuständigen Oberfläche ausführen. Alternativ kann man diesen Weg mit Hilfe eines Plugins beschreiten. Jede Änderung an der Datenbank bedarf einer Sicherung der aktuellen Datenbank im Vorfeld.
Um alle zehn Standard-Tabellen zu ändern, sind folgende SQL-Anweisungen notwendig. Habe Sie weitere Tabellen, zum Beispiel durch Plugins, müssen in der Regel auch dort die Präfixe geändert werden. Passen Sie das Beispiel „wp_i1d_“ Ihren Anforderungen an.
RENAME TABLE wp_comments to wp_i1d_comments; RENAME TABLE wp_links to wp_i1d_links; RENAME TABLE wp_options to wp_i1d_options; RENAME TABLE wp_postmeta to wp_i1d_postmeta; RENAME TABLE wp_posts to wp_i1d_posts; RENAME TABLE wp_terms to wp_i1d_terms; RENAME TABLE wp_term_relationships to wp_i1d_term_relationships; RENAME TABLE wp_term_taxonomy to i1d_term_taxonomy; RENAME TABLE wp_usermeta to wp_i1d_usermeta; RENAME TABLE wp_users to wp_i1d_users;
Listing 4
Leider nutzt WordPress bei der Installation das vergebene Präfix auch, um einige Felder in den Tabellen „options“ und „usermeta“ eindeutig zu benennen. Daher müssen Sie auch diese Felder umbenennen.
UPDATE wp_i1d_options SET option_name = REPLACE(option_name, ’wp_’, ’wp_i1d_’); UPDATE wp_i1d_usermeta SET meta_key = REPLACE(meta_key, ’wp_’, ’wp_i1d_’);
Listing 5
Da auch Plugins eventuell Felder mit dem Präfix anlegen können, ist es ratsam, wenn Sie nun die Datenbank nach dem alten Präfix durchsuchen und die gefundenen Werte ebenso ändern.
SELECT * FROM wp_i1d_options WHERE option_name LIKE ’wp_%’; SELECT * FROM wp_i1d_usermeta WHERE meta_key LIKE ’wp_%’;
Listing 6
Username ändern
Der Benutzername der Standard-Installation ist admin und nicht nur Ihnen bekannt. Nach einer Installation gehört dieser Nutzer gelöscht. Sie sollten unbedingt einen neuen Administrator anlegen. Dies geschieht im Administrationsbereich und sollte die erste Tat nach dem initialen Login sein.
Damit ändern Sie nicht nur den Nutzernamen, sondern auch die ID, die nach der Erstinstallation 1 ist. Zwei Felder, die es einem Angreifer einfach machen, wenn Sie diese nicht ändern.
Möchten Sie sehr große Werte für die ID setzen, so ist die händische Variante im Backend sehr aufwändig, denn WordPress addiert bei jedem neuen Nutzer nur 1 auf. Alternativ können Sie diesen Wert auch per SQL oder mit dem Plugin „Suchen & Ersetzen“ [3] ändern.
UPDATE 'wp_users' SET 'ID' = '815' WHERE 'wp_users'.'ID' = 1; UPDATE 'wp_usermeta' SET 'user_id' = '815' WHERE 'wp_usermeta'.'user_id' = 1; UPDATE 'wp_posts' SET 'post_author' = '815' WHERE 'wp_posts'.'post_author' = 1; UPDATE 'wp_links' SET 'link_owner' = '815' WHERE 'wp_links'.'link_owner' = 1;
Listing 7
WordPress-Version nicht preisgeben
Die Version von WordPress wird an vielen Stellen des Blogs ausgegeben, so im Backend, in den Feeds und im Theme. Jede Version hat ihre Eigenarten und Fehler, die potenziellen Angreifern bekannt sind.
Aus diesem Grund sollten Fremde keine Information über Ihre WordPress-Installation erhalten. Die einfachste Form, um die Versionsinformationen aus allen Bereichen (außer dem Backend) zu entfernen, ist die Nutzung des Plugins „Secure WordPress“ [4]. Alternativ genügt es, die Funktion für die Veröffentlichung der Version zu unterbinden.
add_filter( ’the_generator’, create_function(’$a’, "return null;") );
Listing 8
Fehler- und Hinweismeldungen deaktivieren
Den Backendbereich von WordPress erreicht man via Login mit Benutzernamen und Passwort. Kommt es hier zu Fehlern durch den Nutzer, gibt WordPress entsprechende Tipps, um den Login zu erleichtern. So nützlich die Information für den Anwender ist, so nützlich ist sie auch für unerwünschte Eindringlinge.
Überlegen Sie, ob Sie diese Meldungen zulassen müssen oder wollen, ansonsten können auch diese mit dem bereits erwähnten Plugin „Secure WordPress“ deaktiviert werden.
Sollte in Ihrer wp-config.php die Konstante „WP-DEBUG“ definiert sein, müssen Sie diese auf den Wert „FALSE“ setzen oder löschen, denn ansonsten werden alle Fehler in WordPress im Browser ausgegeben. Diese Konstante sollte nur im Entwicklungsumfeld von WordPress genutzt werden.
define('WP_DEBUG', false);
Listing 9
Sicherheit per .htaccess
Die Möglichkeiten mit .htaccess sind vielfältig und so kann man auch
WordPress mittels .htaccess hinreichend absichern. Im Einzelnen sollten
die unterschiedlichen Anforderungen dabei geprüft werden, denn nicht
selten leidet die Benutzbarkeit unter den Sicherheitseinstellungen. Betrachten Sie die Sicherheit von WordPress
auch aus Sicht der Nutzer, nicht nur aus der des Administrators. Ebenfalls
sollten Sie die Konfiguration Ihres Webspace beachten, so dass es nicht
zu Fehlern kommt.
Prinzipiell kann jedes Verzeichnis geschützt werden, dabei kommt dem
Ordner „wp-admin“ eine erhöhte Bedeutung zu, denn dort sind die Dateien
für den Zugriff auf das Backend hinterlegt. Der Zugriff wird über
wp-login.php gesteuert und WordPress leitet immer dort hin um, egal
welcher Aufruf in wp-admin unauthorisiert erfolgt. Dabei muss
zusätzliche eine .htpasswd-Datei erzeugt werden, die User und Passwort enthält. Diverse Onlinegeneratoren können beim Erstellen der Dateiinhalte helfen.
# protect wp-login.php <files wp-login.php> AuthName "Admin-Bereich" AuthType Basic AuthUserFile /your_lokal_path/.htpasswd require valid-user </files>
Listing 10
Wie schon erwähnt, enthält die Datei „wp-config.php“ die Zugänge zur
Datenbank, was sie besonders schützenswert macht. Wenige Zeilen in der
.htaccess des Root helfen hierbei.
# protect wp-config.php <files wp-config.php> Order deny,allow deny from all </files>
Listing 11
Sollte die Serverumgebung eine offene Verzeichnisumgebung zulassen, empfiehlt es sich, entweder die angesprochene index.html im
jeweiligen Verzeichnis abzulegen oder per „Options Indexes“ in der
.htaccess den Zugriff zu sperren.
Auch die Ordner „wp-content“ und „wp-includes“ sind schützenswert. Die folgende Syntax zeigt eine
einfache Variante, um den jeweiligen Ordner zu schützen.
Order Allow,Deny Deny from all <Files ~ "js/tinymce/*.$"> Allow from all </Files> <Files ~ "\.(css|jpe?g|png|gif|js)$"> Allow from all </Files>
Listing 12
Die Dateiformate sollten also unbedingt angepasst sowie gegebenenfalls erweitert und getestet werden.
Als Alternative steht Ihnen auch hier eine Plugin-Lösung bereit, die die Sicherheit stark erhöhen kann und Ihnen die Arbeit abnimmt: AskApache Password Protect [5].
Fazit
PHP und Sicherheit wurden und werden häufig im Zusammenhang diskutiert, mitunter treibt dieses Thema Web-Programmierern den Schweiß auf die Stirn. Sicherheit mit PHP ist jedoch keine „Geheimwissenschaft“, bereits mit wenigen Grundlagen kann man eine WordPress-Erweiterung sicherer machen. Auch WordPress selbst liefert dazu Funktionen. WordPress wird viel genutzt, unter unterschiedlichen Konfigurationen und PHP-Versionen, so dass man das Thema vielschichtig und komplex behandeln kann. Die vorgestellten Tipps sind einfache und fast überall umsetzbare Hinweise, die man nicht leichtfertig ignorieren sollte, wenn man sein Blog kontrolliert administrieren will.
Zum Theme „Username ändern“ möchte ich noch ergänzen, da ich hier im Artikel einen Eintrag in der Datenbank vergessen habe; eventuell kann man das im Artikel nachpflegen.
UPDATE `wp_users` SET `ID` = '815' WHERE `wp_users`.`ID` = 1;
UPDATE `wp_usermeta` SET `user_id` = '815' WHERE `wp_usermeta`.`user_id` = 1;
UPDATE `wp_posts` SET `post_author` = '815' WHERE `wp_posts`.`post_author` = 1;
UPDATE `wp_links` SET `link_owner` = '815' WHERE `wp_links`.`link_owner` = 1;
Die Änderung wurden eingetragen. Der Code ist nun so, wie von Frank in den Kommentaren angemerkt.
Okay, meckern können wir alle. Wie wäre es mit etwas Konstruktivem, Mr. Kreativ…? Ich hätte mir am Ende des Artikels schon ein paar mehr Fakten erwünscht. So bleibt es einfach nur ein billiger Abklatsch von Weisheiten, die wir schon aus “Fight Club” kennen. Sorry. Von Leuten, die auf hohem Niveau meckern, halte ich GAR NICHTS.