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 --all

Automatische 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=admin

Admin-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 -Indexes

Upload-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 -delete

Sicherheits-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 security2

SSL/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.txt

Regelmäßige Scans

# WP-CLI Security Check
wp core verify-checksums
wp plugin verify-checksums --all

Checkliste 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 korrekt

Bei 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.