Frage

Zuerst ein wenig Hintergrund: Es ist kein Geheimnis, dass ich einen Auth + Auth-Systems für CodeIgniter bin die Umsetzung, und so weit ich gewinne (sozusagen). Aber ich habe laufen in eine ziemlich nicht-triviale Herausforderung (eine, die die meisten Auth Bibliotheken völlig vermissen, aber ich darauf bestehen, es richtig Handhabung): Wie umgehen intelligent mit Groß, verteilt, variabler Benutzername Brute-Force Angriffe .

Ich kenne alle üblichen Tricks:

  1. Die Begrenzung Anzahl der Fehlversuche pro IP / Host und die Täter Zugang verweigert (zB Fail2Ban) - die nicht mehr funktioniert seit Botnets schlauer geworden sind
  2. Die Kombination des oben mit einer schwarzen Liste des bekannten 'schlechten' IPs / hosts (zB DenyHosts) - die für # 1, , die sie zunehmend nicht
  3. IP / Host-weiße Listen mit traditioneller Auth kombiniert (leider nutzlos mit dynamischem IP-Benutzer und den hohen Abwanderungs auf den meist Web-Site)
  4. Einstellung Site-weiten Grenzwerts nach Anzahl der Fehlversuche innerhalb einer N Minuten / Stunden Zeit, und Drosselung (Aussetzung), um alle Anmeldeversuche danach für eine Anzahl von Minuten / Stunden (mit dem Problem, dass DoS Sie angreifen Botnet Kinderspiel)
  5. wird
  6. Mandatory digitale Signaturen (Public-Key-Zertifikate) oder RSA Hardware-Token für alle Anwender ohne Login / Passwort-Option (ohne Frage eine rock-solid-Lösung, sondern nur praktisch für geschlossene, spezielle Dienstleistungen)
  7. Erzwungene ultra-starke Passwort Systeme (zum Beispiel> 25 unsinnige Zeichen mit Symbolen - wieder zu unpraktisch für gelegentliche Nutzer)
  8. Und schließlich CAPTCHAs (was in den meisten Fällen funktionieren kann, ist aber ärgerlich für Benutzer und praktisch nutzlos gegen einen bestimmt, einfalls Angreifer )

Nun, das sind nur die theoretisch praktikable Ideen. Es gibt viel Müll Ideen, die die Website weit offen (zum Beispiel zu trivial DoS-Attacken) blasen. Was ich will, ist etwas besser. Und besser, ich meine:

  • Es hat sicher (+) wird gegen DoS und Brute-Force-Angriffe und keine neue Schwachstellen nicht vorstellen, dass ein etwas hinterhältiger bietet unter dem Radar weiterhin erlauben könnte Betrieb

  • Es hat automatisiert werden. Wenn es einen menschlichen Bediener erfordert, dass jede Anmeldung oder überwachen verdächtige Aktivitäten zu überprüfen, ist es nicht geht in einem realen Szenario arbeiten

  • Es hat machbar für Mainstream-Web-Anwendung sein (dh. Hohe Abwanderungs, hohe Volumen und offene Registrierung, die von Nicht-Programmierern durchgeführt werden kann)

  • Es kann nicht die Benutzererfahrung auf den Punkt behindern, wo gelegentliche Nutzer verärgert bekommen oder frustriert (und möglicherweise die Website verlassen)

  • Es kann Kätzchen nicht beteiligen, es sei denn, sie sind wirklich wirklich sicher Kätzchen

(+) Mit dem ‚sicheren‘, meine ich zumindest so sicher wie eine paranoide Benutzer der Fähigkeit, sein Passwort geheim zu halten

Also - lass es hören! Wie würden Sie es tun ? Kennen Sie ein Best-Practice, dass ich nicht erwähnt habe (oh bitte sagen Sie tun)? Ich gebe zu, ich habe zu tun eine Vorstellung von meiner eigenen (die Kombination von Ideen aus 3 und 4), aber ich werde die wahren Experten sprechen lassen, bevor ich in Verlegenheit zu bringen; -)

War es hilfreich?

Lösung

In Ordnung, genug, um ein Abwürgen; hier ist, was ich mit so weit habe kommen

(sorry, lange Post vor. Seien Sie mutig, Freund, wird die Reise wert sein)

Die Kombination von Methoden 3 und 4 aus dem ursprünglichen Beitrag in eine Art ‚Fuzzy‘ oder dynamischer Whitelist, und dann - und hier ist der Trick - nicht Nicht-Whitelist IP-Adressen gesperrt, nur um sie in der Hölle Drosselung und zurück .

  

Beachten Sie, dass diese Maßnahme nur bedeutet diese sehr spezifische Art von Angriff zu vereiteln. In der Praxis natürlich wäre es in Kombination mit anderen Best Practices arbeiten Ansätze Auth: Festbenutzernamen Drosselung, pro-IP-Drosselung, Code erzwungene starke Passwort-Policy, ungedrosselten Cookie Login werden alle Äquivalente Passwort Hashing vor dem Speichern, nie mit Sicherheitsfragen, etc.

