
Seit dem Relaunch meiner Webseite setze ich auf Wordpress als Content Management Lösung. Da Wordpress Open-Source ist und somit jeder den Quellcode einsehen kann, habe ich bei der Verwendung sehr auf Sicherheitsaspekte geachtet. Der Zugriff auf das Backend der Webseite sollte neben dem Zugriff auf die Datenbank und den Webserver am besten geschützt sein. Fangen wir mit der ersten Möglichkeit an unseren Login-Bereich zusätzlich zu schützen
1. Schutz durch IP-Adressen-Sperrung
Per .htaccess-Datei lassen sich IP-Adressen aussperren. Im Wordpress-Wurzel-Verzeichnis eine Datei namens .htaccess per Texteditor speichern, falls noch nicht vorhanden. Mit den folgenden Zeilen sagen wir dem Webserver, dass er alle Anfragen auf die Datei wp-login.php verweigern soll. Einzig Anfragen vom Client mit der IP-Adresse 192.168.1.0 werden zugelassen. 192.168.1.0 muss durch die eigene IP-Adresse ersetzt werden. Die eigene IP-Adresse kann man z.B. auf www.wieistmeineip.de herausfinden. Weitere IP-Adressen können jeweils in einer neuen Zeile mit Allow from hinterlegt werden.
<FilesMatch "wp-login\.php">
order deny,allow
Deny from all
Allow from 192.168.1.0
</FilesMatch>
Vorteil
- relativ sicher
Nachteil
- Die Liste der freigeschalteten IP-Adressen muss bei dynamischen IP-Adressen oder Standortwechseln immer in der .htaccess-Datei erweitert werden.
2. Schutz durch .htaccess Passwortabfrage
Für den Schutz der wp-login.php brauchen wir zwei Dateien. Einmal die .htaccess und einmal eine Datei namens .htusers. In die .htaccess kommt folgender Code, der die zu schützende Datei angibt und die .htusers referenziert.
AddDefaultCharset UTF-8
AuthType Basic
AuthName "Restricted Directory"
AuthUserFile /root/wp/.htusers
# /root/wp durch Dein Wordpress Rootverzeichnis ersetzen.
<FilesMatch "wp-login\.php">
require valid-user
</FilesMatch>
Die .htusers Datei enthält den Benutzernamen getrennt durch einen Doppelpunkt vom Passwort. Das Passwort wird als Hash-String abgespeichert. Die PHP Funktion crypt() erzeugt einen solchen Hash-String aus dem Passwort im Klartext. Mit meinem Hash Generator kann man sich ganz bequem diesen verschlüsselten String generieren lassen. Sollen weitere Benutzer Zugriff auf den Login-Bereich bekommen, dann sind die weiteren Benutzer mit ihren Passwörter jeweils in einer neuen Zeile in der .htusers anzufügen.
Beispiel einer .htusers Datei:
user:$1$asWIC2aO$ddHVzFRobCru4d7G2QmHw0
Vorteil
- sicher
Nachteil
- Eine weitere Benutzername- und Passworteingabe vor der eigentlichen Anmeldung kann bei häufigen Anmeldungen lästig werden.
3. Schutz durch PHP
Die letzte der vorgestellten Möglichkeiten basiert auf einer Erweiterung des Codes der wp-login.php Datei. Durch PHP-Code, den wir am Anfang in die Datei wp-login.php durch einen Server-Side-Include einfügen, kann der Login vor unbefugtem Zugriff geschützt werden.
include( dirname(__FILE__) . '/key.php' );
Die Datei key.php wird im Wurzelverzeichnis der Wordpress-Inatallation abgelegt und enthält folgenden Code.
$__KEY = 'mein-key'; // hier Deinen Schlüssel eingeben
$hash = hash('sha256', $__KEY);
$myGET = array();
foreach ($_GET as $key => $val) {
if ($key !== 'key')
$myGET[$key] = $val;
}
if (empty($myGET)) {
if ($_GET['key'] != $__KEY) {
header('Location: /');
} else {
if (!isset($_COOKIE['key'])) {
setcookie('key', $hash, time() + 86400, '/');
}
}
}
if (!empty($myGET) && $_COOKIE['key'] != $hash) {
header('Location: /');
}
if (isset($_GET['loggedout']) && $_GET['loggedout'] == 'true' && isset($_COOKIE['key'])) {
setcookie('key', $hash, 0, '/');
}
PHP leitet alle Anfragen von wp-login.php ohne angehängten Schlüssel auf die Startseite der Webseite weiter. Ein Zugriff auf wp-login ist nur noch durch den Aufruf http://www.domain.de/wp-login.php?key=mein-key oder http://www.domain.de/wp-admin.php?key=mein-key möglich. Damit auch der Logout-Vorgang funktioniert wird beim erfolgreichen Aufruf von wp-login ein Cookie mit dem Key als SHA256-String gespeichert. Dieses wird nach Abschluss des Logout-Vorgangs wieder zerstört.
Vorteil
- Der Link zum wp-login kann mit dem Schlüssel als Lesezeichen im Browser gespeichert werden.
Nachteil
- Ein Login in das WP-Backend über http://www.domain.de/admin ist nicht mehr möglich.
- Die Änderungen können bei Updates von Wordpress überschrieben werden.