Anzahl der Versuche, ein durchschnittliches Passwort zu bruten / nicht intrusive, aber sinnvolle Grenzen?

8

Es gibt mehrere nützliche Antworten zu SO bezüglich der Verhinderung der Brute-Erzwingung eines Passwortes eines Web-Services durch Anwendung von Throttling. Ich konnte jedoch keine guten Zahlen finden, und ich habe wenig Erfahrung in diesem Bereich, also ist die Frage:

Wie viele Versuche dauert es normalerweise, um ein durchschnittliches Passwort von 6 oder mehr Zeichen (ohne zusätzliches Wissen, das helfen kann, aber unter Berücksichtigung, dass Passwörter wahrscheinlich anfällig für Wörterbuchangriffe sind) zu erzwingen und darauf basierend, was sind sinnvolle Grenzen für den Drosselungsalgorithmus, ohne die Benutzererfahrung zu stören?

Dies ist mein derzeitiges Schema:

  • Das Anmeldeformular verwendet eine Nonce, sodass der Angreifer warten muss, bis ein vollständiger Anforderungszyklus abgeschlossen ist, um das Ergebnis des Anmeldeversuchs abzurufen und ein neues Token abzurufen.
  • Ich erlaube, dass das Login-Formular 50 mal pro IP mit weniger als einer Minute zwischen den Anfragen abgerufen wird, danach wird die IP für 1 Minute blockiert. Alle neuen Versuche innerhalb dieser Minute starten das Timeout neu.
  • Es gibt ein sleep , das für jeden Abruf der Login-Seite von # of attempts / 5 gilt, also nach 5 Anfragen mit weniger als einer Minute zwischen den Anfragen wird & gt; 1 Sekunde, um das Formular nach 10 Anfragen & gt; 2 Sekunden usw.
  • Außerdem erlaube ich nur 100 fehlgeschlagene Anmeldeversuche pro Benutzerkonto mit 2 Stunden zwischen Versuchen, danach ist das Konto für 2 Stunden gesperrt.
  • Um häufiges DoSing von Accounts zu vermeiden, können IPs auf die weiße Liste gesetzt (keine Grenzen gesetzt) ​​oder auf die schwarze Liste gesetzt werden (jeder Login-Versuch wird komplett ignoriert).

Basierend auf den bisherigen Antworten habe ich es so optimiert, dass es so funktioniert:

  • Das Abrufen des Anmeldeformulars wird schrittweise pro IP-Adresse verlangsamt. Jede neue Anfrage wird für # of requests / 2 Sekunden geschlafen. Der Zähler wird nach 10 Minuten ohne Anmeldeaktivität zurückgesetzt.
  • Ich behalte einen FIFO-Stack von Login-Versuchen für jede IP. Wenn sich eine IP-Adresse 30 Mal innerhalb von zwei Stunden nicht anmeldet, wird sie gesperrt. Ich führe auch eine Liste der Anzahl der Suspensionen pro IP, und die Aussetzungszeit wird als 2 ^ (# of suspensions + 1) hours berechnet. Dies sollte zu einer schnellen De-facto-Blacklisting von ständig beleidigenden IPs führen.
  • Wenn ein Konto 20 Mal innerhalb eines Tages nicht angemeldet wurde, wird es außerdem für 2 Stunden gesperrt. Ich bin mir über diese Maßnahme noch nicht ganz sicher, denn das bedeutet, dass Accounts ziemlich einfach zu erledigen sind. Abgesehen von einem massiven verteilten Botnet sollten angreifende IPs de facto schneller auf die schwarze Liste gesetzt werden, als ein Account dauerhaft gesperrt werden kann. Es ist auch eine sehr effektive Maßnahme, um ein Konto zu schützen.

Ich denke, dass diese Grenzen normalen Benutzern nicht schaden sollten, selbst wenn sie ihr Passwort regelmäßig vergessen und versuchen, sich mehrmals anzumelden. Die IP-Grenzwerte sollten auch bei stark NAT-Nutzern angesichts der durchschnittlichen Größe des Dienstes in Ordnung sein. Kann jemand beweisen, dass dies effizient oder ineffizient ist? :)

    
deceze 04.03.2010, 03:58
quelle

3 Antworten

2

Aus der Frage klingt es wie das schnellste, das sie versuchen könnten, Passwörter ist 50 pro Minute. Basierend darauf und mit zufälligen 6-stelligen Passwörtern:

Natürlich wären Wörterbuchangriffe viel schneller, aber ich habe keine Zahlen dafür.

BEARBEITEN: Ich habe versucht, Google-Rechnerergebnisse zu verknüpfen, die dies unterstützen, aber ^ scheint hier Links zu vermasseln.

EDIT2:

Wörterbuchangriffe (von Ссылка ):

  • alle aufgeführten Wörter (75.000): ~ 1 Tag
  • Liste von 816 gemeinsamen Passwörtern: ~ 16 Minuten
  • wirklich lange Wortliste: ~ 12 Tage (Ich sah dies und ich Ich vermute, es enthält die meisten nicht-technischen Personen Passwörter)

