security-manager


Security Manager


Der Security Manager ist ein Core-Modul des Weinhold Frameworks und schützt alle Sites im Netzwerk vor Brute-Force-Angriffen und unerwünschten IPs. Er arbeitet still im Hintergrund und greift so früh wie möglich ein, teils schon bevor WordPress selbst reagiert.

Allgemein

IP-Blacklist


Bestimmte IP-Adressen können dauerhaft auf eine Sperrliste gesetzt werden. Anfragen von diesen IPs werden sofort mit 403 blockiert – noch bevor der WordPress-Login-Prozess startet.

Login-Lockout


Nach einer konfigurierbaren Anzahl fehlgeschlagener Login-Versuche wird die betreffende IP automatisch für einen festgelegten Zeitraum gesperrt (429, Wartezeit in der Fehlermeldung genannt). Besonders geschützte Benutzerkonten (z. B. Administratoren) bekommen zusätzlich eine eigene, strengere Sperre nach Benutzername statt nach IP.

Vertrauenswürdige IPs & Notfall-Zugang


Fest hinterlegte vertrauenswürdige IPs umgehen alle Sperren komplett. Zusätzlich gibt es einen Notfall-Token: ein per URL-Parameter übergebenes Geheimnis, das bei Übereinstimmung sämtliche Sperren für die aktuelle IP sowie alle geschützten Konten aufhebt und eine zehnminütige Vertrauens-Session setzt – gedacht für den Fall, dass man sich selbst ausgesperrt hat.

Administration & Protokollierung


Im Dashboard unter Weinhold → Security Manager können gesperrte IPs eingesehen, entsperrt oder dauerhaft blockiert werden. Alle Lockout-Ereignisse werden automatisch im Audit-Log protokolliert, sodass verdächtige Aktivitäten nachvollziehbar bleiben.

Dateien

modules/security_manager_core.php – einzige Datei des Moduls (Core-Modul, das _core.php-Suffix lädt es immer): Einstellungen, IP-Sperren, Lockout-Logik, Login-Hooks, Admin-Oberfläche.

Für Entwickler

Einstellungen (Option weinhold_security_settings)


SchlüsselBedeutung
lockout_thresholdFehlversuche bis zur IP-Sperre (Standard 5)
lockout_durationSperrdauer in Minuten (Standard 15)
blacklistDauerhaft gesperrte IP-Adressen
trusted_ipsIPs, die alle Sperren umgehen
emergency_tokenGeheimnis für den Notfall-Zugang per URL-Parameter
protected_usersZusätzlich geschützte Benutzernamen (Super-Admins sind bei Multisite automatisch geschützt)
protected_threshold,protected_lockout_durationStrengere Schwelle/Dauer speziell für geschützte Konten
lockout_ip_on_protected_failOb ein Fehlversuch bei einem geschützten Konto zusätzlich die IP sperrt
disable_xmlrpcXML-RPC komplett deaktivieren (Standard an)

Login-Flow (Hooks)


HookPrioritätZweck
init0weinhold_security_handle_emergency_token() – prüft den URL-Parameter wf_emergency und hebt bei Treffer alle Sperren auf
init1weinhold_security_check_ip() – blockiert blacklistete/gesperrte IPs auf JEDEM Request, nicht nur beim Login
login_init1weinhold_security_block_native_auth() – leitet wp-login.php-Aufrufe auf die eigenen Auth-Seiten des user_management-Moduls um
login_init2weinhold_security_block_locked_login() – blockiert Login-POSTs gesperrter IPs, bevor WordPress die Zugangsdaten prüft
login_init3weinhold_security_block_gateless_post() – blockiert Login-POSTs ohne gültiges Login-Gate-Cookie, falls das login_gate-Modul aktiv ist
authenticate30weinhold_security_authenticate() – liefert WP_Error bei gesperrter IP oder gesperrtem geschütztem Konto
wp_login_failed10weinhold_security_login_failed() – zählt Fehlversuche hoch, versendet Benachrichtigungs-Mails

IP-Ermittlung


weinhold_security_get_client_ip() prüft der Reihe nach CF-Connecting-IP, X-Real-IP, X-Forwarded-For und REMOTE_ADDR und nimmt die erste gültige IP-Adresse – wichtig hinter Reverse-Proxy/CDN, damit nicht die Proxy-IP statt der echten Besucher-IP gesperrt wird.

Besonderheiten

Läuft parallel zum user_management-Modul: Beide Module leiten wp-login.php-Aufrufe auf die eigenen Auth-Seiten um (security_manager auf login_init, user_management ebenfalls) – bewusst redundant abgesichert, nicht als Bug zu verstehen.

Blacklist- und Lockout-Prüfung laufen bereits auf init mit Priorität 1, also auf JEDEM Seitenaufruf der ganzen Website, nicht nur beim Login – eine geblacklistete IP kommt gar nicht erst auf normale Seiten.

Der Notfall-Token gibt nie einen Hinweis, ob er falsch war (stiller Fehlschlag) – verhindert, dass jemand per Trial-and-Error herausfindet, ob überhaupt ein Token konfiguriert ist.

E-Mail-Adressen im Login-Feld werden vor der Sperrprüfung auf den echten Benutzernamen aufgelöst, damit Lockout-Zähler für „admin“ und „admin@example.com“ nicht getrennt gezählt werden.

XML-RPC wird standardmäßig komplett deaktiviert (xmlrpc_enabled-Filter auf false) – ein häufiges Ziel für Brute-Force-Bots, das WordPress sonst parallel zum normalen Login offen lässt.

Versionshistorie

VersionDatumÄnderung
1.0.022.09.2026Einführung der Versionierung.