Wordpress Absichern

Ein CMS ist so sicher wie dessen schwächstes Glied. Dieser Artikel stellt einen eigenen Best Practice zum Absichern von WordPress dar. Es besteht kein Anspruch auf Vollständigkeit. Er ist für unsere Kunden zur Sensibilisierung der Sicherheitsproblematik von WordPress gedacht.

WordPress ist ein Multifunktions Content Management System und bietet dem Webdesigner unheimlich viele Möglichkeiten. Weil der Einstieg in WordPress so einfach ist, und weil WordPress manchmal sogar bereits vorinstalliert wird hat es einen enorm hohen Marktanteil. Die hohe Verbreitung und viele nicht professionell abgesicherte WordPress Systeme stellen für Hacker allerdings ein lohnenswertes Ziel dar.

Themen

  • WordPress aktualisieren
  • Hosting absichern
  • Webserver konfigurieren
  • Benutzerrechte im Dateisystem setzen
  • Die Datenbank absichern
  • Sichere Passwörter verwenden
  • SSL Verschlüsselung
  • Salts
  • Directory Browsing
  • Zugriff auf das Backend Login verhindern per Passwort schützen
  • Umbennenen des WordPress Backend Login

WordPress aktualisieren

WordPress erhält regelmäßig Updates für den Core und installierte Erweiterungen. Die Nebenversionen werden automatisch aktualisiert. Es schadet nicht, zu kontrollieren, ob auch tatsächlich die aktuellste Version installiert ist. Es hat in der Vergangenheit Probleme beim Aktualisierungsprozess gegeben. So wurde automatisch ein Update auf die Nebenversion WordPress 4.9.3 eingespielt, welche einen Bug aufwies und darauffolgende automatische Aktualisierungen verhinderte. Vertrauen ist gut, Kontrolle ist besser!

Themes und Plugins

Themes und Plugins von Drittanbietern sollten ebenfalls aktualisiert werden.
Bei der Verwendung von Drittanbieter Erweiterungen ist immer besondere Vorsicht geboten.

Hosting absichern

Eine Fail2Ban verhindert BruteForce Attacken, indem es eine IP nach 3 falsch eingegeben Passworteingaben temporär sperrt.

Direkten Zugriff auf die wp-config.php verhindern

Der Webserver kann so konfiguriert werden, dass der Webserver einen Zugriff auf die wp-config.php kategorisch unterbindet.

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

Benutzerrechte

Die Datei wp-config.php ist eine sehr wichtige Datei, weil sie mitunter die Zugriffsdaten für die Datenbank beinhaltet. Aus diesem Grund ist es ratsam, die wp-config.php ganz besonders zu schützen.
Nach der Installation von WordPress weist die Datei in der Regel die Standard Benutzerrechte 644 auf. Das ist in der Regel ausreichend, aber sicherlich nicht so sicher wie möglich. Warum verschiedene Webseiten, die sich mit der WordPress Sicherheit auseinandersetzen dennoch unnötig lasche Benutzerrechte von 644 empfehlen, wo dies doch bereits die Standard Benutzerrechte sind, bleibt unklar.

cd ~/
cd httpdocs/
chmod 400 wp-config.php

Verschieben der wp-config.php

Die Sicherheit der wp-config.php kann durch das Verschieben um eine Verzeichnisebene nach oben verbessert werden. WordPress sucht automatisch auch eine Ebene weiter oben nach dieser Datei.
Am besten ganz raus aus dem vom Webserver zu beschreibenden Verzeichnis.

Salts

“Salts” sind Zeichenstrings, die den Benutzer kontinuierlich authentifizieren. In WordPress sind Salts ein elementarer Bestandteil für die sichere Erzeugung von gültigen Cookies wie z.B. Login Cookies. Salts werden standardmäßig in der Datenbank abgelegt. Die wp-config.php ist bereits darauf vorbereitet, individuell generierte Salts darin zu hinterlegen.

define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');

In die Bereiche “put your unique phrase here” werden die neu generierten Strings eingesetzt. Achtung: erstellen Sie neue Strings, und verwenden Sie nicht die im folgenden gezeigten Salts. Diese dienen nur dem einfacheren Verständnis.

define('AUTH_KEY',         '~-3p(]f|0TD`}:o/@+7U/Uznp6e@&h{0w6m{LAWGk$=u}B+J} SCJW;@-v|(k}$%');
define('SECURE_AUTH_KEY',  'NkRX>`o-F|I5^,2aV/2n+ht_L{am^q_jXJdYLrun^hzEc;m$uIVYmNm8+R=}Q|yp');
define('LOGGED_IN_KEY',    '{Qp]-I2/M8v>Z82EQ#y ~-,js_?).]{C1az(!&U~g7k){I7-n?>F9$PE`&SA)tZB');
define('NONCE_KEY',        '(?S)(IUG|qU#HLeY-|_Nfoi+kmx|%(>9E/yw.%)BV-Bb=<h<72%G-cb?D+TB}fQG');
define('AUTH_SALT',        '3d+>TdLSHoF**~6>E4B>lRe Wc6BB|AMt7d58!t=vn=+[6dX]6ZFL`-REc#Py[6#');
define('SECURE_AUTH_SALT', '3x*fUB dVg;AIM%sQ/u|_sLVouhJ+~{[=NAf0& (U>go:&]>;+Nc~K+lP:D@&^Q+');
define('LOGGED_IN_SALT',   '2`/-K1Be`YHsG0LN- D8]i|[3-[7F0QLybR]{x]^JqY)+$y3z{G6[w*Nc~*}x`%/');
define('NONCE_SALT',       'mHDh<BTj$5Mse#p[xqG!WCk/khf7z]>}_|o`+r^Jm8E3SNA]yl{*rA{/5IV|+%a%');

