Dienstag, 2. August 2011

Wordpress-Sicherheitsmaßnahme: wp-config auslagern (Schnell-Anleitung)

Anleitungen zum Sichern der wp-config.php im Rahmen der wordpress-Sicherheitsmaßnahmen.

I) Quick and Dirty

Die schnellste und einfachste Lösung, insbesondere für Anfänger:
  1. Nenne die wp-config.php um in z.B. wp-config-core.php
  2. Speichere diese einen Ordner höher, in den root Deines accounts
  3. Schreibe eine neue wp-config.php mit nachfolgendem Inhalt und speichere die Datei an der ursprünglichen Stelle ab.
<?php
include("../wp-config-core.php");
?>

Alles weitere in diesem Aufsatz können Sie im Grunde vergessen. Dies reicht.

II) Nur mysql-Daten auslagen – interessant bei mehrfachen Projekten


Das eigentlich Sicherheitsrelevante an der wp-config ist normalerweise nur der Abschnitt mit den mysql-Zugangsdaten. 

Passwörter sind anderenorts gespeichert, und die neuen Sicherheitsschlüssel sind keine Passwörter, sondern sorgen zusammen mit cookies dass während einer Sitzung immer gesichert ist, dass noch der "richtige" User mit dem Server kommuniziert.

Eine Möglichkeit ist es deshalb, nur den Abschnitt mit den reinen mysql-Daten in einen unzugänglichen Bereich auszulagern und in der wp-config.php per include einzubinden. Das ist besonders dann interessant, wenn man viele Projekte betreibt. Man belässt es dann bei der üblichen Datei wp-config.php auf der jeweiligen domain und ersetzt aber den Abschnitt mit den mysql-Zugangsdaten durch einen include-Befehl.

Original, unbearbeitet (aus wp-config.sample):



// ** MySQL Einstellungen - diese Angaben bekommst du von deinem Webhoster** //
/** Ersetze database_name_here mit dem Namen der Datenbank, die du verwenden möchtest. */
define('DB_NAME', 'database_name_here');

/** Ersetze username_here mit deinem MySQL-Datenbank-Benutzernamen */
define('DB_USER', 'username_here');

/** Ersetze password_here mit deinem MySQL-Passwort */
define('DB_PASSWORD', 'password_here');

/** Ersetze localhost mit der MySQL-Serveradresse */
define('DB_HOST', 'localhost');

Original, bearbeitet, so wie es in der endgültigen wp-config.php erscheinen sollte:


// ** MySQL Einstellungen - diese Angaben bekommst du von deinem Webhoster** //

define('DB_NAME', 'tramezzinoprojekte1');
define('DB_USER', 'burkes');
define('DB_PASSWORD', 'supergeheim');
define('DB_HOST', 'localhostodersonstwas');

Variante mit ausgelagerten SQL-Daten


Der ganze obere Abschnitt wird ersetzt durch folgende Zeile:

include("../mysqldaten.inc");

Wie man sieht, ist die Datei "mysqldaten.inc"  einen Ordner höher abgespeichert, also im echten "root" des Servers hinterlegt. Dort kommt der User über den Browser nie hin.

Die Datei mysqldaten.inc enthält dann den eingangs genannten Abschnitt,

define('DB_NAME', 'tramezzinoprojekte1');
define('DB_USER', 'burkes');
define('DB_PASSWORD', 'supergeheim');

define('DB_HOST', 'localhostodersonstwas');


III) wp-config über htaccess sichern


Das ist m.E. was für Fortgeschrittene und selbst diese werden eher auf die eingangs genannten Varianten zurück greifen.

Vorgehensweise: über eine im gleichen Ordner liegende Datei namens ".htaccess" wird der direkte Browserzugriff unterbunden. Die wp-config.php kann deshalb nur von den WordPress-Skripten per include-Befehl verwendet werden, aber nicht direkt aufgerufen werden.

Dazu muss man in die (notfalls neu anzulegende) .htaccess folgenden Abschnitt einfügen:

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

Mit der Bedeutung brauchen Sie sich nicht zu beschäften, das ist schade um die Zeit.
Im übrigen rate ich komplett von dieser Sicherungsmethode ab. Es ist unnötige Arbeit und hat folgende Nachteile:
  • Für den Anfänger ist die Einarbeitung in den Umgang mit .htaccess-Dateien  mühsam bis qualvoll. Die Vielzahl von Tutorials im Internet zeugen davon.
     
  • Sofern bereits aus anderen Gründen eine htaccess-Datei existiert, muss sie um einen Abschnitt erweitert werden, der diesen Zugriff auf wp-config.php regelt. Das ist nicht schlimm, aber wenn im Laufe der Zeit öfter mal was zu ändern ist, muss man immer daran denken, dass auch dieser Abschnitt nicht vergessen wird. Besonders ärgerlich beim Lesen fertiger Anleitungen über htaccess-Modifikationen. Das ist selbst für Fortgeschrittene lästig.
