Apache

10 praktische Sicherheits-Optimierungen für WordPress

29. Juni 2010
von
Jean Baptiste-Jung (Übersetzung Manuela Müller)

Sicherheit war schon immer ein heikles Thema. Offline – im realen Leben – kaufen Menschen Häuser und Autos mit Alarmanlagen und allerlei Geräte für mehr Sicherheit. Online ist Sicherheit ebenso wichtig, vor allem dann, wenn Sie vom Betrieb einer Website oder eines Blogs leben. Lernen Sie hier zehn nützliche Maßnahmen kennen, mit denen Sie die Sicherheit Ihres WordPress-Blogs verbessern.

1. Verhindern Sie das Veröffentlichen unwichtiger Informationen

Screenshot

Das Problem
Wenn Ihr Versuch, sich in ein WordPress-Blog einzuloggen, fehlschlägt, gibt das Content-Management-System (CMS) eine Meldung aus, was schief lief. Das ist gut, wenn Sie Ihr Passwort vergessen haben. Noch nützlicher könnte diese Information für Hacker sein, die Ihren Blog entern wollen. Warum hindern Sie WordPress eigentlich nicht daran, solche Meldungen über fehlgeschlagene Logins auszugeben?

Die Lösung
Um Fehlermeldungen über missglückte Logins zu unterbinden, öffnen Sie einfach die Datei functions.php und kopieren den folgenden Code hinein:

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

Speichern Sie die Datei und prüfen Sie selbst. Es wird keine Meldung ausgegeben, wenn Ihr Login-Versuch scheitert.

Achtung: Es gibt mehrere Dateien namens functions.php. Achten Sie darauf, diejenige im Verzeichnis wp-content zu ändern!

Übrigens: Wo das add_filter() in der Theme-function.php steht, ist im Prinzip nicht wichtig, solange es bei jedem Request ausgeführt wird. Im Zweifel setzt man das einfach ganz an den Anfang des Scripts.

Erklärung des Codes
Mit diesem Code haben wir einen Trick eingefügt, um die login_errors()-Funktion zu überschreiben. Da unsere “aufgebohrte” Funktion lediglich  null wiedergibt, ist die ausgegebene Meldung ein leerer String.

Quelle

2. Erzwingen Sie den Gebrauch von SSL

Screenshot

Das Problem
Sollten Sie sich darüber Sorgen machen, dass Ihre Daten abgefangen werden, sollten Sie auf unbedingt SSL verwenden. Falls Sie es bisher noch nicht wussten: SSL ist ein Verschlüsselungsprotokoll, das Kommunikation in Netzwerken wie dem Internet sichert.

Wussten Sie, dass es möglich ist, WordPress zum Einsatz von SSL zu zwingen? Nicht alle Hosting-Anbieter gestatten Ihnen den Einsatz von SSL. Bei Firmen wie Wp WebHost oder HostGator ist SSL freigegeben.

Die Lösung
Wenn SSL auf Ihrem Webserver aktiviert werden kann, öffnen Sie die Datei wp-config.php (befindet sich im Root-Verzeichnis Ihrer WordPress-Installation) und kopieren Sie den folgenden Code-Schnippsel hinein:

define('FORCE_SSL_ADMIN', true);

Speichern Sie die Datei. Fall erledigt!

Erklärung des Codes
Nichts Kompliziertes: WordPress setzt eine Menge von Konstanten zur Konfiguration ein. In diesem Fall haben wir schlicht die Konstante FORCE_SSL_ADMIN definiert und Ihren Wert auf true gesetzt. Als Resultat dieser Aktion verwendet WordPress SSL.

Quelle

3. Verwenden Sie .htaccess zum Schutz von wp-config

Screenshot

Das Problem
Als WordPress-Anwender werden Sie vermutlich wissen, wie wichtig die Datei wp-config.php ist. Diese Datei beinhaltet alle erforderlichen Informationen für den Zugriff auf Ihre wertvolle Datenbank: Anwendername, Passwort, den Namen des Servers und so weiter. Der Schutz der wp-config.php ist entscheidend. Warum setzen Sie dafür nicht den Apache-Server ein?

Die Lösung
Die Datei .htaccess befindet sich im Root Ihrer WordPress-Installation. Nachdem Sie eine Sicherheitskopie angelegt haben (die Datei ist so wichtig, dass Sie vom aktuellen Stand stets übere eine Sicherung an einem sicheren Ort verfügen sollten) öffnen Sie die Datei und fügen Sie diesen Zeilen ein:

<files wp-config.php>
order allow,deny
deny from all
</files>

Erklärung des Codes
.htaccess-Dateien sind sehr mächtig und eines der besten Werkzeuge, um unerwünschten Zugriff auf Ihre Dateien zu verhindern. Mit diesem Code haben wir eine Regel erstellt, die jeglichen Zugriff auf die Datei wp-admin.php verhindert, was wiederum gewährleistet, dass böse Bots nicht darauf zugreifen können.

