Es gibt mehrere nützliche Antworten auf SO bezüglich der Verhinderung von Brute-Forcing eines Passworts für einen Webdienst durch Anwendung von Drosselung. Ich konnte jedoch keine guten Zahlen finden und habe wenig Erfahrung in diesem Bereich, also lautet die Frage:
Wie viele Versuche sind in der Regel erforderlich, um ein durchschnittliches Kennwort mit 6 oder mehr Zeichen zu erzwingen (ohne zusätzliches Wissen, das hilfreich sein könnte, aber unter Berücksichtigung der Tatsache, dass Kennwörter wahrscheinlich anfällig für Wörterbuchangriffe sind), und was sind auf dieser Grundlage sinnvolle Grenzen für die Anwendung des Drosselungsalgorithmus, ohne die Benutzererfahrung zu beeinträchtigen?
Dies ist mein derzeitiger Plan:
- Das Anmeldeformular verwendet eine Nonce, so dass der Angreifer einen kompletten Anfragezyklus abwarten muss, um sowohl das Ergebnis des Anmeldeversuchs zu erhalten als auch ein neues Token abrufen zu können.
Ich erlaube es, dass das Anmeldeformular 50 Mal pro IP abgerufen wird, wobei der Abstand zwischen den Anfragen weniger als eine Minute beträgt; danach wird die IP für 1 Minute gesperrt. Bei jedem neuen Versuch innerhalb dieser einen Minute wird die Zeitüberschreitung neu gestartet.Es gibt einesleep
für jeden Abruf der Anmeldeseite von# of attempts / 5
So dauert es nach 5 Anfragen mit weniger als einer Minute Abstand zwischen den Anfragen > 1 Sekunde, um das Formular abzurufen, nach 10 Anfragen > 2 Sekunden, usw.Außerdem erlaube ich nur 100 fehlgeschlagene Anmeldeversuche pro Benutzerkonto mit einem Abstand von 2 Stunden zwischen den Versuchen, danach wird das Konto für 2 Stunden gesperrt.- Um häufige DoS'ing von Konten zu vermeiden, können IPs auf eine Whitelist gesetzt werden (keine Beschränkungen) oder auf eine Blacklist (jeder Anmeldeversuch wird vollständig ignoriert).
Auf der Grundlage der bisherigen Antworten habe ich das System so geändert, dass es wie folgt funktioniert:
- Der Abruf des Anmeldeformulars wird schrittweise pro IP verlangsamt. Jede neue Anfrage wird geschlafen für
# of requests / 2
Sekunden. Der Zähler wird nach 10 Minuten ohne Anmeldeaktivität zurückgesetzt. - Ich führe einen FIFO-Stapel von Anmeldeversuchen für jede IP. Wenn sich eine IP innerhalb von 2 Stunden 30 Mal nicht anmeldet, wird sie gesperrt. Ich führe auch eine Liste der Anzahl der Sperrungen pro IP, und die Sperrzeit wird wie folgt berechnet
2 ^ (# of suspensions + 1) hours
. Dies sollte zu einer schnellen De-facto-Blacklisting von ständig verstoßenden IPs führen. - Außerdem wird ein Konto, das sich innerhalb eines Tages 20 Mal nicht angemeldet hat, für 2 Stunden gesperrt. Ich bin mir bei dieser Maßnahme noch nicht so sicher, da dies bedeutet, dass Konten ganz einfach mit DoS'd angegriffen werden können. Wenn es sich nicht gerade um ein riesiges, verteiltes Botnetz handelt, sollten die IPs der Angreifer jedoch schneller auf die schwarze Liste gesetzt werden, als ein Konto dauerhaft mit DoS belegt werden kann. Es ist auch eine recht effektive Maßnahme zum Schutz eines Kontos.
Meiner Meinung nach sollten diese Beschränkungen normalen Nutzern nicht schaden, selbst wenn sie regelmäßig ihr Passwort vergessen und mehrmals versuchen, sich einzuloggen. Die IP-Beschränkungen sollten auch bei Nutzern mit starkem NAT problemlos funktionieren, wenn man die durchschnittliche Größe des Dienstes bedenkt. Kann jemand mit soliden Berechnungen beweisen, dass dies effizient oder ineffizient ist?)