Ein Auslagern und Einbinden per include reicht völlig aus. Dem Fortgeschrittenen leuchtet es ein, dem noch zweifelnden Anfänger sei es erklärt: Die Zugangsdaten zur Datenbank (meist eine mysql-Datenbank) und meinetwegen auch andere Werte in der config.php dürfen nicht bekannt werden. Normalerweile kann die Datei nicht direkt über den Browser aufgerufen werden, da der Aufruf einer Datei mit Endung.php nicht dazu führt, dass man den INHALT der Datei LESEN kann. Dafür sorgen die üblichen Sicherheitseinstellungen auf den Servern (für Fortgeschrittene: die Sicherheitseinstellungen im APACHE oder XITAMI etc, beim APACHE wären dies Einstellungen in der httpconf).

Es kann nun sein, dass bei Wartungsarbeiten, z.B. anlässlich des Updates auf neueste APACHE-Versionen oder aus anderen Gründen, kurzfristig dieser Sicherungsmechanismus nicht eingeschaltet ist oder, schlimmer, versehentlich dauerhaft ausgeschaltet wurde, ohne dass es die Angestellten gleich merken. Vorübergehend kann dann jemand, der über den Browser die wp-config.php aufruft, den Inhalt wie bei einer Textdatei lesen. Darum geht es hier, und nur darum.
Sicherungsmaßnahmen zur Vermeidung einer solchen Panne sind übrigens durchaus nicht paranoid, wie ein Anfänger meinen könnte, sondern sinnvoll und geboten. Für den Anfänger reicht die oben unter römisch eins geschilderte Maßnahme aus.
Annex: was bedeutet DEFINE

Für obige Anleitung ist es nicht unbedingt notwendig zu wissen, was das DEFINE bedeutet. Es ist aber sinnvoll, da man das Wissen immer wieder benötigen kann. Ein paar PHP-Grundkenntnisse setze ich voraus
Normalerweise werden in den Skripten Variable gesetzt, möglichst zu Beginn eines Skripts. Z.B. $domain="burkes.de", $user="burkes"; $mysqlhost="localhost", $mysqlpasswort="90345720", $uploadordner="/files/uploads" usw.
Dann werden im Skript an gegebenen Stellen diese Variablen verwendet.
Statt Variablen kann man aber auch mit Konstanten arbeiten. Diese sind auch so was wie Variablen, aber viel stärker, so 'ne Art Supervariablen. Konstanten werden nicht so wie Variable definiert. Vergleich:
Variable: $DB_PASSWORD = "supergeheim";
Konstante: define("DB_PASSWORD", "supergeheim");
Was als Konstante definiert ist, kann auch als normale Variable ausgelesen werden.
if($DB_PASSWORD=="supergeheim") echo "na super, geh' heim!";
Zwei wichtige Vorteile der Konstanten sollte man kennen, wenn man mehr mit php programmieren will:
  • die Konstanten können NIE über Browser-Parameter rein geschmuggelt werden.
Sie müssen fest im Skript definiert werden, können sich zwar im Laufe des Skripts ändern, können aber nicht von außen herein getragen werden. Egal, wie safe_mod verwendet wird, egal, ob Variable ausreichend sicher initialisiert wurden: es kann zu keiner Manipulationspanne kommen. Nicht möglich also: www.deinedomain.de/index.php?DB_PASSWORD=blablabla

  • die Konstanten sind auch innerhalb von Funktionen da, ohne dass sie über "global" globalisiert, also in die funktion hinein getragen werden müssen. Konstante sind superglobal.
An Letzteres wenn ich doch früher gedacht hätte, also ich vor vielen Jahren ein Standardproblem mit dem FCK-Editor lösen musste. Eine Administration (nicht unbedingt wordpress) mit FCK-Editor, zu verwenden für verschiedene Projekte. Ich habe dann die Lösung mit Session-Variablen übernommen, von der ich las, heute denke ich mir, dass das alles ein Klacks gewesen wäre, wenn ich die superglobalen Konstanten verwendet hätte. Ich glaube, letzteres ist in der Forums-Literatur auch nie so richtig aufgedeckt worden (siehe auch meine Notizen auf: http://www.user-archiv.de/fckeditor.html#abschnitt_299; der Stand ist allerdings nicht mehr der Aktuelleste, denn ich habe in den letzten zwei Jahren diese Seite nicht mehr gepflegt)

Weitere Sicherheitsmaßnahmen


Diese Anleitung hat nur die Auslagerung der wp-config.php behandelt. Es gibt noch weitere Maßnahmen. Aufsätze finden Sie z.B. unter

  © Blogger template 'Fly Away' by Ourblogtemplates.com 2008

Back to TOP