Begründungsansatz

Mark Jaquith äußert sich (sinngemäß), dass die Gründe für das Festlegen der Salts in der wp-config.php zwar nicht offensichtlich sind, dieser Schritt aber durchaus sinnvoll ist. Er begründet seine Äußerung mit einem Risikosplitting. Sollte ein Angreifer Lesezugriff auf die Datenbank erhalten, so kann er nur anhand der dort abgelegten Kennwörter keine erfolgreiche Authentifizierung herstellen, weil dafür Salts benötigt werden, die sich eben nicht mehr in der Datenbank befinden. Für das Herstellen eines Login Cookies werden dann sowohl Datenbankzugriff als auch zusätzlich Dateisystemzugriff benötigt, was einen Hack enorm erschwert.

Mark Jaquith verwendet dafür eine Metapher:

If your house had two deadbolt locks on the front door, you wouldn’t keep both keys under the same rock. (Kommentar von Mark Jaquith auf vaultpress.com, 24.03.17)

Neue Salts generieren

Zugriff auf die MySQL Datenbank einschränken

Um den Angreifern den Zugriff auf die WordPress Datenbank zu erschweren, lassen wir den Zugriff auf die MySQL Datenbank nur für localhost zu. Somit Remote Logins von externen Maschinen auch dann verhindert, falls die Angreifer die wp-config.php ausgelesen haben sollten und an den Benutzernamen und das Kennwort der Datenbank gelangt sind.

Welche Dateien und Ordner sind hinsichtlich der Benutzerrechte besonders kritisch?

Das sind natürlich erst einmal Konfigurationsdateien, die Hashes und Kennwörter beinhalten wie z.B. die Datei wp-config.php, oder auch das upload/ Verzeichnis et cetera.

Security Plugins

Seien Sie vorsichtig mit der Installation von Plugins unbekannter Quelle oder unbekannter Qualität. Ein unsicheres Sicherheits-Plugin kann die Situation auch einfach nur verschlimmbessern.

Bei der Installation eines Plugins sollten Sie darauf achten, wieviele aktive Installationen vorhanden sind und wie aktiv die Pflege des Plugins durch den Entwickler ist, was sich anhand der Changelogs und der WordPress-Kompatibilität für die aktuelle Version zeigt.

Login Lockdown

Mit dem kostenlosen Plugin Login Lockdown können Sie Angreifer daran hindern, das WordPress Backend Kennwort beliebig oft einzugeben.
Der Angreifer wird nach einer festgelegten Anzahl an falsch eingegebenen Kennwörtern an einem weiteren Login Versuch gehindert, indem die IP des Rechners durch WordPress für einen (einstellbaren) Zeitraum über für weitere Loginversuche gesperrt wird.

Zugriff auf WordPress Login verhindern

Eine weitere Sicherheitsebene für den WordPress Login Bereich lässt sich über den Webserver konfigurieren. Somit muss im Falles eines Hackingversuchs ein weiterer Benutzername mit dazugehörigem Kennwort geknackt werden, um Zugang zum WordPress Backend zu erlangen. Dazu wird ein Verzeichnisschutz erzeugt. Unsere Kunden können das (wie das meiste andere auch) komfortabel im Control Panel erledigen.

Directory Browsing

Das Directory Browsing ist eine Einstellung des Webservers und ermöglicht die Auflistung des Inhalts eines Webverzeichnisses. Auch das ist im Control Panel bereits voreingestellt, aber bei Bedarf per Mausklick veränderbar.

Verschleiern der Backend Loginbereichs

Der Loginbereich kann per Webserver Redirect umgeschrieben werden. Somit laufen Zugriffe u.a. auf das Verzeichnis wp-admin/ in eine HTTP 404 Fehlerseite.

Ausführbarkeit im Verzeichnis uploads verhindern

Gelingt es einem Angreifer (über welche Schwachstelle auch immer) auf das uploads/ Verzeichnis zuzugreifen, kann dort ausführbarer Code genutzt werden um andere Dateien der WordPress Installation von innen zu manipulieren. Die folgende Angabe verbietet es dem Apache Webserver im uploads/ Verzeichnis u.a. .php Dateien auszuführen.

<FilesMatch "\.(php|phtml|php3|php4|php5|pl|py|jsp|asp|html|htm|shtml|sh|cgi|suspected)$">
    deny from all
</FilesMatch>