Quelle

4. Setzen Sie unerwünschte Benutzer und Bots auf die schwarze Liste

Screenshot

Das Problem
Dies gilt gleichermaßen fürs virtuelle wie für das reale Leben: Jemand, der Sie heute belästigt, wird Ihnen morgen vermutlich wieder auf die Pelle rücken. Haben Sie schon einmal bemerkt, wie viele Spambots zehnmal täglich wiederkehren, um Ihr Blog mit nervigen Kommentaren zu füllen? Die Lösung dieses Problems ist sehr einfach: Verbieten Sie ihnen den Zugang zu Ihrem Blog.

Die Lösung

Kopieren Sie den folgenden Code in Ihre .htaccess-Datei im Root-Verzeichnis Ihrer WordPress-Installation. Wie bereits erwähnt – machen Sie vor Änderungen stets eine Sicherheitskopie der .htaccess. Außerdem: Vergessen Sie nicht, die in Zeile 4 genannte IP-Adresse durch diejenige zu ersetzen, die Sie sperren wollen:

<Limit GET POST PUT>
order allow,deny
allow from all
deny from 123.456.789
</LIMIT>

Erklärung des Codes
Apache ist sehr wirkungsvoll und lässt sich einfach dafür nutzen, unerwünschte Menschen und Bots von Ihrer Website fern zu halten. Mit dem vorherigen Code weisen wir Apache an, mit Ausnahme der IP-Adresse 123.456.789 jedermann den Besuch unseres Blogs zu erlauben.

Um weitere Anwender auszusperren, fügen Sie einfach die vierte Zeile des oben abgebildeten Codes mit der jeweiligen IP-Adresse in eine neue Zeile ein, wie im folgenden Beispiel:

<Limit GET POST PUT>
order allow,deny
allow from all
deny from 123.456.789
deny from 93.121.788
deny from 223.956.789
deny from 128.456.780
</LIMIT>

Quelle

5. Schützen Sie Ihr WordPress-Blog vor Script Injection

Screenshot

Das Problem

Der Schutz dynamischer Websites ist besonders wichtig. Die meisten Entwickler schützen zwar immer ihre GET- und POST-Abfragen. Aber manchmal ist das nicht genug. Sie sollten Ihren Blog auch gegen so genannte Script Injections schützen und jegliche Versuche von außen, die PHP-Variablen GLOBALS und _REQUEST zu ändern, abwehren.

Die Lösung
Der folgende Code blockiert Script Injections und jegliche Änderungsversuche der PHP-Variablen GLOBALS und _REQUEST. Kopieren Sie ihn in die .htaccess (die Datei befindet sich im Root-Verzeichnis Ihrer WordPress-Installation). Denken Sie an die Sicherheitskopie der .htaccess-Datei.

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule ^(.*)$ index.php [F,L]

Erklärung des Codes
Dank der Möglichkeiten von .htaccess, können Sie Anfragen kontrollieren. Mit dem obigen Code wird geprüft, ob die Anfrage ein <script>-Tag enthält und ob mit diesem Script die PHP-Variablen GLOBALS oder _REQUEST geändert werden sollen. Falls eine dieser Bedingungen erfüllt ist, wird die Anfrage blockiert und der Server gibt eine 403-Fehlermeldung an den Client-Browser aus.

Quellen

6. Legen Sie Content-Klauern das Handwerk

Screenshot

Das Problem
Sobald Ihr Blog sich eines noch so kleinen Bekanntsheitsgrads erfreut, werden irgendwelche Leute versuchen, Ihre Inhalte ohne Ihr Einverständnis zu nutzen. Eines der größten Probleme ist das so genannte hot-linking auf Ihre Bilddateien, was die Übertragungsraten Ihres Servers schwächt.

Die Lösung
Um Ihren Blog vor hot-linking und Content-Klau zu schützen, kopieren Sie den folgenden Code in Ihre .htaccess-Datei im Root-Verzeichnis Ihrer WordPress-Installation. Wie bereits erwähnt - machen Sie vor Änderungen stets eine Sicherheitskopie der .htaccess.

RewriteEngine On
#Replace ?mysite\.com/ with your blog url
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mysite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
#Replace /images/nohotlink.jpg with your "don't hotlink" image url
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

Sobald Sie die geänderte Datei gespeichert haben, wird nur noch Ihre Website in der Lage sein, auf Ihre Bilder zu verlinken. Oder – um es ganz korrekt auszudrücken – niemand wird mehr auf Ihre Bilder verlinken, weil es zu kompliziert und zu zeitaufwändig ist. Andere Websites werden automatisch das Bild nohotlink.jpg anzeigen. Tipp: Sie können auch ein nicht vorhandenes Bild festlegen, so dass beim Versuch, auf Ihre Bilddateien zu verlinken, einfach nichts angezeigt wird.