Die Annahmen über das Angriffsszenario

Wenn ein Angreifer variable Benutzernamen zielt, unsere Benutzernamen Drosselung nicht ausgelöst. Wenn der Angreifer ein Botnet verwendet oder hat Zugang zu einem großen IP-Bereich, unsere IP-Drosselung ist machtlos. Wenn der Angreifer hat unsere Userlist-Pre gekratzt (in der Regel möglich, auf Open-Registrierung Web Services), können wir nicht auf einen laufenden Angriff erkennen basierend auf der Anzahl von ‚Benutzer nicht gefunden‘ Fehler. Und wenn wir eine restriktive systemweit (alle Benutzernamen, alle IPs) Drosselung, mit einem solchen Angriff wird DoS unsere gesamte Website für die Dauer des Angriffs plus der Drosselung Zeit erzwingen.

Also müssen wir etwas anderes tun.

Der erste Teil der Gegenmaßnahme: würdige

Was wir ziemlich sicher sein kann, ist, dass der Angreifer nicht in der Lage ist, die IP-Adressen von mehreren tausend unserer Nutzer (+) zu erkennen und dynamisch fälschen. Das macht weiße Listen möglich. Mit anderen Worten: Für jeden Benutzer, speichern wir eine Liste des (gehasht) IPs, von wo der Benutzer zuvor hat (seit kurzem) angemeldet

.

Damit unsere weißen Listen Schema als locked ‚Haustür‘ funktioniert, wo ein Benutzer muss sich von einem seiner anerkannten ‚gut‘ IPs, um überhaupt anzumelden angeschlossen werden. Ein Brute-Force-Angriff auf diese 'Haustür' wäre praktisch unmöglich (+).

(+), es sei denn der Angreifer ‚besitzt‘ entweder den Server, alle Benutzer-Boxen, oder die Verbindung selbst - und in diesen Fällen können wir nicht mehr haben eine ‚Authentifizierung‘ Problem, wir haben eine echte Franchise-sized Pull-the-Stecker FUBAR Situation

Der zweite Teil der Gegenmaßnahme: Systemweite Drosselung unerkannten IPs

Um eine Whitelist Arbeit für einen Open-Registrierung Web-Service zu machen, wo die Nutzer Computer häufig und / oder eine Verbindung von dynamischen IP-Adressen wechseln, müssen wir eine Katzentür "offen halten für die Benutzer von nicht erfassten IP-Adressen zu verbinden. Der Trick ist, dass die Tür so zu gestalten, Botnets stecken bleiben, und so legitime Benutzer gestört bekommen so wenig wie möglich .

In meinem Schema wird dies durch Setzen eines erreicht wird sehr restriktive maximale Anzahl fehlgeschlagener Anmeldeversuche von nicht zugelassenen IPs über, sagen wir, eine 3 Stunden (kann es klüger, eine kürzere zu verwenden oder längerer Zeitraum auf Art der Dienstleistung abhängig) und macht diese Einschränkung global , das heißt. für alle Benutzerkonten.

Auch eine langsame (1-2 Minuten zwischen den Versuchen) Brute-Force erkannt werden würde und schnell und effektiv mit dieser Methode vereitelt. Natürlich bleibt ein wirklich langsam Brute-Force noch unbemerkt konnte, aber zu langsam beschleunigt den eigentlichen Zweck des Brute-Force-Angriffs besiegen.

Was ich hoffe, mit diesem Drosselmechanismus zu erreichen, ist, dass, wenn die maximale Grenze erreicht ist, unsere Katzentür "Slams für eine Weile geschlossen, aber unsere Haustür bleibt offen für berechtigte Benutzer mit üblichen Verbindungsmitteln:

  • Entweder von einem ihrer anerkannten IPs
  • Verbindungs
  • Oder durch einen persistenten Login-Cookie (von überall)

Der einzige legitime Benutzer, die während eines Angriffs betroffen wären - dh. while wurde die Drosselung aktiviert - wäre Benutzer ohne persistent Login-Cookies, die in von einem unbekannten Ort oder mit einer dynamischen IP wurden protokolliert. Diejenigen Nutzer wäre nicht in der Lage einzuloggen, bis die Drosselung nachließ (was möglicherweise eine Weile dauern könnte, wenn der Angreifer seine Botnet laufen trotz der Drosselung gehalten).

