Sicher ? Sicherlich ! WordPress absichern.

Bei einem der Themes das ich nutzen mußte gab es Probleme zwischen zwei installierten Plugins. Eines der involvierten Plugins war ein sogenanntes Securetyplugin. Im Ergebnis war die Sicherheit im Eimer und ich stellte fest wie monströs dieses Sicherheitsplugin eigentlich war.
Ein Grund mich ein wenig auf Spurensuche zu begeben und zu Fuss das zu tun, was diese besonderen Sicherheits-Plugins sonst erledigen.
Sichere Passwörter nutzen, nicht benötigte Themes löschen, Tabellen-Präfix ändern, Authentication Unique Keys …, dies sind Dingelchens die bei einer routinierten Installation abzuspulen sind. Aber was gibt es noch ?

wp-login schützen | htaccess

Ein Top-Act, der in Regel von sehr bequemen WP-NutzerInnen zusätzliche Mühen erfordert: Sichere das Verzeichnis /wp-admin bzw. die wp-login.php mit einer htaccess und htpasswd.
Beachte: Die login.php mit einer htaccess zu sichern erzwingt doppelte PW-Eingabe bei passwortgeschützten Beiträgen.

wp-login schützen | plugin

Ob des Sinns immer wieder diskussionswürdig ist der Einsatz von Plugins wie Login LockDown (nach 2 Jahren gab es mal wieder ein Update im September 2016) oder Limit Login Attempts. Diese Plugins sorgen dafür, daß nach mehreren falschen Login-Versuchen im WP-Backend die entsprechende IP gesperrt wird. Gegen wenig ambitionierte Hacker gut einzusetzen. Jedoch kaum wenn die Attacken im sekundentakt von hunderten verschiedener IPs kommen.
Login LockDown legt zwei Tabellen in der Datenbank an. Wenn du Zeit hast kannst du dir besonders nervige IP-Bereiche aus dem protokolliertem Pool holen (und bei Bedarf sperren). Und wenn du nachschaust wirst du feststellen, das eine der Tabellen mit der Zeit recht aufgeblasen wird: Leeren.

wp-login schützen | IP sperren

Falls es klar und übersichtlich ist welche NutzerInnen das WP-Backend nutzen: Der WP-Admin Zugang ließe sich via htaccess auf bestimmte IP-Adressen (IP-Ranges) beschränken.

XML-RPC-Schnittstelle abschalten

Die XML-RPC-Schnittstelle ist ein Tool um mittels Desktop– bzw. Smartphone-Apps die Website / Artikel zu verwalten. Angeblich basieren viele Funktionen des Jetpack-Plugins auf dieser Schnittstelle. Wer zum Besipiel über ein externes Tool via XML-RPC-Schnittstelle zugreifen will, durchläuft eine zusätzliche Authentifizierung (RPC = Remote Procedure Call / entfernte Funktionsaufrufe, strukturiert mit xml). Deaktiviere mit folgendem Code in der function.php

/* Disable XMLRPC */
add_filter( 'xmlrpc_enabled', '__return_false' );

Oder über die htaccess abschalten:

#XML-RPC Schnittstelle abschalten
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>

Login error verschleiern

WP login errors in der function.php ändern:

add_filter('login_errors', create_function('$a', "return '<b>Oops!</b> its wrong';"));

Versionsnummern-Ausgabe vernebeln

Ein kleines todo für die function.php um die Versionsnummern-Ausgabe zu entfernen.
Wenn du das inkonsequent machst, kann jedoch z.B. in der readme.html selbiges von bösen Wichten ausgelesen werden kann. Schau mal hier: http://www.isitwp.com/

remove_action('wp_head', 'wp_generator');

Benutzer-Accounts vernebeln

Zur Erkennung des Benutzer-Accounts gebe in die Adresszeile des Browsers ein: meine-domain.com/?author=1. So kannst du 10 IDs durchprobieren und die dazugehörigen Nutzernamen herausfinden. Über folgenden Eintrag in die htaccess ließe sich das unterbinden:

RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ http://www.geh-weg.da/irgendwohin/? [L,R=301]

Directory Browsing prüfen

Das Directory Browsing ist bei den meisten Servern eh abgeschaltet, aber schau nach und verhindere es ggfs. In die htaccess kommen folgende zwei Zeilen:

# Prevent Directory Listings
Options -Indexes

Zugriffschutz /wp-includes

Das wp-include Verzeichnis vor Zugriffen von aussen schützen.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
<IfModule>

Mit diesem Schnippsel gibts Probleme bei multi sites. Deshalb entferne: RewriteRule ^wp-includes/[^/]+.php$ – [F,L]

Zugriffschutz /uploads

