WordPress absichern: wp-admin schützen | Login-URL ändern, Login-Versuche begrenzen, XML-RPC

wp-admin-Sicherheit umfasst die Einstellungen, die Brute-Force-Angriffe über den WordPress-Adminbereich und die Login-Seite abwehren. Die Zugriffslogs eines Nginx + Apache-Servers mit mehreren WordPress-Websites zeigten, dass automatische Anfragen an xmlrpc.php auch nach dem Ändern der Login-URL weiterliefen – deshalb habe ich zusätzlich ein Rate Limit auf dem Server eingerichtet.
1️⃣ Warum wp-admin und wp-login.php angegriffen werden
Dass die WordPress-Adminadresse allgemein bekannt ist, ist eine Schwachstelle, die sich aber durch mehr Sicherheit ausgleichen lässt. Jede WordPress-Website nutzt dasselbe /wp-admin/ und [wp-login.php], und wer /wp-admin/ ohne Login öffnet, landet auf der Login-Seite [wp-login.php].
Angriffe kommen als Brute Force: Auf dieser Login-Seite werden immer wieder Benutzernamen und Passwörter ausprobiert. Deshalb geht es bei der wp-admin-Sicherheit zuerst darum, Login-Versuche zu stoppen, nicht darum, die Adresse zu verstecken.
2️⃣ Was das Ändern der Login-URL bringt und was nicht
Änderst du die Login-URL mit einem Sicherheits-Plugin, liefert das Standard-[wp-login.php] einen 404, und automatische Angriffe auf die Standardadresse erreichen die Login-Seite nicht mehr. Die neue Adresse musst du allen mit Adminkonto separat mitteilen.
Diese Methode macht wenig Arbeit, aber vergisst du die neue Adresse, kommst du nicht mehr in den Adminbereich und musst den Ordner des Plugins per FTP oder Dateimanager umbenennen, um es zu deaktivieren. Wird die Website von mehreren Personen verwaltet, notierst du die Adresse am besten an einer Stelle.
3️⃣ Login-Versuche begrenzen und Zwei-Faktor-Authentifizierung
Auch nach dem Ändern der Login-URL gehen die Versuche, Passwörter zu erraten, weiter, sobald die neue Adresse bekannt wird. WordPress selbst begrenzt fehlgeschlagene Logins nicht – egal wie oft ein falsches Passwort eingegeben wird, öffnet sich wieder dieselbe Login-Seite.
Ein Plugin zur Begrenzung der Login-Versuche sperrt eine IP für eine bestimmte Zeit, sobald sie die erlaubte Zahl überschreitet, und die Zwei-Faktor-Authentifizierung verlangt auch bei richtigem Passwort zusätzlich einen Code aus der Authenticator-App auf dem Handy. Bewahre beim Einschalten auch Backup-Codes für den Fall auf, dass du das Handy verlierst.
4️⃣ xmlrpc.php schließen
[xmlrpc.php] ist ein zweiter Zugang, der Benutzername und Passwort ohne Login-Seite annimmt; mit der Methode [system.multicall] lassen sich in einer Anfrage mehrere Passwörter testen.
Die Zugriffslogs eines Nginx + Apache-Servers mit mehreren WordPress-Websites zeigten am 13. Oktober zwischen 0 und 9:50 Uhr 2.250 POST-Anfragen an [xmlrpc.php]. Sie kamen von 22 IPs, und der User-Agent gab sich als Jetpack und WordPress.com aus.
Nutzt du weder die WordPress-App noch Jetpack, sperrst du Anfragen an [xmlrpc.php] in der Nginx-Konfiguration oder nutzt die XML-RPC-Aus-Einstellung eines Sicherheits-Plugins.
# Im server-Block — Anfragen an xmlrpc.php ablehnen
location = /xmlrpc.php {
deny all;
}Mit dieser Einstellung enden GET- und POST-Anfragen an [xmlrpc.php] alle mit 403, ohne PHP zu erreichen. Die XML-RPC-Aus-Option eines Sicherheits-Plugins lehnt nur Anfragen ab, die einen Login brauchen, die Datei antwortet weiter – willst du auch PHP-Ausführungen sparen, sperrst du besser in Nginx.
5️⃣ Auf dem Server sperren: IP-Beschränkung für den Adminbereich und Rate Limit
Verwaltest du nur von einer festen IP aus, ist es am sichersten, [wp-login.php] und /wp-admin/ in Nginx nur für diese IP freizugeben. Für Umgebungen, in denen sich die IP zu Hause oder im Büro oft ändert, passt das nicht.
Ganz /wp-admin/ zu sperren scheint zu reichen, aber Funktionen für Besucher wie Suche oder Warenkorb schicken oft Anfragen an [admin-ajax.php] – diese Datei muss offen bleiben.
# Im server-Block — oberhalb der PHP-location
location = /wp-login.php {
allow 203.0.113.10; # Feste IP, von der du verwaltest
deny all;
# Darunter die Einstellungen der PHP-location übernehmen
}Öffnest du [wp-login.php] von einer anderen als der erlaubten IP, kommt ein 403, von der erlaubten IP aus öffnet sich die Login-Seite. In die location musst du die PHP-Einstellungen der Website (fastcgi_pass usw.) unverändert übernehmen, damit die Login-Seite normal läuft.
Kannst du die IP nicht festlegen, bleibt ein Rate Limit für PHP-Anfragen von nicht eingeloggten Besuchern; wie ich es auf 30 pro Minute begrenzt habe, damit automatische Anfragen keine Serverressourcen belegen, ist im Beitrag php-fpm max_children-Warnung beschrieben.
# http-Block — nur Anfragen ohne Login-Cookie pro IP zählen
map $http_cookie $php_anon_key {
default $binary_remote_addr;
"~*wordpress_logged_in" "";
}
limit_req_zone $php_anon_key zone=php_anon:10m rate=30r/m;
# In der PHP-location
limit_req zone=php_anon burst=60 nodelay;
limit_req_status 429;Schickt eine nicht eingeloggte IP PHP-Anfragen hintereinander, werden sie bis zur 61. bearbeitet, danach kommt 429; Anfragen mit Login-Cookie werden nicht gezählt. Antwortet der Seiten-Cache ohne PHP, stoßen normale Besucher beim Lesen der Seiten nie an dieses Limit.
Sicherheits-Plugin
WordPress-Sicherheits-Plugins: die besten 5
Eine Vergleichstabelle mit fünf bekannten Sicherheits-Plugins.
Anmeldung
Vergessenes Admin-Passwort zurücksetzen
So änderst du dein Passwort im Profil und setzt es zurück, wenn du es vergessen hast.
Werkzeuge
Zufallspasswort-Generator
Ein Tool, das 6- bis 30-stellige Passwörter aus Groß- und Kleinbuchstaben, Zahlen und Sonderzeichen erzeugt.
ℹ️ Affiliate-Hinweis
Die Inhalte dieser Website enthalten Affiliate-Links. Kauft ein Besucher über einen dieser Links ein Produkt oder eine Dienstleistung, erhält die Website vom Verkäufer eine Provision. Der Betrag, den der Käufer zahlt(bei Aktionsrabatten sinkt er ↓), steigt dadurch nicht. Angegebene Preise, Rabatte und Lagerbestände entsprechen dem Stand bei Erstellung und können abweichen; prüfe sie daher vor dem Kauf beim Verkäufer. Produkte werden nach eigenen Kriterien ausgewählt und bewertet, und Provisionen beeinflussen weder die Reihenfolge noch den Inhalt der Bewertungen.