Diese kleine Teilmenge von Benutzern ermöglichen, durch die sonst verschlossene Katze Tür zu drücken, auch wenn Bots noch weg es hämmern, ich würde verwendet ein ‚Backup‘ Login-Formular mit einem CAPTCHA. So dass, wenn Sie die Display-Meldung „Sorry, aber Sie können zur Zeit nicht von dieser IP-Adresse anmelden“, fügen Sie einen Link, der sagt „ sicheres Backup Login - MENSCH ONLY ( Bots: keine liegend ) “. Scherz beiseite, wenn sie auf diesen Link klicken, gibt ihnen ein reCAPTCHA-authentifizierte Login-Formular, das die standortweite Drosselung umgeht. Auf diese Weise, wenn sie menschliche und kennen die richtigen Login + Passwort (und sind in der Lage CAPTCHAs zu lesen), werden sie nie sein verweigert Service, auch wenn sie von einem unbekannten Host verbinden und nicht die Verwendung von Auto-Login-Cookie.

Oh, und nur zu klären. Da ich CAPTCHAs halte im Allgemeinen schlecht zu sein, die 'Backup' Login-Option würde nur erscheint während Drosselung aktiv war

Es ist nicht zu leugnen, dass ein nachhaltiger Angriff wie das immer noch eine Form von DoS-Angriff darstellen würde, aber mit dem beschriebenen System eingerichtet, wäre es nur beeinflussen, was ich vermute, ein winziger Teil der Nutzer zu sein, nämlich Menschen, den don‘ t verwenden, um die „remember me“ Cookie UND passieren Anmeldung werden, während ein Angriff geschieht und nicht in aus einem ihrer üblichen IPs Protokollierung und wer nicht CAPTCHAs lesen. Nur diejenigen, die nicht auf alle diese Kriterien sagen kann - speziell Bots und wirklich Pech Menschen mit Behinderungen -. Wird abgewendet während eines Bot-Angriff

  

EDIT: Actully, dachte ich an eine Art und Weise auch CAPTCHA-herausgefordert Benutzer während eines 'Lockdown' passieren zu lassen: statt oder als Ergänzung der Sicherung CAPTCHA Login, bieten dem Anwender eine Option, um eine Einweg-, benutzerspezifischen Sperrcode an seine E-Mail geschickt haben, dass er dann die Drosselung verwenden können, umgehen. Diese Kreuze auf jeden Fall über meine ‚Ärger‘ Schwelle, aber da es nur als letztes Mittel für eine kleine Teilmenge von Benutzern verwendet wird, und da es nach wie vor aus Ihrem Konto gesperrt Beats werden, wäre es akzeptabel sein.

(Beachten Sie auch, dass kein Dies geschieht, wenn der Angriff ist nicht weniger anspruchsvoll als die böse verteilte Version, die ich hier beschrieben habe. Wenn der Angriff von nur wenigen IP-Adressen kommt oder nur schlagen ein paar Benutzername, wird es viel früher vereitelt werden, und mit nicht standortweite Folgen)


So, das ist die Gegenmaßnahme ich in meiner Auth Bibliothek umsetzen wird, sobald ich davon überzeugt bin, dass es gesund ist und dass es nicht eine viel einfachere Lösung, die ich verpasst habe. Die Tatsache ist, es gibt so viele subtile Art und Weise die Dinge falsch in Sicherheit zu tun, und ich bin nicht über falsche Annahmen oder hoffnungslos fehlerhafte Logik. Also bitte, jeder und alle Feedback, Kritik und Verbesserungen, Feinheit usw. ist sehr willkommen.

Andere Tipps

Ein paar einfachen Schritten:

Schwarze Liste bestimmte gemeinsame Benutzernamen, und sie als Honeypot verwenden. Admin, Gast, etc ... Lassen Sie sich nicht jemand Konten mit diesen Namen erstellen, so dass, wenn jemand sie nicht versuchen einzuloggen Sie wissen, dass es etwas, das jemand tun sie es nicht sollten.

Stellen Sie sicher, jeder, der auf der Website wirkliche Macht hat ein sicheres Passwort hat. Erfordern Admins / Moderatoren längere Passwörter mit einer Mischung aus Buchstaben, Zahlen und Symbolen zu haben. Ablehnen trivialen einfache Passwörter von normalen Benutzern mit einer Erklärung.

Eine der einfachsten Dinge, die Sie tun können, ist den Leuten zu sagen, wenn jemand in ihr Konto einzuloggen versucht, und geben ihnen einen Link, um den Vorfall zu melden, wenn es nicht sie war. Eine einfache Mitteilung, wenn sie in wie log „Jemand versucht, sich in Ihrem Konto, um 4:20 Uhr blah blah Mittwoch hier anmelden. Klicken Sie auf, wenn Sie sich davon nicht war.“ Damit können Sie Statistiken über Angriffe halten. Sie können bis Überwachungs- und Sicherheitsmaßnahmen Schritt, wenn Sie sehen, dass es in betrügerische Zugriffe ein plötzlicher Anstieg ist.

Wenn ich den MO von Brute-Force-Angriffen richtig verstehe, dann einem oder mehr Benutzername kontinuierlich versucht.