Der letzte ist gruselig, aber 12 Tage ist noch eine lange Zeit. Wenn Sie wirklich besorgt sind, können Sie jedes falsche Passwort verfolgen, bis der Benutzer ein korrektes Passwort erhält, und wenn die Liste zu 100 verschiedenen Versuchen erscheint, verbieten Sie einfach die IP-Adresse und senden eine E-Mail an den Benutzer.

    
Brendan Long 04.03.2010, 04:43
quelle
6

Sie haben ein paar gute Kontrollen dort, aber Sie sollten es wirklich mehr anziehen. Ein regulärer Benutzer sollte sich nicht mehr als fünf Mal anmelden. Wenn er es tut, zeigen Sie ihm ein CAPTCHA.

Denken Sie daran, dass Sie das Konto unter keinen Umständen sperren sollten. Es wird eine Sicherheitslücke für die Kontosperrung genannt. Dies ermöglicht es einem beliebigen Benutzer, andere Benutzer vom Dienst abzumelden (DOS, Denial of Service).

Ich habe dieses Problem der Anmeldedrosselung oft angegangen, und das eine, das ich mag, ist, dass Sie ein Feld fehlgeschlagener Versuche und das Datum des letzten fehlgeschlagenen Versuchs in Ihrer Datenbank erstellen. Immer wenn jemand (irgendjemand) es versäumt, sich bei Konto X anzumelden, erhöhen Sie den Wert der fehlgeschlagenen Versuche von X und aktualisieren das letzte fehlgeschlagene Versuchsdatum. Wenn der Zählwert für fehlgeschlagene Versuche Y überschreitet (z. B. fünf), wird ein CAPTCHA für den bestimmten Benutzer angezeigt. Sie werden also keine riesige Datenbank mit verbotenen IPs haben, um das Login-Formular zu drosseln, stattdessen haben Sie nur zwei weitere Felder pro Benutzer. Es macht auch wenig Sinn, basierend auf IPs, wegen Botnets und Proxies (sowohl legale als auch illegale) zu bannen. Wenn IPv6 in Mode kommt, werden Sie mehr zum Scheitern verurteilt sein, als ich annehme. Es ist viel sinnvoller, basierend auf Zielkonten zu drosseln. Wenn Ihr Konto X von einem Botnet angegriffen wird, wird das Anmeldeformular mit einem CAPTCHA gedrosselt. Der offensichtliche Nachteil hier ist, dass, wenn Ihr CAPTCHA fehlschlägt ... ebenso Ihre Login-Drosselung.

Also, im Wesentlichen geht es so:

  • Jemand konnte sich nicht bei Konto X anmelden - Feld für fehlgeschlagene Versuche erhöhen.
  • Wenn es mehr als 5 fehlgeschlagene Versuche gibt und der letzte fehlgeschlagene Versuch vor einer Stunde passiert ist, scheint es, dass das Konto angegriffen wird, zeigen Sie das CAPTCHA.
  • Andererseits, wenn der letzte gescheiterte Versuch vor mehr als einem Tag stattgefunden hat, scheint der Angriff beendet zu sein, Ihre Schilde zu senken und CAPTCHA nicht zu erfordern.

Es ist im Grunde ein Schild, der sich einschaltet, wenn es einen massiven gezielten Angriff gegen bestimmte Konten gibt. Das Gute an dieser Art von Ansatz ist, dass es egal ist, ob ich eine Farm von PCs auf der ganzen Welt besitze - ich kann kein einziges Konto rotieren, weil es auf einem Konto basiert.

Die zwei schlimmen Dinge dabei sind, dass, wenn das CAPTCHA fehlschlägt, nichts mehr übrig ist. Sie könnten diese Situation natürlich verbessern, indem Sie auch andere Schutzmaßnahmen ergreifen. Das zweite Problem ist, dass ich, wenn ich ein Bot-Netz hätte, einen PC pro Konto verwenden könnte, und dann ist es wahrscheinlich, dass ich mit einer Million Computernetzwerk mindestens ein Konto knacke, aber dieser Ansatz funktioniert nur bei nicht gezielten Angriffen.

Ich hoffe, das hat Ihnen einige Gedanken gegeben.

    
Tower 04.03.2010 10:28
quelle
0

Ich mag generell die Antwort von @ Tower, bevorzuge aber eine Variante, die CAPTCHA nicht verwendet, hauptsächlich weil ich es als Benutzererfahrung hasse.

Fügen Sie zusätzlich zu seinen Fehlernachverfolgungsfeldern ein Sperrfeld mit einem Zeitstempel hinzu. Ich stimme zu, dass das Aussperren eines Benutzers für immer (oder bis zum manuellen Zurücksetzen) eine schlechte Erfahrung darstellt, aber mckamey 15.11.2012 21:53

quelle