Erklärung des Codes

Mit diesem Code fragen wir zuerst ab, ob die anfragende URL mit der URL Ihres eigenen Blogs übereinstimmt und dass der Referrer nicht leer ist. Falls die URLs nicht übereinstimmen, und falls die Datei eine Endung wie JPG, GIF, BMP oder PNG enthält, wird statt des Links das nohotlink-Bild ausgegeben.

Quelle

7. Schützen Sie Ihr Blog mit einem Plugin vor bösartigen URL-Anfragen

Screenshot

Das Problem
Hacker und andere Übeltäter nutzen häufig bösartige Anfragen, um die Schwachpunkte Ihres Blogs anzugreifen. WordPress hat standardmäßig einen guten Schutz; Sie können ihn jedoch noch ausbauen.

Die Lösung
Kopieren Sie den folgenden Code in eine Textdatei und speichern Sie diese als blockbadqueries.php. Laden Sie die Datei anschließend in das Verzeichnis wp-content/plugins Ihrer WordPress-Installation und aktivieren Sie die Datei wie jedes andere Plugin. Schon ist Ihr Blog vor bösartigen Anfragen geschützt.

<?php
/*
Plugin Name: Block Bad Queries
Plugin URI: http://perishablepress.com/press/2009/12/22/protect-wordpress-against-malicious-url-requests/
Description: Protect WordPress Against Malicious URL Requests
Author URI: http://perishablepress.com/
Author: Perishable Press
Version: 1.0
*/

global $user_ID; 

if($user_ID) {
  if(!current_user_can('level_10')) {
    if (strlen($_SERVER['REQUEST_URI']) > 255 ||
      strpos($_SERVER['REQUEST_URI'], "eval(") ||
      strpos($_SERVER['REQUEST_URI'], "CONCAT") ||
      strpos($_SERVER['REQUEST_URI'], "UNION+SELECT") ||
      strpos($_SERVER['REQUEST_URI'], "base64")) {
        @header("HTTP/1.1 414 Request-URI Too Long");
	@header("Status: 414 Request-URI Too Long");
	@header("Connection: Close");
	@exit;
    }
  }
}
?>

Erklärung des Codes

Dieser PHP-Code prüft Anfragen auf extrem lange Strings mit mehr als 255 Zeichen sowie auf das Vorhandensein der PHP-Funktionen eval oder base64. Falls eine dieser Bedingungen zutrifft, sendet das Plugin eine 414-Fehlermeldung an den Browser des Clients.

Quelle

8. Entfernen Sie die Versionsnummer von WordPress … Wirklich!

Screenshot

Das Problem
Wie Sie vermutlich wissen, gibt WordPress die Nummer der verwendeten Version im Kopf der Blog-Datei aus. Das ist relativ harmlos, solange Ihr Blog immer die jüngste Version benutzt (was Sie vermutlich ohnehin tun). Falls Ihr Blog aus irgend einem guten Grund jedoch nicht die neueste Version benutzt (etwa um “Kinderkrankheiten” der Neuentwicklung abzuwarten), gibt WordPress die Versionsnummer trotzdem aus. Damit bekommen Hacker eine wirklich wichtige Information.

Die Lösung
Kopieren Sie die folgende Code-Zeile in die Datei functions.php Ihres WordPress-Themes. Speichern Sie die Datei, aktualisieren Sie Ihren Blog – et voilà: Der Header erscheint ohne WordPress-Versionsnummer.

remove_action('wp_head', 'wp_generator');

Erklärung des Codes
Zum Ausführen bestimmter Aktionen, verwendet WordPress eine Methode namens hooks. Die Funktion wp_generator, die für die Ausgabe der WordPress-Versionsnummer verantwortlich ist, wird damit “ge-hooked”. SIe können diesen Mechanismus entfernen und dessen Ausführung verhindern, indem Sie die Funktion remove_action() einsetzen.

Quelle

9. Ändern Sie den Standardnamen “Admin”

Screenshot

Das Problem
Brutale Gewalt ist das probateste Mittel, um ein Passwort zu knacken. Die Methode ist einfach: Man probiere so viel verschiedene Passwörter wie möglich und finde dabei das richtige. Die Anwender dieser Methode verwenden dazu Wörterbücher, die ihnen eine Menge Passwort-Kombinationen liefern.

Die Kenntnis Ihres Benutzernamens erleichtert dieses Trial-and-Error-Verfahren dennoch erheblich. Aus diesem Grund sollten Sie den für die Rolle des Administrators standardmäßig vergebenen Benutzernamen “admin” stets in etwas weniger Offensichtliches ändern.

