WordPress Login-Security: Eine Stahltür in der Wellblechhütte

Schaut man sich bei Security-Plugins und -Tutorials um, so stellt man fest, dass ein unglaublicher Fokus auf die Absicherung des Logins liegt. Das ist dahingehend ironisch, dass meisten Angreifer ganz anders reinkommen, da man sich eine Stahltür in eine Wellblechhütte einbaut. Dieser Artikel möchte die (fehlende) Sinnhaftigkeit der Absicherung des Logins beweisen und Alternativen aufzeigen.

Wie ein Angriff auf das Login (nicht) funktioniert

Der Angriff auf ein Login ist im Grunde ganz einfach: der Angreifer probiert automatisiert viele verschiedene Nutzer-Passwort-Kombinationen aus. Wenn er eine Kombination gefunden hat, loggt er sich damit ein und installiert Schadcode. So weit, so simpel – es scheitert nur an einer ganz einfachen Sache: an der Mathematik.

Setzt man mal voraus, dass zehn Angriffe pro Sekunde gefahren werden (die allermeisten Webspaces steigen bei der Menge Zugriffe wegen Überlastung aus). Setzen wir ebenfalls voraus, dass ein ganz einfaches nur acht Zeichen langes Passwort nur mit Groß- und Kleinschreibung sowie Ziffern verwendet wurde. Dann haben wir:

62^8 = 2.183.40.105.584.896 Möglichkeiten
218.340.105.584.896 / 10 = 21.834.010.558.490 (10 Angriffe pro Sekunde)
21.834.010.558.490 / 60 = 363.900.175.975 (60 Sekunden pro Minute)
363.900.175.975 / 60 = 6.065.002.933 (60 Minuten pro Stunde)
6.065.002.933 / 24 = 252.708.456 (24 Stunden pro Tag)
252.708.456 / 365 = 692.352 (365 Tage pro Jahr)

Wir rekapitulieren: der Angreifer braucht 692.352 Jahre, um sämtliche Kombinationen durchzuprobieren – und das bei einer Menge Anfragen, die den Server überlastet, und bei einem echt simplen Passwort.

Erlauben wir Sonderzeichen und machen ein sechzehnstelliges Passwort daraus, haben wir 86^16 = 56 * 10^36 oder ausgeschrieben 5.694.696.374.225.030.000.000.000.000.000.000.000 Möglichkeiten, was bei 10 Tests pro Minute 1,8 * 10^28 oder ausgeschrieben 18.057.763.743.737.400.000.000.000.000 Jahre macht. Der Angreifer wäre also mit extrem hoher Wahrscheinlichkeit noch nicht fertig, wenn er zum Zeitpunkt des  Urknalls angefangen hätte.

Am Rande bemerkt: es lohnt es sich, längere Passwörter zu nehmen und dafür dann auf Sonderzeichen zu verzichten, wie dieser XKCD schön erklärt. Aber egal, welches Passwort man wählt, die Mathematik zeigt: hat man ein sicheres Passwort, kommt man beim Login nicht mehr durch.

Und für die, die jetzt die Horrorvision der xmlrpc multicall Angriffe aus der Schublade holen: das ist seit WordPress 4.4 (Dezember 2015) gefixt, und selbst wenn man 500 Angriffe pro Sekunde ausführen kann, so ändert das nahezu nichts (viel Spaß beim Rechnen).

Wörterbuchattacken statt Brute Force

Das systematische Durchprobieren ist das, was man unter einem Brute Force Angriff versteht. Da dies gegen ein WordPress mathematisch kein Erfolg haben wird, nutzen Angreifer eine andere Methode: Wörterbuchattacken. Dabei nehmen sich die Angreifer die Passwort-Listen, welche bei den großen Hacks (z.B. dem Adobe Hack) entstanden sind, und gehen einfach die häufigsten Passwörter durch.

Logischerweise können Angreifer so nur erfolgreich sein, wenn man Passwörter nimmt, die alle nehmen. Kurzum: hat man ein individuelles Passwort, ist man sicher.

Viel, viel wertloser „Schutz“