To ensure no .php files can be executed, create a .htaccess file in /wp-content/uploads containing following code (mittels Files oder FilesMatch):

<Files *.php>
deny from all
</Files>
Oder
<FilesMatch .php>
Order Deny,Allow
Deny from All
</Files>
Oder
# Ab Apache 2.4
# Disable direct access of any *.php files in /wp_content/uploads folder
<FilesMatch .php$>
Require all denied
</FilesMatch>

Zugriffschutz .htaccess

Zugriffe über die htaccess regeln – einzeln oder im Pack:

# Protect wp-config.php and other files
<FilesMatch "(.htaccess|.htpasswd|wp-config.php|liesmich.html|readme.html)">
Order deny,allow
Deny from all
</FilesMatch>

Zugriffschutz CHMOD

Nicht nur der config.php reichen im Idealfall 0400-Rechte, also nur Leserechte und nur für den Besitzer (Nicht bei allen Anbietern möglich.). Auch die htaccess muß nur lesbar sein. Hast du die volle Kontrolle über das Projekt kannst du Template Dateien oder auch eigene Plugins auf nur lesbar setzen.
Die header.php, footer.php, index.php und functions.php sind mindestens dafür interessant.

Zugriffschutz WP Backend

Wenn verhindert werden soll, daß im WP-Backend Themes und Plugins geändert werden können, schreibe in die config.php:

define('DISALLOW_FILE_EDIT', true);

Verzeichnis in work: sperren

In einem laufenden Projekt eine Seite vorübergehend via htaccess schützen, suche im Netz nach: Verzeichnisschutz für Rewrite Pfade.

Fehlermeldungen unterdrücken

Schraubst du in deinen php-files Dinge fehlerhaft zusammen erscheinen nicht nur einfache Fehlermeldungen, sondern es werden gleich die Pfade präsentiert. Teste verschiedene Möglichkeiten dies zu unterdrücken.

Via htaccess: php_flag display_errors off
Via config.php: define('WP_DEBUG', false);
Via config.php: define('WP_DEBUG_DISPLAY', false);
Via config.php: ini_set ('display_errors', 0);

Klein und kompakt

Begrenze die Anzahl der Nutzer die Zugriff auf das Backend haben. Es gibt viele Projekte bei denen sich im Laufe der Zeit überflüssige Nutzer*Innen ansammeln, entferne diese Karteileichen. Und versuche in Absprache mit dem Kunden die eingetragenen NutzerInnen mit Adminrechten zu reduzieren/begrenzen.

Um Seiten zu editieren sind keine Adminrechte notwendig. Lege dir ggfs. einen zusätzlichen Nutzer für solche Aufgaben an. Gerade wenn der Zugang unsicher erscheint (von unterwegs ?): benutze nicht den Adminzugang.

Falls es doch mal notwendig sein sollte ändere zwecks Verschleierung nachträglich den DB-Päfix, wenn er noch „wp_“ lautet. wpkrauts kommen zu dem Schluss: The database table prefix is not a security feature… It doesn’t matter what the prefix is … So why is the prefix a configuration option at all? It allows you to run more than one installation in the same database.
Benutze dafür ein Plugin oder tätige es per Hand: in der config.php den Präfix ändern, Tabellen umbenennen und vergesse nicht: Ein Update der Felder in den Tabellen „usermeta“ und „option“.

Halte die Datenbank sauber: Zur Optimierung und Bereinigung der WordPress Datenbank suche ein Plugin wie WP-Optimize oder WP Clean UP. Wenn der Kunde erste Übungen mit seinem 59-USD-Theme anstellt und du die ersten Datenbankbackups anlegst und du dich über 9MB große Datenbanken wunderst, dann prüfe in der config.php ob die Anzahl der zu speichernden Versionen wirklich so hoch sein muß: define( ‚WP_POST_REVISIONS‘, 15 );
Ganz abschalten: define(‚WP_POST_REVISIONS‘, FALSE);

Der WordPress-header lädt unzählige Funktionen. Zum abschalten suche im Netz nach Dingen wie: wordpress header bereinigen.
Oder nach: Disable the emoji’s

Cookie Checker

cookie-checker.com

Links

Inspirierend (kuketz-blog.de):
WordPress absichern
Weitere Einstellungen in der .htaccess (aka the 6G Blacklist):
perishablepress.com/6g/
Wordpress empfiehlt:
codex.wordpress.org/Hardening_WordPress
Ein wenig zum Thema Datenschutz, google-fonts und gravatare im WP-Backend:
journalismus-plus.de/generieren/spionageprogramme-in-wordpress-deaktivieren
robots.txt und Bots … nett zu lesen:
perishablepress.com/wordpress-robots-rules/
perishablepress.com/blackhole-bad-bots/

03.08.2018