Es gibt zwei Vorschläge, die ich nicht glaube, ich noch hier gesehen habe:

  • Ich habe immer gedacht, dass die gängige Praxis eine kurze Verzögerung (eine Sekunde oder so) nach jeder falschen Login für jeden Benutzer zu haben war. Diese schreckt Brute-Force, aber ich weiß nicht, wie lange eine Verzögerung von einer Sekunde einen Wörterbuch-Angriff in Schach halten würde. (Wörterbuch von 10.000 Worten == 10.000 Sekunden == ca. 3 Stunden. Hm. Nicht gut genug.)
  • anstelle einer standortweiten verlangsamen, warum nicht ein Benutzer-Name Gas. Die Drossel wird immer härter mit jedem falschen Versuch (bis zu einem Limit, ich denke, so die realen Benutzer können immer noch anmelden)

Bearbeiten : Als Reaktion auf die Kommentare zu einem Benutzernamen Drossel: Dies ist ein Benutzername spezifische Drossel ohne Rücksicht auf die Quelle des Angriffs

.

Wenn der Benutzername gedrosselt wird, dann sogar ein koordiniertes Benutzername Angriff (Multi IP, Single Vermutung pro IP, gleichen Benutzername) würde gefangen werden. Einzelne Benutzernamen werden durch die Drossel geschützt, auch wenn die Angreifer frei einen anderen Benutzer versuchen, / während des Timeout übergeben.

Von einem Angreifer Sicht während des Timeout können Sie ein erstes Mal Vermutung bei 100 Passwörter nehmen können, und entdecken Sie schnell ein falsches Passwort pro Konto. Sie können nur in der Lage sein, eine 50 Sekunden Vermutungen für den gleichen Zeitraum zu machen.

Von einem Benutzerkonto Sicht, dauert es immer noch die gleiche durchschnittliche Anzahl von Vermutungen, das Passwort zu brechen, auch wenn die Vermutungen aus mehreren Quellen kommen.

Für die Angreifer, bestenfalls, es wird der gleiche Aufwand seine 100 Konten zu brechen, wie es wäre ein Konto, aber da Sie nicht auf einer Website weit Drosselung, können Sie die Drosselklappe ganz schnell zu.

Zusätzliche Verfeinerungen:

  • erkennen IPs, die mehrere Konten zu raten - 408 Request Timeout
  • erkennen IPs, die das gleiche Konto sind zu erraten -. 408 Request Timeout nach einer großen (etwa 100) Anzahl von Vermutungen

UI Ideen (kann in diesem Zusammenhang nicht geeignet sein), die auch die oben veredeln kann:

  • Wenn Sie die Kontrolle über die Einstellung Passwort sind, dann wird der Benutzer zeigt, , wie stark ihr Passwort ist sie fördert eine bessere wählen.
  • Wenn Sie die Kontrolle über das Login sind Seite , nach einer kleinen (etwa 10) Anzahl der Vermutungen eines einzigen Benutzernamen, ein CAPTCHA bieten.

Es gibt drei Faktoren der Authentifizierung:

  1. Ein Benutzer weiß etwas (dh ein Passwort)
  2. Ein Benutzer hat etwas (dh ein Schlüsselanhänger)
  3. Ein Benutzer ist etwas (dh Retina-Scan)

Normalerweise Websites Politik # 1 erzwingen. Auch nur die meisten Banken Politik erzwingen 1. Sie stattdessen auf eine „weiß etwas anderes“ verlassen Ansatz zur Zwei-Faktor-Authentifizierung. (IE: Ein Benutzer weiß, ihr Passwort und die Mädchennamen ihrer Mutter.) Wenn Sie in der Lage sind, eine Möglichkeit, in einem zweiten Faktor der Authentifizierung hinzuzufügen, ist nicht allzu schwierig.

Wenn Sie etwa 256 Zeichen der Zufälligkeit erzeugen kann, Sie, dass in einem 16 × 16-Tabellenstruktur konnte, und dann fragen Sie den Benutzer, den Wert in der Tabelle der Zelle A-14 zu geben, zum Beispiel. Wenn sich ein Benutzer anmeldet oder ihr Passwort ändert, so dass sie in der Tabelle geben und ihnen sagen, sie auszudrucken und speichern.

Die Schwierigkeit bei diesem Ansatz ist, dass, wenn ein Benutzer sein Passwort vergessen hat, wie sie wollen, können Sie nicht nur den Standard bieten „diese Frage zu beantworten und in einem neuen Passwort setzen“, da diese anfällig sind, um Kraft zu Brute-als auch . Außerdem können Sie es zurücksetzen nicht und schicken Sie ihnen eine neue, da die E-Mail als auch gefährdet sein könnte. (Siehe:. Makeuseof.com und ihre gestohlene Domain)