Wenn man sich die Zahlen genauer anschaut, so wirkt es absurd, wie viel Aufwand Menschen betreiben, um ihr Login abzusichern. Da werden htpasswd geschrieben, Ban-Plugins eingesetzt, htaccess mit IP-Bans ergänzt, Anti-Bot-Plugins eingesetzt, das Login ganz versteckt … so viel Aufwand für exakt gar keinen Effekt (solange man ein sicheres Passwort hat, und ohne ein sicheres Passwort helfen auch die ganzen schönen Tricks nichts).

Ein besonders absurdes Phänomen ist dabei das Verstecken des Nutzernamens. Da wird viel Aufwand betrieben, um etwas zu verstecken, was konzeptionell von WordPress nicht versteckt wird. Ob JSON-API, ob XMLRPC, ob verschiedene Forward-Regeln – es gibt viele Wege, den Nutzernamen herauszubekommen, und das ist ok. Denn das Geheime an einem Login ist das Passwort, und für das gilt die Rechnung oben.

Wie nutzlos die Login-Schutz-Systeme sind, zeigt sich übrigens auch sehr deutlich an den Angriffswegen. Hier ein paar Links dazu:

Generell ist die Datenlage eher schlecht, was aber vor allem daran liegt, dass der tatsächliche Angriffsweg oft nicht mehr nachvollziehbar ist. Die meisten infizierten Systeme, denen ich in meiner Arbeit so begegne, sind schon länger infiziert. Wenn ich einen Grund ausfindig machen konnte, dann war es nahezu immer Remote Code Execution und Remote File Injection. Das Anlegen neuer Admin-User via SQL-Injection passiert aber auch häufiger mal.

Positive Effekte mancher Techniken

Eine kleine Sonderrolle nehmen bei all den Schutzmechanismen übrigens 2-Factor-Authentifikations-Systeme ein. Diese basieren darauf, dass man zwei Geräte braucht, um ein erfolgreiches Login zu machen. Dies gibt noch einen Zusatz-Schutz gegen lokale Viren, also Viren, die nicht raten, sondern auf dem Rechner des Admins installiert sind und dort das Passwort einfach auslesen. Es macht natürlich keinen Sinn, sein Handy als 2-Factor-Auth-Gerät einzurichten und sich dann von dem selben Handy aus einzuloggen – dann kann man 2-Factor-Auth auch gleich lassen.

Ansonsten bringt manche Login-Security an einer ganz anderen Stelle etwas: Systemnahe Ban-Plugins wie wp-fail2ban oder die htpasswd haben oftmals den Effekt, dass die Last auf dem Server heruntergeht, einfach, weil weniger Loginversuche = weniger Datenbankabfragen = weniger Last auf dem Server bedeuten. Das gilt allerdings nicht für Plugins wie limit-login-attempts, die müssen ja erst mal die Datenbank fragen, welche User gerade gesperrt sind.

Aber wie mache ich WordPress sonst sicher?

Die Sicherheit eines WordPress Blogs wird nicht über den Schutz des Logins erreicht. Ironischerweise ist der Login-Schutz auch das, was nahezu alle Sicherheits-Plugins groß herausstellen. Das hat vor allem den Grund, dass man fehlgeschlagene Logins sehr gut erkennen kann. Kurzum: manch ein Sicherheitsplugin legitimiert sich durch große, fette Warnmeldungen vor Wörterbuchattacken selbst. Dass das Sicherheitsplugin nichts, aber auch wirklich gar nichts, an der Sicherheitslage geändert hat, indem es ein paar Bots gebannt hat – das wird nicht dazugeschrieben.

Sicherheit auf WordPress bedeutet vor allem, immer alles aktuell zu halten – auch kommerzielle Themes und Plugins, dort gibt es oft keinen Updater. Das beinhaltet auch das Löschen von Themes und Plugins, die nicht mehr betreut werden.

Ist das erledigt, muss man anfangen, nachzuschauen, wie ein Angreifer hereinkommen könnte und wie man dies abwehren kann. Gegen SQL Injections helfen neben Updates auch oft veränderte Datenbank-Prefixe, gegen Remote Code Execution und File-Inclusion-Lücken oft sichere Dateirechte, gegen MitM-Attacken SSL. Und generell gilt: weniger ist mehr – je mehr und je größere Themes und Plugins eingesetzt werden, desto mehr Angriffsfläche wird geboten.

