Grundsätzliches
- WordPress, die verwendeten Themes und Plugins aktuell halten (Updates einspielen).
- Ungenutzte Themes und Plugins löschen.
- Sichere Passwörter verwenden.
- Nutzern nur die Rechte zuweisen, die sie auch benötigen. Ggf. einen zusätzlichen Zugang mit eingeschränkten Rechten für redaktionelle Arbeit außerhalb des Heimnetzes nutzen.
- Ungenutzte Nutzer-Accounts löschen oder Rolle in Abonnent ändern.
Plugin mit diversen Sicherheitsmaßnahmen
/*
Plugin Name: Sicherheitsmaßnahmen
Description: Login-Fehlermeldungen verändern, Dateibearbeitungen unterbinden, WordPress-Version komplett und Aktualisierungshinweise für Nicht-Admins verbergen.
Version: 1.0
*/
// Login-Fehlermeldung ohne Hinweis auf falsches Passwort bzw. falschen Nutzernamen ausgeben
function failed_login () {
return 'Die eingegebenen Anmeldungs-Daten sind nicht korrekt.’ }
add_filter ( 'login_errors', 'failed_login' );
// Bearbeitung von Dateien via Administrationsbereich unterbinden
define ( 'DISALLOW_FILE_EDIT', true );
function remove_wp_version () { return ''; }
add_filter ( 'the_generator', 'remove_wp_version' );
// Aktualisierungshinweis nur für Admins in Singlesite-Umgebung bzw. nur für Superadmins in Multisite-Umgebung
add_action(
'plugins_loaded',
function () {
if (( is_multisite() && !current_user_can('manage_network') ) || ( !is_multisite() && !current_user_can('create_users'))) {
add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 );
add_filter( 'pre_option_update_core', create_function( '$a', "return null;" ) );
add_filter( 'pre_site_transient_update_core', create_function( '$a', "return null;" ) );
}
}
);
// Falls SSL verfügbar: Anmeldung über sicherere Verbindung erzwingen
// define('FORCE_SSL_ADMIN', true);
Einstellungen im Administrationsbereich
- Unter Einstellungen > Allgemein „Jeder kann sich registrieren“ deaktivieren (WordPress MU: Unter Seite editieren „User Can Register“ Wert „0“ zuweisen)
- Unter Einstellungen > Allgemein Standardrolle eines neuen Benutzers „Registrierter Leser“ (WordPress MU: Unter Seite editieren „Default User Role“ Wert „Subscriber“ zuweisen)
Zugriffsbeschränkungen über die .htaccess-Datei
Der Zugriff auf die Dateien .htaccess, ggf. htpasswd, wp-config.php sollte generell von außerhalb des Servers nicht nötig sein, und deswegen unterbunden werden. Die readme.html bzw. liesmich.html verrät potenziellen Angreifern die – ggf. bei noch ausstehender Aktualisierung veraltete – WordPress-Version. Das Deaktivieren der xmlrpc.php kann zusätzliche Sicherheit bringen, verhindert aber Track- und Pingpacks und den Zugriff über Drittdienste.
<FilesMatch "(.htaccess|.htpasswd|wp-config.php|readme.html|liesmich.html|xmlrpc.php)">
order deny,allow
deny from all
</FilesMatch>
IPs, von denen BruteForce-Attacken bekannt sind, sollten mindestens von der wp-login.php ausgesperrt werden.
<Files wp-login.php>
Order deny,allow
deny from 00.00.00.00
</Files>
Eine regelmäßig aktualisierte Liste „gefährlicher“ IP-Adressen gibts es im Blog von mkln.org. Die Funktion der IP-Sperre kann ggf. mit der eigenen IP überprüft werden. Alternativ bzw. erweiternd gibt es die 6G-Blacklist oder das Plugin BBQ: Block Bad Queries.
Sicherheitsrelevante Plugins
- Die Anzahl der möglichen fehlgeschlagenen Login-Versuche kann z. B. mit Limit Login Attempts beschränkt werden.
- Die Einbindung von Google-Fonts im Backend kann z. B. durch Disable Google Fonts verhindert werden. Das verbessert übrigens auch die Performance des Administrationsbereichs.
- Mit dem Wordfence Security Plugin lassen sich umfangreiche Vorkehrungen treffen und etwa missglückte Logins überwachen. Auf das Limit Login Attempts-Plugin kann bei entsprechender Konfiguration dann verzichtet werden.
wp-config.php
Der Dateieditor im Administrationsbereich sollte deaktiviert werden. Gelangt ein Angreifer in den Administrationsbereich (z.B. durch ein schwaches Passwort einer Person mit Administrator-Rechten), kann er nicht über den Editor Plugins und Themes bearbeiten.
define( 'DISALLOW_FILE_EDIT', true );
Insofern SSL verfügbar ist, sollte der Login in den Administrationsbereich über SSL erzwungen werden.
define( 'FORCE_SSL_ADMIN', true );
Referenzen & Weiterführendes