Eine weitere Idee (die Kätzchen handelt), ist das, was BOA nennt SiteKey (ich glaube, sie den Namen markenrechtlich geschützt). Kurz gesagt, haben Sie der Benutzer ein Bild hochladen, wenn sie registrieren, und wenn sie versuchen, sie zu melden, bitten, ihre Bild von 8 oder 15 (oder mehr) zufällige diejenigen auszuwählen. Also, wenn ein Benutzer ein Bild von ihrem Kätzchen uploads, theoretisch nur wissen sie genau, welches Bild aus allen anderen Kätzchen ihre ist (oder Blumen oder was auch immer). Der einzige wirkliche vunerability hat dieser Ansatz ist der Mann-in-the-Middle-Angriff.

Eine weitere Idee (keine Kätzchen obwohl), ist IPs zu verfolgen, die Benutzer mit Zugriff auf das System, und verlangen, daß sie zusätzliche Authentifizierung durchzuführen (Captcha, ein Kätzchen holen, einen Schlüssel aus dieser Tabelle holen), wenn sie von einem log in Adresse haben sie nicht vor. Auch ähnlich wie GMail, erlaubt dem Benutzer zu sehen, wo sie in von kürzlich angemeldet haben.

Bearbeiten, Neu Idee:

Eine weitere Möglichkeit, Anmeldeversuche zur Validierung ist zu überprüfen, ob der Benutzer von einem Login-Seite gekommen ist. Sie können nicht Referrer überprüfen, da sie leicht gefälscht werden können. Was Sie brauchen, ist ein Schlüssel in der _SESSION var zu setzen, wenn der Benutzer die Login-Seite angezeigt wird, und dann zu überprüfen, um sicherzustellen, dass Schlüssel vorhanden ist, wenn sie ihre Anmeldeinformationen. Wenn Bot aus der Login-Seite nicht vorlegen, wird es nicht in der Lage sein, um sich einzuloggen. Sie können dies auch durch die Einbeziehung Javascript in dem Prozess erleichtern, entweder indem sie sich mit einem Cookie zu setzen, oder einige Informationen zu dem Formular hinzugefügt, nachdem sie geladen ist. Oder können Sie das Formular in zwei verschiedenen vorträgt aufgeteilt (dh der Benutzer gibt seinen Benutzernamen trägt, dann auf einer neuen Seite gelangt ihr Passwort ein und senden Sie es erneut.)

Der Schlüssel in diesem Fall ist der wichtigste Aspekt. Ein übliches Verfahren, sie zu erzeugen, ist eine Kombination der Daten des Benutzers, dessen IP, und die Zeit wurde sie eingereicht.

Ich habe zu fragen, ob Sie Kosten-Nutzen-Analyse dieses Problems getan haben; es klingt wie Sie versuchen, sich von einem Angreifer zu schützen, die genug Web-Präsenz hat eine Reihe von Passwörtern zu erraten, vielleicht 3-5 Anfragen pro IP Senden (da Sie IP-Drosselung entlassen haben). Wie viel (ungefähr) würde diese Art von Angriff Kosten? Ist es teurer ist als der Wert der Konten Sie versuchen, zu schützen? Wie viele gargantuan Botnets wollen, was du hast?

Die Antwort könnte nicht sein - aber wenn es ist, ich hoffe, Sie bekommen Hilfe von einem Sicherheitsexperten von einer Art; Programmierkenntnisse (und Stackoverflow-Score) nicht stark auf Sicherheit Know-how korrelieren.

Ich habe geantwortet zuvor eine sehr ähnliche Frage über Wie kann ich Benutzer-Login-Versuche in PHP drosseln. Ich werde die vorgeschlagene Lösung hier wiederholen, wie ich viele von Ihnen glauben, dass es informative und nützlich finden einige aktuelle Code zu sehen. Bitte daran denkt, dass ein CAPTCHA mit vielleicht nicht die beste Lösung sein, aufgrund der immer genauere Algorithmen in CAPTCHA Busters heutzutage verwendet werden:

Sie können einfach nicht DoS-Angriffe verhindern, indem Chaining auf eine einzige IP-Adresse oder Benutzername Drosselung. Verdammt, man kann nicht einmal wirklich verhindert Schnellfeuer-Login-Versuche mit dieser Methode.

Warum? Da der Angriff mehr IPs und Benutzerkonten zum Zweck der Umgehung Ihrer Drosselung Versuche umfassen kann.

Ich habe an anderer Stelle gesehen geschrieben, die im Idealfall sollten Sie alle fehlgeschlagenen Anmeldeversuchen auf der gesamten Website aufspüren und sie zu einem Zeitstempel zuordnet, vielleicht:

CREATE TABLE failed_logins(
    id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(16) NOT NULL,
    ip_address INT(11) UNSIGNED NOT NULL,
    attempted DATETIME NOT NULL
) engine=InnoDB charset=UTF8;
Entscheiden

