WordPress betreibt über 40% aller Websites – und ist damit ein beliebtes Ziel für Angriffe. Mit den richtigen Maßnahmen machen Sie es Hackern schwer.
Grundlegende Sicherheit
1. WordPress und Plugins aktuell halten
# WP-CLI Updates prüfen
wp core check-update
wp plugin list --update=available
wp theme list --update=available
# Alles aktualisieren
wp core update
wp plugin update --all
wp theme update --allAutomatische Updates aktivieren:
// wp-config.php
// Kleine Updates automatisch
define('WP_AUTO_UPDATE_CORE', 'minor');
// Oder alle Updates
define('WP_AUTO_UPDATE_CORE', true);2. Starke Passwörter
- Mindestens 16 Zeichen
- Buchstaben, Zahlen, Sonderzeichen
- Für jeden Dienst einzigartig
- Passwort-Manager nutzen
3. Benutzer-Audit
# Benutzer mit Admin-Rechten auflisten
wp user list --role=administrator
# Ungenutzte Accounts entfernen
wp user delete benutzername --reassign=adminAdmin-Bereich schützen
Login-URL ändern
Mit Plugin (z.B. WPS Hide Login) oder manuell via Nginx:
# Login-Seite umbenennen
location /wp-login.php {
return 404;
}
location /geheimer-login {
rewrite ^/geheimer-login$ /wp-login.php last;
}Login-Versuche begrenzen
// wp-config.php
define('WP_LIMIT_LOGIN_ATTEMPTS', true);Oder mit Plugin: Limit Login Attempts Reloaded
2-Faktor-Authentifizierung
Empfohlene Plugins:
- Two Factor Authentication
- Wordfence Security
- Google Authenticator
XML-RPC deaktivieren
XML-RPC ist oft Ziel für Brute-Force-Angriffe:
// functions.php
add_filter('xmlrpc_enabled', '__return_false');Oder via .htaccess:
<Files xmlrpc.php>
Require all denied
</Files>Nginx:
location = /xmlrpc.php {
deny all;
}REST-API einschränken
// functions.php
add_filter('rest_authentication_errors', function($result) {
if (!is_user_logged_in()) {
return new WP_Error('rest_forbidden', 'REST API restricted', ['status' => 403]);
}
return $result;
});wp-config.php absichern
Sicherheitsschlüssel
// Einzigartige Schlüssel generieren:
// https://api.wordpress.org/secret-key/1.1/salt/
define('AUTH_KEY', 'einzigartige-zufallszeichen');
define('SECURE_AUTH_KEY', 'einzigartige-zufallszeichen');
define('LOGGED_IN_KEY', 'einzigartige-zufallszeichen');
define('NONCE_KEY', 'einzigartige-zufallszeichen');
define('AUTH_SALT', 'einzigartige-zufallszeichen');
define('SECURE_AUTH_SALT', 'einzigartige-zufallszeichen');
define('LOGGED_IN_SALT', 'einzigartige-zufallszeichen');
define('NONCE_SALT', 'einzigartige-zufallszeichen');Datei-Bearbeitung deaktivieren
// Theme/Plugin-Editor im Admin deaktivieren
define('DISALLOW_FILE_EDIT', true);
// Auch Installationen verhindern
define('DISALLOW_FILE_MODS', true);Debug im Produktivbetrieb deaktivieren
define('WP_DEBUG', false);
define('WP_DEBUG_LOG', false);
define('WP_DEBUG_DISPLAY', false);Tabellen-Präfix ändern
Bei Neuinstallation anderen Präfix als wp_ verwenden:
$table_prefix = 'blog7x_';wp-config.php schützen
# .htaccess
<Files wp-config.php>
Require all denied
</Files>location ~ /wp-config\.php$ {
deny all;
}Dateisystem absichern
Berechtigungen
# Verzeichnisse: 755
find /var/www/html -type d -exec chmod 755 {} \;
# Dateien: 644
find /var/www/html -type f -exec chmod 644 {} \;
# wp-config.php: strenger
chmod 600 /var/www/html/wp-config.php.htaccess schützen
# .htaccess
<Files .htaccess>
Require all denied
</Files>Verzeichnis-Listing deaktivieren
Options -IndexesUpload-Verzeichnis absichern
# wp-content/uploads/.htaccess
<FilesMatch "\.(php|php7|phtml)$">
Require all denied
</FilesMatch>location ~* /wp-content/uploads/.*\.php$ {
deny all;
}Wichtige Dateien blockieren
# Sensible Dateien blockieren
location ~ /\. {
deny all;
}
location ~* /(wp-config\.php|readme\.html|license\.txt)$ {
deny all;
}
location ~* /wp-includes/.*\.php$ {
deny all;
}
location ~* /wp-content/.*\.php$ {
# Erlaubt nur bestimmte Theme/Plugin-PHP
deny all;
}Datenbank absichern
Dedizierter Benutzer
-- Neuen Benutzer nur für diese WordPress-Instanz
CREATE USER 'wp_example'@'localhost' IDENTIFIED BY 'starkes_passwort';
GRANT SELECT, INSERT, UPDATE, DELETE ON wp_example.* TO 'wp_example'@'localhost';
FLUSH PRIVILEGES;Keine GRANT-Rechte, DROP-Rechte etc.
Regelmäßige Backups
# Tägliches Datenbank-Backup
mysqldump -u backup_user -p wordpress_db | gzip > /backups/wp_$(date +%Y%m%d).sql.gz
# Alte Backups löschen (älter als 30 Tage)
find /backups -name "wp_*.sql.gz" -mtime +30 -deleteSicherheits-Plugins
Empfehlenswert
| Plugin | Funktion | |--------|----------| | Wordfence | Firewall, Scanner, Login-Schutz | | Sucuri Security | Scanner, Härtung, WAF | | iThemes Security | Umfassende Härtung | | All In One WP Security | Anfängerfreundlich |
Wordfence Grundkonfiguration
1. Firewall aktivieren (Extended Protection) 2. Brute Force Protection einschalten 3. 2FA aktivieren 4. Malware-Scan planen
Webserver-Level Schutz
Rate Limiting (Nginx)
# In http-Block
limit_req_zone $binary_remote_addr zone=wordpress:10m rate=1r/s;
# In server-Block
location /wp-login.php {
limit_req zone=wordpress burst=3 nodelay;
# ... Rest der Config
}Fail2ban für WordPress
# /etc/fail2ban/jail.d/wordpress.conf
[wordpress]
enabled = true
port = http,https
filter = wordpress
logpath = /var/log/nginx/access.log
maxretry = 5
bantime = 3600# /etc/fail2ban/filter.d/wordpress.conf
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php
ignoreregex =ModSecurity (Apache)
apt install libapache2-mod-security2
a2enmod security2SSL/HTTPS erzwingen
// wp-config.php
define('FORCE_SSL_ADMIN', true);
// URLs anpassen
define('WP_HOME', 'https://example.com');
define('WP_SITEURL', 'https://example.com');Monitoring und Logging
WordPress-Aktivitäten loggen
Plugin: WP Activity Log
Datei-Änderungen überwachen
# Checksumme erstellen
find /var/www/html -type f -exec md5sum {} \; > /root/wp-checksums.txt
# Später vergleichen
find /var/www/html -type f -exec md5sum {} \; | diff - /root/wp-checksums.txtRegelmäßige Scans
# WP-CLI Security Check
wp core verify-checksums
wp plugin verify-checksums --allCheckliste WordPress-Sicherheit
□ WordPress, Plugins, Themes aktuell
□ Ungenutzte Plugins/Themes entfernt
□ Starke Passwörter für alle Benutzer
□ Admin-Benutzername nicht "admin"
□ 2-Faktor-Authentifizierung aktiv
□ Login-Versuche begrenzt
□ XML-RPC deaktiviert
□ Datei-Editor deaktiviert
□ wp-config.php geschützt
□ Uploads-Ordner: kein PHP
□ Regelmäßige Backups
□ SSL/HTTPS aktiv
□ Sicherheits-Plugin installiert
□ Datei-Berechtigungen korrektBei Hack: Erste Hilfe
1. Seite offline nehmen (Maintenance-Modus) 2. Passwörter ändern (WP, FTP, DB, Hosting) 3. Backup wiederherstellen (vor dem Hack) 4. WordPress neu installieren (Core-Dateien) 5. Alle Plugins/Themes prüfen (oder neu installieren) 6. Malware-Scan durchführen 7. Sicherheitslücke finden und schließen 8. Monitoring einrichten
Fazit
WordPress-Sicherheit ist keine einmalige Aktion, sondern ein kontinuierlicher Prozess. Updates sofort einspielen, starke Passwörter verwenden, unnötige Funktionen deaktivieren und regelmäßig Backups erstellen. Ein gutes Sicherheits-Plugin wie Wordfence bietet zusätzlichen Schutz. Bei sensiblen Projekten gehört auch eine Web Application Firewall (WAF) zur Grundausstattung.