In Ordnung, genug Abwürgen; Folgendes habe ich mir bisher ausgedacht
(Entschuldigung, langer Beitrag voraus. Sei mutig, Freund, die Reise wird sich lohnen.)
Kombinieren Sie die Methoden 3 und 4 aus dem ursprünglichen Beitrag zu einer Art "Fuzzy" - oder dynamischer Whitelist und blockieren Sie dann - und hier ist der Trick - nicht IPs ohne Whitelist, sondern drosseln Sie sie nur in die Hölle und zurück .
Beachten Sie, dass diese Maßnahme nur dazu gedacht ist, diese sehr spezifische Art von Angriff zu vereiteln. In der Praxis würde dies natürlich in Kombination mit anderen Best-Practice-Ansätzen zur Authentifizierung funktionieren: Drosselung fester Benutzernamen, Drosselung pro IP, Code-erzwungene Richtlinie für strenge Kennwörter, nicht gedrosselte Cookie-Anmeldung, Hashing aller Kennwortäquivalente vor dem Speichern, niemals mit Sicherheitsfragen usw.
Annahmen zum Angriffsszenario
Wenn ein Angreifer auf variable Benutzernamen abzielt, wird die Drosselung unserer Benutzernamen nicht ausgelöst. Wenn der Angreifer ein Botnetz verwendet oder Zugriff auf einen großen IP-Bereich hat, ist unsere IP-Drosselung machtlos. Wenn der Angreifer unsere Benutzerliste vorab überprüft hat (normalerweise bei Webdiensten mit offener Registrierung möglich), können wir keinen laufenden Angriff anhand der Anzahl der Fehler "Benutzer nicht gefunden" erkennen. Und wenn wir eine restriktive systemweite Drosselung (alle Benutzernamen, alle IPs) erzwingen, wird jeder solche Angriff unsere gesamte Site für die Dauer des Angriffs plus der Drosselungsperiode betreffen.
Also müssen wir etwas anderes tun.
Der erste Teil der Gegenmaßnahme: Whitelisting
Wir können ziemlich sicher sein, dass der Angreifer die IP-Adressen mehrerer tausend unserer Benutzer (+) nicht erkennen und dynamisch fälschen kann. Das macht Whitelisting möglich. Mit anderen Worten: Für jeden Benutzer speichern wir eine Liste der (gehashten) IPs, von denen aus sich der Benutzer zuvor (kürzlich) angemeldet hat.
Daher fungiert unser Whitelist-Schema als verschlossene "Haustür", an der ein Benutzer von einer seiner anerkannten "guten" IPs aus verbunden sein muss, um sich überhaupt anzumelden. Ein Brute-Force-Angriff auf diese 'Haustür' wäre praktisch unmöglich (+).
(+) Wenn der Angreifer nicht entweder den Server, alle Boxen unserer Benutzer oder die Verbindung selbst "besitzt" - und in diesen Fällen haben wir kein "Authentifizierungs" -Problem mehr, haben wir ein echtes Franchise-Unternehmen -Stecker FUBAR Situation
Der zweite Teil der Gegenmaßnahme: Systemweite Drosselung nicht erkannter IPs
Damit eine Whitelist für einen Webdienst mit offener Registrierung funktioniert, bei dem Benutzer häufig den Computer wechseln und / oder eine Verbindung über dynamische IP-Adressen herstellen, müssen wir eine "Katzentür" offen halten, damit Benutzer eine Verbindung von nicht erkannten IP-Adressen herstellen können. Der Trick besteht darin, diese Tür so zu gestalten, dass Botnets hängen bleiben und legitime Benutzer so wenig wie möglich gestört werden .
In meinem Schema wird dies erreicht, indem eine sehr restriktive maximale Anzahl fehlgeschlagener Anmeldeversuche durch nicht genehmigte IPs über einen Zeitraum von beispielsweise 3 Stunden festgelegt wird (je nach Art des Dienstes kann es sinnvoller sein, einen kürzeren oder längeren Zeitraum zu verwenden) diese Einschränkung global machen , dh. für alle Benutzerkonten.
Selbst eine langsame (1-2 Minuten zwischen den Versuchen) Brute Force würde mit dieser Methode schnell und effektiv erkannt und vereitelt. Natürlich könnte eine wirklich langsame Brute Force immer noch unbemerkt bleiben, aber zu langsame Geschwindigkeiten machen den eigentlichen Zweck des Brute Force-Angriffs zunichte.
Was ich mit diesem Drosselmechanismus erreichen möchte, ist, dass bei Erreichen der Höchstgrenze unsere "Katzentür" für eine Weile zugeschlagen wird, unsere Vordertür jedoch für legitime Benutzer offen bleibt, die auf übliche Weise eine Verbindung herstellen:
- Entweder durch Herstellen einer Verbindung von einer ihrer erkannten IPs
- Oder indem Sie ein dauerhaftes Login-Cookie verwenden (von überall)
Die einzigen legitimen Benutzer, die während eines Angriffs betroffen wären - dh. während die Drosselung aktiviert war - wären Benutzer ohne dauerhafte Anmelde-Cookies, die sich von einem unbekannten Ort oder mit einer dynamischen IP anmelden. Diese Benutzer können sich erst anmelden, wenn die Drosselung nachgelassen hat (was möglicherweise eine Weile dauern kann, wenn der Angreifer sein Botnetz trotz Drosselung am Laufen hält).
Um dieser kleinen Gruppe von Benutzern zu ermöglichen, sich durch die ansonsten versiegelte Katzentür zu quetschen, selbst wenn noch Bots darauf hämmerten, würde ich ein 'Backup'-Anmeldeformular mit einem CAPTCHA verwenden. Wenn Sie also die Meldung "Entschuldigung, aber Sie können sich derzeit nicht von dieser IP-Adresse aus anmelden" anzeigen, fügen Sie einen Link mit der Aufschrift " Sichere Backup-Anmeldung - NUR MENSCHEN ( Bots: kein Lügen ) " hinzu. Scherz beiseite, wenn sie auf diesen Link klicken, geben Sie ihnen ein reCAPTCHA-authentifiziertes Anmeldeformular, das die Site-weite Drosselung umgeht. Auf diese Weise wird ihnen , wenn sie menschlich sind UND das richtige Login + Passwort kennen (und CAPTCHAs lesen können), niemals der Dienst verweigert, selbst wenn sie eine Verbindung von einem unbekannten Host herstellen und das Autologin-Cookie nicht verwenden.
Oh, und nur zur Klarstellung: Da ich CAPTCHAs im Allgemeinen als böse betrachte, wird die Anmeldeoption "Backup" nur angezeigt, wenn die Drosselung aktiv war .
Es ist nicht zu leugnen, dass ein solcher anhaltender Angriff immer noch eine Form von DoS-Angriff darstellt, aber mit dem beschriebenen System würde es nur das beeinflussen, was ich für eine winzige Untergruppe von Benutzern halte, nämlich Leute, die das nicht verwenden Cookie "Erinnere dich an mich" UND melde dich zufällig an, während ein Angriff stattfindet UND melde dich nicht von einer ihrer üblichen IP-Adressen an UND wer CAPTCHAs nicht lesen kann. Nur diejenigen, die zu ALLEN dieser Kriterien Nein sagen können - insbesondere Bots und wirklich unglückliche behinderte Menschen - werden während eines Bot-Angriffs abgewiesen.
BEARBEITEN : Eigentlich habe ich mir eine Möglichkeit überlegt, selbst von CAPTCHA herausgeforderte Benutzer während einer Sperrung durchzulassen: Anstelle oder als Ergänzung zum Backup-CAPTCHA-Login kann der Benutzer eine Option für die einmalige Verwendung erhalten , benutzerspezifischer Sperrcode, der an seine E-Mail gesendet wird und mit dem er dann die Drosselung umgehen kann. Dies überschreitet definitiv meine "Ärger" -Schwelle, aber da es nur als letzter Ausweg für eine winzige Untergruppe von Benutzern verwendet wird und es immer noch besser ist, von Ihrem Konto ausgeschlossen zu werden, wäre es akzeptabel.
(Beachten Sie auch, dass nichts davon passiert, wenn der Angriff weniger ausgefeilt ist als die böse verteilte Version, die ich hier beschrieben habe. Wenn der Angriff nur von wenigen IPs ausgeht oder nur wenige Benutzernamen trifft, wird er viel früher vereitelt und ohne standortweite Konsequenzen)
Das ist also die Gegenmaßnahme, die ich in meiner Authentifizierungsbibliothek implementieren werde, sobald ich überzeugt bin, dass es solide ist und dass es keine viel einfachere Lösung gibt, die ich verpasst habe. Tatsache ist, dass es so viele subtile Möglichkeiten gibt, Dinge in Bezug auf Sicherheit falsch zu machen, und ich bin nicht überfordert, falsche Annahmen oder hoffnungslos fehlerhafte Logik zu treffen. Daher sind alle Rückmeldungen, Kritik und Verbesserungen, Feinheiten usw. sehr willkommen.