auf bestimmte Verzögerungen basierend auf der Gesamt Anzahl fehlgeschlagener Logins in einer bestimmten Höhe der Zeit. Sie sollen dies auf statistische Daten gezogen von Ihrem failed_logins Tischfuß, wie es wird Veränderung im Laufe der Zeit auf der Grundlage der Anzahl der Benutzer und wie viele von ihnen erinnern kann (und Typ) sein Passwort.


10 failed attempts = 1 second
20 failed attempts = 2 seconds
30 failed attempts = reCaptcha

Abfrage die Tabelle auf jedem fehlgeschlagenen Login-Versuch, die Anzahl fehlgeschlagener Logins für einen bestimmten Zeitraum zu finden, sagen 15 Minuten:


SELECT COUNT(1) AS failed FROM failed_logins WHERE attempted > DATE_SUB(NOW(), INTERVAL 15 minute);

Wenn die Anzahl der Versuche über die vorgegebene Zeit ist über dem Limit, entweder Drosselung erzwingen oder alle Benutzer zwingen, eine Captcha zu verwenden (dh reCaptcha), bis die Anzahl der Fehlversuche über den angegebenen Zeitraum ist kleiner als der Schwellenwert .

// array of throttling
$throttle = array(10 => 1, 20 => 2, 30 => 'recaptcha');

// assume query result of $sql is stored in $row
$sql = 'SELECT MAX(attempted) AS attempted FROM failed_logins';
$latest_attempt = (int) date('U', strtotime($row['attempted']));
// get the number of failed attempts
$sql = 'SELECT COUNT(1) AS failed FROM failed_logins WHERE attempted > DATE_SUB(NOW(), INTERVAL 15 minute)';
// assume the number of failed attempts was stored in $failed_attempts
krsort($throttle);
foreach ($throttle as $attempts => $delay) {
    if ($failed_attempts > $attempts) {
        // we need to throttle based on delay
        if (is_numeric($delay)) {
            $remaining_delay = time() - $latest_attempt - $delay;
            // output remaining delay
            echo 'You must wait ' . $remaining_delay . ' seconds before your next login attempt';
        } else {
            // code to display recaptcha on login form goes here
        }
        break;
    }
}

Mit reCaptcha bei einer bestimmten Schwelle sicherstellen würde, dass ein Angriff von mehreren Fronten wäre minimiert und normale Website-Nutzer würden nicht zu einer erheblichen Verzögerung für legitime fehlgeschlagener Anmeldeversuche erleben. Ich kann nicht Prävention gaurantee, wie es bereits erweitert wurde, kann auf dem CAPTCHA gesprengte werden. Es gibt alternative Lösungen, vielleicht eine Variante von „Nennen Sie dieses Tier“, die als Ersatz ganz gut funktionieren könnte.