Hinweis: Mit WordPress 3.0 lässt Sie standardmäßig den gewünschten Benutzernamen auswählen. Dieser Tip ist also auch dann nützlich, wenn Sie in der aktuellen WordPress-Version noch mit einem den “admin”-Account aus einer vorherigen Version arbeiten.

Die Lösung
Sofern Sie den Benutzernamen “admin” noch nicht geändert haben, senden Sie die folgende SQL-Abfrage an Ihre Datenbank, um das Thema ein für allemal zu erledigen. Ersetzen “Your New Username” durch einen beliebigen Benutzernamen.

UPDATE wp_users SET user_login = 'Your New Username' WHERE user_login = 'Admin';

Erklärung des Codes
Benutzernamen werden in der Datenbank gespeichert. Zum Ändern genügt eine einfache  UPDATE-Anfrage. Beachten Sie, dass diese Anfrage Posts, die unter dem Benutzernamen “admin” verfasst wurden, dem neuen Benutzernamen nicht zugeordnet werden. Weitere Informationen dazu finden Sie unter dem folgenden Link.

Quelle

10. Verhindern Sie das Aufrufen Ihrer Verzeichnisse

Screenshot

Das Problem
Standardmäßig erlauben die meisten Hosts die Anzeige des Verzeichnis. Nach der Eingabe von www.yourblog.com/wp-includes in das Adressfeld Ihres Browsers, werden alle vorhandenen Dateien des Verzeichnis’ angezeigt. Dieses ist ein definitives Sicherheitsrisiko, da ein Hacker sehen kann, wann die Dateien zuletzt geändert wurden und sich somit Zugriff verschaffen.

Die Lösung
Fügen Sie diesen Code in die Apache-Konfiguration Ihre .htaccess-Datei ein:

Options - Indexes

Beachten Sie bitte, dass es nicht genügt, die robots.txt Ihres Blogs mit Disallow: /wp* zu ergänzen. Das würde lediglich verhindern, dass Ihr wp-directory von Suchmaschinen indexiert wird; die Anzeige wird es nicht unterbinden.

Erklärung des Codes
Mit dieser kleinen Ergänzung der .htaccess-Datei verbieten Sie das Auflisten der Dateien im Verzeichnis Ihres Blogs. Über den Platzhalter *, verbieten Sie das Auflisten sämtlicher Verzeichnisse, die mit “wp-” beginnen.

Quelle

(tm)

5 Kommentare zu „10 praktische Sicherheits-Optimierungen für WordPress
  1. bluemouse am 29. Juni 2010 um 17:14

    Hi

    Danke für die Tipps aber leider scheitere ich schon an Tipp 1. Habe die Zeile kopiert und in die Datei functions.php eingefügt, scheint ja nur eine functions.php zu geben und scheinbar auch egal wo man die Zeile einfügt.

    Resultat:
    Fatal error: Call to undefined function add_filter() in /wp-includes/functions.php on line 4300

    Vielen Dank für den tollen Tipp ;)

    MfG

  2. Andreas Fuchs am 30. Juni 2010 um 11:13

    Nicht in /wp-includes/functions.php sondern in /wp-content/themes/dein-theme/functions.php einfügen ;) dann klappts wohl.

  3. [...] rest is here: 10 praktische Sicherheits-Optimierungen für WordPress Tags: [...]

  4. Manuela Müller am 2. Juli 2010 um 13:29

    @bluemouse: Entschuldige bitte die ungenaue Angabe. Innerhalb von wp-include sollte man tatsächlich gar nichts ändern.
    Gemeint war die functions.php im Verzeichnis wp-content. Wo Du den Code einfügst, ist egal – im Zweifelsfall direkt am Anfang des Scripts.

  5. Georg Bischof am 30. Juni 2013 um 07:37

    Hallo, danke für die Tipps auf dieser Seite. Einen Tipp suche ich im Internet vergeblich.
    Bei meinen WordPress-Seiten melden sich sehr häufig User an von denen klar ist das sie nicht an der Seite interessiert sind. Fast immer sind es @hotmail oder ähnliche Mailadressen. Wie kann ich diese Anmeldungen stoppen ohne die Anmeldefunktion “Jeder kann sich registrieren” zu deaktivieren. Das würde ich gerne wissen. Danke für jeden Hinweis. Gruß Georg

Ein Kommentar? Schön!

Wir freuen uns immer über Leser, die durch nützliche und konstruktive Beiträge zum Thema eine Diskussion anstoßen oder den Artikel mit weiteren Informationen anreichern. Alle Kommentare werden in diesem Sinne moderiert. Zum Kommentar-Fairplay gehört für uns auch der Einsatz von rel="nofollow". Bitte verwenden Sie zudem als Namen weder eine Domain noch ein spamverdächtiges Wort. Vielen Dank!