Ein ganz wichtiger Punkt ist auch noch ein sauberes Backup, und zwar eines, welches das Backup nicht auf denselben Webspace ablegt. Kritisch darf man dagegen jegliche Art von Virenscannern sehen: PHP-Code mutiert extrem stark, so dass er sehr schwer zu scannen ist. Wer genug PHP-Hintergrundwissen mitbringt, kann sich bei Damian schlau machen, wie man scannen kann – jedoch bedarf es bei solchen Scans eben ein hohes Level an Interpretation.

Es gibt keine Einhornmagie-Lösungen

Der aber wohl wichtigste Punkt ist: es gibt keinen magischen Sicherheits-Knopf, und alles ist gut. Tools, die so etwas versprechen, sind zwangsweise unseriöser Mist. Sicherheit ist und bleibt ein Konzept, welches nicht durch wilde Marketing-Versprechen erzeugt wird, sondern durch eine saubere Analyse und dem Entwickeln von Lösungen.

Als Anfänger ist man mit konsequenten Updates und Backups schon gut dabei. Aber wenn ihr mehr machen wollt, dann lasst doch bitte die Sicherheits-Esoterik am Login sein, und lernt lieber, wie Angriffe funktionieren und was ihr dagegen tun könnt.

14 Kommentare zu “WordPress Login-Security: Eine Stahltür in der Wellblechhütte

  1. Herzlichen Dank für diesen Artikel, der mir aus der Seele spricht. Ich bin zwar bei weitem kein WordPress-Profi, aber auch ich sehe die Dinge ähnlich. Auch im alltäglich Umgang mit Computer und dem Einsatz von Antivirenprogrammen und Firewalls. Letztendlich liegt es immer am User / Admin eines Blogs selbst.

  2. Welche Ressourcen-schonenden Lösungen würdest Du vorschlagen, wenn die Seite im Visier eines Botnetzes hängengeblieben ist und ständig den Login zuballert?
    Außer fail2ban oder htpasswd Schutz noch andere Mittel?

    Ansonsten lesenswerter Artikel. Leider werden ihn nicht die lesen, die es tun sollten.

    1. Alles, was keine Datenbank-Requests macht. fail2ban und htpasswd sind da schon die Mittel der Wahl. SSL hilft auch noch bemerkenswert gut, weil aus irgendeinem nicht ganz erfindlichen Grund viele Bots bis heute kein SSL können.
      Und: ach, ein paar User zieht das schon für Google an. Und dann muss ich das nicht jedes mal neu schreiben, wenn ich irgendwo supporte.

        1. Nein, das ist ein Systemdienst, und es wäre fatal, wenn du daran rumspielen könntest. Da sind aber eh die anderen Nutzer der geteilten Ressourcen das große Performance-Problem, von da aus würde das dort auch nicht viel nutzen.

          1. Dann wird das für die meisten auf 1&1 Kisten herumkrepelnden Kundenseiten nicht möglich sein. Habe ich allerdings keinen Schmerz mit. Gibt es zur Beruhigung eben 2FA Plugins oder Wordfence und so Kram.

          2. Uh. 1und1. Da haste häufiger mal performancefressende Mitkunden, und 1und1 tut nicht wirklich viel dagegen, so dass man da öfter mal mitgefangen ist. Und wenn die Kunden unbedingt Sicherheitsesoterik wollen, was kein Sicherheitsgewinn bringt, aber die Angriffsfläche durch mehr Code erhöht … huh. Wenn man meint …

  3. Pingback: Wordpress Securiy
  4. Naja, kann auch Strato und so Kram sein. War nur ein Beispiel. Hauptsache günstig. 🙂

    Die beruhigende Wirkung von Sicherheitsesoterik wird oftmals sträflich unterschätzt 😉

    Go for Sicherheitsesoterik!

  5. Hat mich überzeugt. Werde auf meinen WordPressseiten die Sicherheitsplugins entsorgen und das Passwort mal ein wenig verlängern. Wenn ich dich richtig verstanden habe, entsorge ich damit u. U. ein paar Risikofaktoren ohne Sicherheitsverlust. Kurz und gut: wann man das mal schwarz auf weiß liest, leuchtet das auch dem Laien sofort ein.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.