Jens' -Regelung in einen Pseudozustandsübergangsdiagramm / Regeldatenbank zusammenfassen:

  1. Benutzer + Passwort -> Eintrag
  2. Benutzer + Passwort -> verweigert
  3. user + known_IP (Benutzer) -> Haustür, // never throttle
  4. user + unknown_IP (Benutzer) -> catflap
  5. (# verweigert> n) über catflaps (Ort) -> Drossel catflaps (Website) // slow the bots
  6. catflap + Gas + Passwort + captcha -> Eintrag // humans still welcome
  7. catflap + Gas + Passwort + captcha -> verweigert // a correct guess from a bot

Bemerkungen:

  • Sie niemals drosseln die Haustür. Die Elbonian Staatspolizei haben Sie Ihren Computer in Ihrem Hause, ist aber nicht in der Lage, Sie zu befragen. Brute-Force ist ein gangbarer Weg von Ihrem Computer.
  • Wenn Sie einen bieten „Vergessenes Ihr Passwort vergessen?“ Link, dann Ihr E-Mail-Konto wird Teil der Angriffsfläche.

Diese Beobachtungen decken eine andere Art von Angriff auf die, die Sie auf Zähler versuchen.

Sieht aus wie Sie gegen verteilt Brute langsam Kraft . Nicht viel können Sie dagegen tun können. Wir verwenden eine PKI und kein Passwort-Logins. Es hilft, aber wenn Ihre Kunden Arbeitsplätze in einer während jeder einmal die Chance, das ist nicht sehr anwendbar.

Disclaimer: Ich arbeite für ein Zwei-Faktor-Unternehmen, aber ich bin nicht hier, um es zu verstopfen. Here're einige Beobachtungen.

Cookies können mit XSS und Browser vulns gestohlen werden. Benutzer häufig Browser ändern oder ihre Cookies löschen.

Quell-IP-Adressen gleichzeitig dynamisch variabel und fälschbare.

Check Captcha ist nützlich, aber keine spezifische menschliche authentifizieren.

Mehrere Methoden erfolgreich kombiniert werden können, aber guter Geschmack ist sicherlich in Ordnung.

Kennwortkomplexität ist gut, etwas kennwortbasierte hängt entscheidend von Passwörtern ausreichend Entropie ist. IMHO, ein starkes Passwort an einem sicheren physischen Standort niedergeschrieben ist besser als ein schwaches Passwort im Speicher. Die Leute wissen, wie die Sicherheit von Papierdokumenten viel besser zu bewerten, als sie wissen, wie die effektive Entropie Figur im Namen ihres Hundes, wenn sie als Passwort für drei verschiedene Websites verwendet werden. Betrachten wir den Benutzern die Möglichkeit geben Verwendung Pass-Codes auszudrucken eine große oder kleine Seite voller einmalig.

Sicherheitsfragen wie „Was waren Ihre High-School-Maskottchen“ sind meist andere miese Form von „etwas, was Sie wissen“, die meisten von ihnen leicht zu erraten sind oder gar in der Public Domain.

Wie Sie bemerkt, gedrosselt fehlgeschlagenen Anmeldeversuchen ist ein Kompromiss zwischen der Verhinderung von Brute-Force-Angriffen und einfachen ein Konto der Dosiertechnik. Aggressive Sperrungsrichtlinien einen Mangel an Vertrauen in Passwort Entropie widerspiegeln.

Ich persönlich sehe nicht, die den Nutzen Kennwortablauf auf einer Website sowieso zu erzwingen. Attacker bekommt Ihr Passwort einmal, er es dann ändern kann und entspricht diese Politik ebenso einfach wie möglich. Vielleicht ein Vorteil ist, dass der Benutzer früher möglicherweise feststellen, wenn der Angreifer das Kennwort ändert. Noch besser wäre es, wenn die die Benutzer wurden irgendwie benachrichtigt, bevor der Angreifer Zugriff gewonnen. Meldungen wie „N Fehlversuche seit der letzten Anmeldung“ sind in dieser Hinsicht nützlich.

Die beste Sicherheit kommt von einem zweiten Faktor-Authentifizierung, die Out-of-Band ist relativ zum ersten. Wie Sie schon sagten, Hardware-Token in dem „etwas haben Sie“ sind groß, aber viele (nicht alle) haben Kopf echter Server-Betreiber mit ihrer Verteilung verbunden. Ich weiß nicht, jeder biometrischen Lösungen gut für Webseiten „etwas, das Sie sind“. Einige Zwei-Faktor-Lösungen arbeiten mit OpenID-Provider, haben einige PHP / Perl / Python SDKs.

Meine höchste Empfehlung sicher zu einfach zu machen, ist, dass Sie auf halte Benutzer informiert der schlechten Login-Versuche auf ihre accounts-- Die Nutzer werden wahrscheinlich die Stärke ihres Passwortes nehmen viel ernster, wenn sie Beweise vorgelegt werden, dass jemand tatsächlich versucht, auf ihr Konto zu erhalten.

ich jemand tatsächlich gefangen, die in meinem Bruder myspace Account gehackt, weil sie für ihn in den Google Mail-Konto ich ein Setup zu erhalten und verwendet die ‚Reset mein Passwort per E-Mail‘ -Funktion ..., die zu meinem Posteingang ging versucht hatte.

  1. Was ist ein einmaliges Passwort erfordern, bevor ihr normales Passwort eingegeben? Das würde es sehr offensichtlich, dass jemand angreifen, bevor sie viele Möglichkeiten hatten das Haupt-Passwort zu erraten?

  2. Halten Sie eine globale Zählung / Rate von Anmeldefehlern - das ist der Indikator für einen Angriff - während eines Angriffs sein strenger zu Anmeldefehlern z.B. Verbot von IP-Adressen schneller.

Ich glaube nicht, dass es eine perfekte Antwort, aber ich wäre geneigt, sie auf einer Basis zu nähern versuchen, die Roboter zu verwirren, wenn ein Angriff erkannt wird.

Aus der Spitze von meinem Kopf:

Wechseln Sie zu einem alternativen Login-Bildschirm. Es hat mehr Benutzername und Passwort Rohlingen, die wirklich erscheinen, aber nur einer von ihnen ist in der richtigen Stelle. Die Feldnamen sind RANDOM - ein Sitzungsschlüssel zusammen mit dem Anmeldebildschirm gesendet wird, kann der Server dann herausfinden, welche Felder sind was. Erfolg oder Misserfolg ist es dann verworfen, so dass Sie nicht eine Replay-Attacke versuchen können -. Wenn Sie das Passwort lehnen sie erhalten eine neue Sitzungs-ID

Jede Form, die mit Daten in einem falschen Feld ausgesetzt wird, wird davon ausgegangen, von einem Roboter sein - die Anmeldung fehlschlägt, Zeit, und das IP gedrosselt wird. Stellen Sie sicher, dass die Zufallsfeldnamen nie die legit Feldnamen übereinstimmen, damit jemand etwas verwenden, das Passwörter erinnert sich nicht täuschen.

Als nächstes, wie wäre es eine andere Art von Sicherheitscode: Sie können eine Reihe von Fragen, die keine Probleme für einen Menschen verursacht. Allerdings sind sie nicht zufällig. Wenn beginnt der Angriff jeder # Frage 1 gegeben. Nach einer Stunde Frage # 1 wird verworfen, nie wieder verwendet werden und jeder bekommt Frage # 2 und so weiter.

Der Angreifer kann nicht wegen des Wegwerf-Charakters der Fragen sondiert die Datenbank zum Download in seinen Roboter zu setzen. Er hat neue Anweisungen innerhalb einer Stunde jede Möglichkeit, etwas zu tun zu haben, um seine Botnet zu senden.

Da mehrere Leute CAPTCHA als Ausweich menschlichen Mechanismus enthalten, ich hinzufüge, eine frühere Frage Stackoverflow und Faden auf CAPTCHA Wirksamkeit.

Wurde reCaptcha geknackt / gehackt / OCR / besiegt / gebrochen?

CAPTCHA Verwendung nicht eingeschränkt Verbesserungen von Ihrer Drosselung und anderen Vorschlägen, aber ich denke, die Zahl der Antworten, die CAPTCHA als Ausweich gehören sollte die Mensch-basierten Methoden zur Verfügung, um Menschen betrachtet suchen Sicherheit zu brechen.

Sie auch Gas auf die Stärke eines Benutzer-Passwort basiert könnte.

Wenn ein Benutzer registriert oder ändert ihr Passwort, das Sie berechnen eine Stärke-Rating für ihr Passwort, sagen wir zwischen 1 und 10.

So etwas wie „Passwort“ aktuelle 1, während „c6eqapRepe7et * Awr @ ch“ könnte ein 9 oder 10 und je höher die Punktzahl, je länger und erzielt die zur Drosselung nimmt zu treten.

Die erste Antwort, die ich in der Regel gehört habe, wenn diese Frage ist Ports zu ändern, aber vergessen, dass und nur IPv4 deaktivieren. Wenn Sie nur Kunden von IPv6-Netzwerken erlauben nicht mehr you'r für einfaches Scannen im Netzwerk beten und Angreifer zu DNS-Lookups greifen. Sie nicht auf derselben Adresse wie Apache (AAAA) / Sendmail laufen (MX-> AAAA) / Was haben Sie für jedermann (AAAA) ausgegeben. Stellen Sie sicher, dass Ihre Zone kann nicht xferd werden, warten you'r so dass Ihre Zone von jedermann heruntergeladen werden?

Wenn die Bots Ihre Server-Setup neue Host-Namen zu finden, prepend nur einige Kauderwelsch zu Ihren Host-Namen und Ihre Adresse ändern. Lassen Sie die alten Namen und sogar Setup ** Honeypot-Namen für die Bot-Netz-Timeout auf.

** Testen Sie Ihre Reverse (PTR) Datensätze (unter ip6.arpa.) Zu sehen, ob sie auf / 4 ist auf Null verwendet werden können, die Datensätze haben VS / 4s, das nicht zu tun. I.E. Typischerweise würde ip6.arpa haben ~ 32 „“ s in einer Adresse, aber mit dem letzten fehlenden versuchen könnte die Netzwerkblöcke entziehen sich die Datensätze VS andere, die dies nicht tun. Wenn Sie, dass weitere nehmen wird es möglich, große Teile des Adressraumes zu überspringen.

Im schlimmsten Fall können Benutzer wird eine IPv6-Tunnel eingerichtet haben, ist es nicht wie sie so weit wie VPNing in einer DMZ gehen müsste ... Obwohl man sich fragt, warum das ist nicht die erste Option.

Auch Kerberos ist cool, aber IMHO LDAP Schläge (Was mit nisplus technisch falsch? Ich habe gelesen, dass Sun entschieden, dass Benutzer LDAP wollte und aus diesem Grund ließen sie NIS +). Kerberos funktioniert gut ohne LDAP oder NIS, muß nur die Benutzer von Host-Basis auf einen Host verwalten. Kerberos gibt Ihnen eine einfache, zu verwenden, wenn nicht automatisiert, PKI.

Bit spät hier, aber ich dachte, ein harter Fall vorausgesetzt - verwendet der Angreifer viele zufällige IP-Adressen, zufällige Benutzernamen und ein zufälliges Passwort aus sagen ausgewählt eine Liste der 10.000 beliebtesten

.

Eine Sache, die Sie tun können, vor allem, wenn das System scheint unter Beschuss, dass es gibt eine Menge falscher Kennwortversuche auf das System und vor allem, wenn das Passwort ist niedriger Entropie ist wie eine sekundäre Frage zu fragen, was sind deine Eltern Vornamen , beispielsweise. Wenn ein Angreifer eine Million Konten trifft das Passwort versuchen ‚password1‘ gibt es eine gute Chance, dass sie viel bekommen, aber ihre Chancen, auch direkt die Namen bekommen würde dramatisch Erfolge reduzieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top