TEIL I: Wie man sich anmeldet
Wir gehen davon aus, dass Sie bereits wissen, wie man ein Login+Passwort-HTML-Formular erstellt, das die Werte zur Authentifizierung an ein Skript auf der Serverseite sendet. Die folgenden Abschnitte befassen sich mit Mustern für eine solide, praktische Authentifizierung und wie man die häufigsten Sicherheitsfallen vermeidet.
Zu HTTPS oder nicht zu HTTPS?
Wenn die Verbindung nicht bereits sicher ist (d. h. über HTTPS mit SSL/TLS getunnelt), werden die Werte Ihres Anmeldeformulars im Klartext gesendet, so dass jeder, der die Verbindung zwischen Browser und Webserver abhört, die Anmeldedaten lesen kann, während sie übertragen werden. Diese Art des Abhörens wird routinemäßig von Regierungen durchgeführt, aber im Allgemeinen werden wir uns nicht mit "eigenen" Leitungen befassen, außer um dies zu sagen: Verwenden Sie einfach HTTPS.
Im Grunde genommen ist die einzige praktisch Eine Möglichkeit, sich gegen Abhören/Paketschnüffeln während der Anmeldung zu schützen, ist die Verwendung von HTTPS oder eines anderen zertifikatsbasierten Verschlüsselungsverfahrens (z. B., TLS ) oder ein bewährtes und getestetes Challenge-Response-Schema (zum Beispiel das Diffie-Hellman -basierten SRP). Jede andere Methode kann leicht umgangen werden durch einen abhörenden Angreifer.
Wenn Sie bereit sind, ein wenig unpraktisch zu werden, können Sie natürlich auch eine Form der Zwei-Faktor-Authentifizierung verwenden (z. B. die Google Authenticator-App, ein physisches Codebuch im Stil des Kalten Krieges oder einen RSA-Schlüsselgenerator-Dongle). Bei richtiger Anwendung könnte dies sogar mit einer ungesicherten Verbindung funktionieren, aber es ist schwer vorstellbar, dass ein Entwickler bereit wäre, eine Zwei-Faktor-Authentifizierung zu implementieren, aber nicht SSL.
(Nicht) Roll-your-own JavaScript-Verschlüsselung/Hashing
Angesichts der wahrgenommenen (aber inzwischen vermeidbar ) Kosten und technische Schwierigkeiten bei der Einrichtung eines SSL-Zertifikats auf Ihrer Website, sind einige Entwickler versucht, ihre eigenen browserinternen Hashing- oder Verschlüsselungsschemata zu entwickeln, um zu vermeiden, dass Anmeldungen im Klartext über eine ungesicherte Leitung übertragen werden.
Dies ist zwar ein edler Gedanke, aber im Grunde genommen nutzlos (und kann ein Sicherheitslücke ), es sei denn, sie wird mit einem der oben genannten Verfahren kombiniert, d. h. entweder mit einer starken Verschlüsselung oder mit einem bewährten Challenge-Response-Mechanismus (wenn Sie nicht wissen, was das ist, sollten Sie wissen, dass es sich um eines der am schwierigsten zu beweisenden, am schwierigsten zu entwickelnden und am schwierigsten zu implementierenden Konzepte der digitalen Sicherheit handelt).
Es stimmt zwar, dass das Hashing des Passworts kann sein wirksam gegen Offenlegung des Passworts Wenn ein Angreifer ein paar Bytes in Ihre ungesicherte HTML-Seite einschleusen kann, bevor sie Ihren Browser erreicht, kann er das Hashing im JavaScript einfach auskommentieren. Außerdem ist es anfällig für Brute-Force-Angriffe (da Sie dem Angreifer sowohl den Benutzernamen, das Salt als auch das gehashte Passwort übergeben).
CAPTCHAS gegen die Menschheit
CAPTCHA soll eine bestimmte Kategorie von Angriffen vereiteln: automatisierte Wörterbuch-/Brute-Force-Versuche ohne menschlichen Bediener. Es besteht kein Zweifel, dass dies eine reale Bedrohung ist, aber es gibt Möglichkeiten, nahtlos damit umzugehen, die kein CAPTCHA erfordern, insbesondere richtig konzipierte serverseitige Anmeldedrosselungssysteme - wir werden diese später besprechen.
Wisse, dass CAPTCHA-Implementierungen nicht gleich sind; sie sind oft nicht von Menschen lösbar, die meisten von ihnen sind tatsächlich unwirksam gegen Bots, alle von ihnen sind unwirksam gegen billige Arbeit aus der Dritten Welt (laut OWASP (der derzeitige Ausbeutungspreis beträgt 12 $ pro 500 Tests), und einige Implementierungen können in einigen Ländern technisch illegal sein (siehe OWASP-Authentifizierungs-Spickzettel ). Wenn Sie ein CAPTCHA verwenden müssen, verwenden Sie das von Google reCAPTCHA da es per Definition OCR-schwer ist (da es bereits OCR-missklassifizierte Buchscans verwendet) und sich sehr bemüht, benutzerfreundlich zu sein.
Ich persönlich empfinde CAPTCHAS eher als lästig und verwende sie nur als letztes Mittel, wenn ein Benutzer sich mehrmals nicht anmelden konnte und die Drosselungszeiten ausgeschöpft sind. Das kommt so selten vor, dass es akzeptabel ist, und es stärkt das System insgesamt.
Speichern von Passwörtern / Überprüfen von Anmeldungen
Nach all den öffentlichkeitswirksamen Hacks und Datenlecks, die in den letzten Jahren aufgetreten sind, ist dies vielleicht schon allgemein bekannt, aber es muss einfach gesagt werden: Speichern Sie keine Passwörter im Klartext in Ihrer Datenbank. Benutzerdatenbanken werden routinemäßig gehackt, geleakt oder durch SQL-Injektion ausgelesen, und wenn Sie Passwörter im Klartext speichern, ist es mit der Anmeldesicherheit sofort vorbei.
Wenn Sie also das Kennwort nicht speichern können, wie überprüfen Sie dann, ob die Kombination aus Login und Kennwort, die vom Anmeldeformular gepostet wird, korrekt ist? Die Antwort ist Hashing mit einer Schlüsselableitungsfunktion . Jedes Mal, wenn ein neuer Benutzer angelegt oder ein Passwort geändert wird, lassen Sie das Passwort durch ein KDF wie Argon2, bcrypt, scrypt oder PBKDF2 laufen und verwandeln das Klartext-Passwort ("correcthorsebatterystaple") in eine lange, zufällig aussehende Zeichenkette, die in Ihrer Datenbank viel sicherer zu speichern ist. Um eine Anmeldung zu verifizieren, führen Sie dieselbe Hash-Funktion für das eingegebene Kennwort aus, wobei Sie diesmal das Salt hinzufügen und die resultierende Hash-Zeichenkette mit dem in Ihrer Datenbank gespeicherten Wert vergleichen. Argon2, bcrypt und scrypt speichern das Salz bereits mit dem Hashwert. Schauen Sie sich dies an Artikel auf sec.stackexchange für ausführlichere Informationen.
Der Grund, warum ein Salt verwendet wird, ist, dass Hashing an sich nicht ausreicht - man muss ein sogenanntes "Salt" hinzufügen, um den Hash gegen Regenbogentische . Ein Salt verhindert, dass zwei Passwörter, die genau übereinstimmen, als derselbe Hash-Wert gespeichert werden, so dass nicht die gesamte Datenbank in einem Durchgang gescannt werden kann, wenn ein Angreifer einen Passwort-Rate-Angriff durchführt.
Ein kryptografischer Hash sollte nicht für die Speicherung von Passwörtern verwendet werden, da vom Benutzer gewählte Passwörter nicht stark genug sind (d. h. in der Regel nicht genug Entropie enthalten) und ein Angreifer mit Zugang zu den Hashes in relativ kurzer Zeit ein Passwort erraten könnte. Aus diesem Grund werden KDFs verwendet, die effektiv "Den Schlüssel strecken" Das bedeutet, dass der Hash-Algorithmus bei jedem Erraten des Kennworts durch einen Angreifer mehrfach wiederholt wird, z. B. 10.000 Mal, wodurch der Angreifer das Kennwort 10.000 Mal langsamer erraten kann.
Sitzungsdaten - "Sie sind eingeloggt als Spiderman69"
Sobald der Server die Anmeldung und das Kennwort mit Ihrer Benutzerdatenbank abgeglichen und eine Übereinstimmung gefunden hat, muss das System eine Möglichkeit haben, sich zu merken, dass der Browser authentifiziert worden ist. Diese Tatsache sollte immer nur serverseitig in den Sitzungsdaten gespeichert werden.
Wenn Sie mit Sitzungsdaten nicht vertraut sind, erfahren Sie hier, wie sie funktionieren: Eine einzelne, zufällig erzeugte Zeichenfolge wird in einem ablaufenden Cookie gespeichert und verwendet, um auf eine Sammlung von Daten - die Sitzungsdaten - zu verweisen, die auf dem Server gespeichert sind. Wenn Sie ein MVC-Framework verwenden, wird dies zweifelsohne bereits gehandhabt.
Vergewissern Sie sich nach Möglichkeit, dass das Sitzungscookie beim Senden an den Browser die Flags "Sicher" und "Nur HTTP" gesetzt hat. Das HttpOnly-Flag bietet einen gewissen Schutz gegen das Auslesen des Cookies durch XSS-Angriffe. Das Secure-Flag sorgt dafür, dass das Cookie nur über HTTPS zurückgesendet wird, und schützt somit vor Netzwerk-Sniffing-Angriffen. Der Wert des Cookies sollte nicht vorhersehbar sein. Wenn ein Cookie, das auf eine nicht existierende Sitzung verweist, vorgelegt wird, sollte sein Wert sofort ersetzt werden, um zu verhindern, dass Sitzungsfixierung .
Der Sitzungsstatus kann auch auf der Client-Seite beibehalten werden. Dies wird durch die Verwendung von Techniken wie JWT (JSON Web Token) erreicht.
TEIL II: Wie man eingeloggt bleibt - Die berüchtigte "Remember Me"-Checkbox
Persistente Anmelde-Cookies ("remember me"-Funktionalität) sind eine Gefahrenzone; einerseits sind sie genauso sicher wie herkömmliche Anmeldungen, wenn die Benutzer wissen, wie sie damit umgehen müssen, andererseits stellen sie ein enormes Sicherheitsrisiko in den Händen unvorsichtiger Benutzer dar, die sie möglicherweise auf öffentlichen Computern verwenden und vergessen, sich abzumelden, und die möglicherweise nicht wissen, was Browser-Cookies sind oder wie man sie löscht.
Ich persönlich mag dauerhafte Logins für die Websites, die ich regelmäßig besuche, aber ich weiß, wie ich sie sicher handhaben kann. Wenn Sie sicher sind, dass Ihre Benutzer dasselbe wissen, können Sie mit gutem Gewissen dauerhafte Anmeldungen verwenden. Wenn nicht - nun, dann können Sie sich der Philosophie anschließen, dass Benutzer, die unvorsichtig mit ihren Anmeldedaten umgehen, es selbst verschuldet haben, wenn sie gehackt werden. Es ist ja nicht so, dass wir zu unseren Benutzern nach Hause gehen und all die Post-It-Zettel mit Passwörtern abreißen, die sie am Rande ihrer Monitore aufgereiht haben, um sich den Mund fusselig zu reden.
Natürlich können es sich manche Systeme nicht leisten, eine cualquier Konten gehackt werden; für solche Systeme gibt es keine Möglichkeit, dauerhafte Logins zu rechtfertigen.
Wenn Sie sich dafür entscheiden, dauerhafte Anmelde-Cookies zu verwenden, gehen Sie folgendermaßen vor:
-
Nehmen Sie sich zunächst etwas Zeit zum Lesen Der Artikel der Paragon Initiative zu diesem Thema. Sie müssen eine Reihe von Elementen richtig, und der Artikel macht eine gute Arbeit der Erklärung jedes.
-
Und um noch einmal auf einen der häufigsten Fallstricke hinzuweisen, SPEICHERN SIE DEN DAUERHAFTEN LOGIN-COOKIE (TOKEN) NICHT IN IHRER DATENBANK, SONDERN NUR EINEN HASH DAVON! Das Login-Token ist passwortgleich, d. h., wenn ein Angreifer Ihre Datenbank in die Hände bekäme, könnte er die Token verwenden, um sich bei jedem Konto anzumelden, als ob es sich um eine Klartext-Kombination aus Login und Passwort handeln würde. Verwenden Sie daher Hashing (gemäß https://security.stackexchange.com/a/63438/5002 ein schwacher Hash reicht für diesen Zweck völlig aus), wenn dauerhafte Anmeldetoken gespeichert werden.
TEIL III: Geheime Fragen verwenden
Keine "Geheimfragen" einführen . Die Funktion "geheime Fragen" ist ein Sicherheitsmusterstück. Lesen Sie das Papier unter Link Nummer 4 auf der MUST-READ-Liste. Sie können Sarah Palin danach fragen, nachdem ihr Yahoo!-E-Mail-Konto während einer früheren Präsidentschaftskampagne gehackt wurde, weil die Antwort auf ihre Sicherheitsfrage lautete... "Wasilla High School"!
Selbst bei benutzerspezifischen Fragen ist es sehr wahrscheinlich, dass die meisten Nutzer eine der beiden Möglichkeiten wählen:
-
Eine "Standard"-Geheimfrage wie der Mädchenname der Mutter oder das Lieblingstier
-
Eine einfache Kleinigkeit, die jeder aus seinem Blog, LinkedIn-Profil oder ähnlichem übernehmen könnte
-
Jede Frage, die leichter zu beantworten ist als das Erraten des Passworts. Für ein anständiges Passwort sind das alle Fragen, die Sie sich vorstellen können
Zusammenfassend lässt sich sagen, dass Sicherheitsfragen in praktisch all ihren Formen und Variationen von Natur aus unsicher sind und aus keinem Grund in einem Authentifizierungsschema verwendet werden sollten.
Der wahre Grund, warum es Sicherheitsfragen überhaupt gibt, ist, dass sie die Kosten für ein paar Support-Anrufe von Nutzern sparen, die keinen Zugriff auf ihre E-Mail haben, um an einen Reaktivierungscode zu gelangen. Dies geschieht auf Kosten der Sicherheit und des Rufs von Sarah Palin. Ist es das wert? Wahrscheinlich nicht.
TEIL IV: Funktionalität für vergessene Passwörter
Ich habe bereits erwähnt, warum Sie niemals Sicherheitsfragen verwenden für den Umgang mit vergessenen/verlorenen Benutzerkennwörtern; es versteht sich auch von selbst, dass Sie den Benutzern niemals ihre aktuellen Kennwörter per E-Mail zusenden sollten. In diesem Bereich gibt es mindestens zwei weitere, allzu häufige Fallstricke, die es zu vermeiden gilt:
-
Nicht zurücksetzen ein vergessenes Passwort zu einem automatisch generierten starken Passwort - solche Passwörter sind notorisch schwer zu merken, was bedeutet, dass der Benutzer es entweder ändern oder aufschreiben muss - z. B. auf einem leuchtend gelben Post-It am Rande seines Monitors. Anstatt ein neues Kennwort festzulegen, lassen Sie die Benutzer einfach gleich ein neues wählen - was sie ja ohnehin tun wollen. (Eine Ausnahme könnte sein, wenn die Benutzer generell einen Passwort-Manager verwenden, um Passwörter zu speichern/verwalten, die man sich ohne Aufschreiben nicht merken kann).
-
Der Code/Token des verlorenen Kennworts wird immer in der Datenbank gehasht. AGAIN Dieser Code ist ein weiteres Beispiel für ein Passwort-Äquivalent und MUSS daher gehasht werden, falls ein Angreifer Ihre Datenbank in die Hände bekommt. Wenn ein verlorener Kennwortcode angefordert wird, senden Sie den Klartextcode an die E-Mail-Adresse des Benutzers, hacken ihn, speichern den Hash in Ihrer Datenbank und das Original wegwerfen . Genau wie ein Passwort oder ein dauerhaftes Login-Token.
Ein letzter Hinweis: Stellen Sie immer sicher, dass Ihre Schnittstelle für die Eingabe des Codes für das verlorene Kennwort mindestens so sicher ist wie Ihr Anmeldeformular selbst, da ein Angreifer stattdessen einfach diese Schnittstelle benutzen wird, um Zugang zu erhalten. Sie sollten sicherstellen, dass Sie sehr lange Codes für verlorene Passwörter generieren (z. B. 16 alphanumerische Zeichen unter Berücksichtigung der Groß- und Kleinschreibung), aber Sie sollten das gleiche Drosselungsschema wie für das Anmeldeformular selbst anwenden.
TEIL V: Überprüfen der Passwortstärke
Zunächst sollten Sie diesen kleinen Artikel lesen, um sich über die Realität zu informieren: Die 500 häufigsten Passwörter
Okay, vielleicht ist die Liste nicht die kanonisch Liste der häufigsten Passwörter auf cualquier System überall aber es ist ein guter Hinweis darauf, wie schlecht die Leute ihre Passwörter wählen, wenn es keine durchgesetzte Richtlinie gibt. Außerdem sieht die Liste erschreckend ähnlich aus, wenn man sie mit öffentlich zugänglichen Analysen von kürzlich gestohlenen Passwörtern vergleicht.
Also: Da es keine Mindestanforderungen an die Passwortstärke gibt, verwenden 2 % der Nutzer eines der 20 häufigsten Passwörter. Das bedeutet: Wenn ein Angreifer nur 20 Versuche hat, ist 1 von 50 Konten auf Ihrer Website knackbar.
Um dies zu vereiteln, muss die Entropie eines Kennworts berechnet und dann ein Schwellenwert angewendet werden. Das National Institute of Standards and Technology (NIST) Sonderveröffentlichung 800-63 hat eine Reihe von sehr guten Vorschlägen. In Kombination mit einer Wörterbuch- und Tastaturlayout-Analyse (z. B. ist "qwertyuiop" ein schlechtes Passwort) können diese Vorschläge 99% aller schlecht gewählten Passwörter zurückweisen auf einem Niveau von 18 Bits Entropie. Einfaches Berechnen der Passwortstärke und Anzeige einer visuellen Stärkeanzeige für einen Nutzer ist gut, aber nicht ausreichend. Solange sie nicht durchgesetzt wird, werden viele Nutzer sie höchstwahrscheinlich ignorieren.
Einen erfrischenden Blick auf die Benutzerfreundlichkeit von Passwörtern mit hoher Entropie bietet Randall Munroes Passwortstärke xkcd wird dringend empfohlen.
Nutzen Sie Troy Hunts Wurde ich von API reingelegt? um die Passwörter der Benutzer mit den Passwörtern zu vergleichen, die bei öffentlichen Datenschutzverletzungen kompromittiert wurden.
TEIL VI: Viel mehr - oder: Verhinderung von Schnellfeuer-Anmeldeversuchen
Werfen wir zunächst einen Blick auf die Zahlen: Geschwindigkeit der Passwortwiederherstellung - Wie lange hält Ihr Passwort stand?
Wenn Sie nicht die Zeit haben, die Tabellen in diesem Link durchzusehen, finden Sie hier eine Liste der Tabellen:
-
Es braucht praktisch keine Zeit ein schwaches Passwort zu knacken, selbst wenn man es mit einem Abakus knackt
-
Es braucht praktisch keine Zeit ein alphanumerisches 9-Zeichen-Passwort zu knacken, wenn es Groß- und Kleinschreibung wird nicht berücksichtigt
-
Es braucht praktisch keine Zeit ein kompliziertes Passwort mit Symbolen, Buchstaben und Zahlen, Groß- und Kleinschreibung zu knacken, wenn es weniger als 8 Zeichen lang (ein Desktop-PC kann den gesamten Schlüsselraum bis zu 7 Zeichen in wenigen Tagen oder sogar Stunden durchsuchen)
-
Es würde jedoch unverhältnismäßig viel Zeit in Anspruch nehmen, selbst ein 6-Zeichen-Passwort zu knacken, wenn man auf einen Versuch pro Sekunde beschränkt wäre!
Was können wir also aus diesen Zahlen lernen? Nun, eine ganze Menge, aber wir können uns auf den wichtigsten Teil konzentrieren: die Tatsache, dass die Verhinderung einer großen Anzahl von schnell aufeinanderfolgenden Anmeldeversuchen (d. h. die brachiale Gewalt Angriff) ist wirklich nicht so schwierig. Aber es zu verhindern rechts ist nicht so einfach, wie es scheint.
Im Allgemeinen haben Sie drei Möglichkeiten, die alle gegen Brute-Force-Angriffe wirksam sind (und Wörterbuchangriffe, aber da Sie bereits eine Richtlinie für sichere Kennwörter anwenden, sollten diese kein Problem darstellen) :
-
Präsentieren Sie eine CAPTCHA nach N fehlgeschlagenen Versuchen (verdammt ärgerlich und oft unwirksam - aber ich wiederhole mich hier)
-
Konten sperren und eine E-Mail-Verifizierung nach N fehlgeschlagenen Versuchen (dies ist eine DoS Angriff zu erwarten)
-
Und schließlich, Drosselung der Anmeldung (ja, DoS-Angriffe sind immer noch möglich, aber zumindest sind sie viel unwahrscheinlicher und viel komplizierter zu bewerkstelligen).
Bewährte Praxis Nr. 1: Eine kurze Zeitverzögerung, die mit der Anzahl der Fehlversuche zunimmt, wie:
- 1 Fehlversuch = keine Verzögerung
- 2 Fehlversuche = 2 Sekunden Verzögerung
- 3 Fehlversuche = 4 Sekunden Verzögerung
- 4 Fehlversuche = 8 Sekunden Verzögerung
- 5 Fehlversuche = 16 Sekunden Verzögerung
- usw.
Ein DoS-Angriff auf dieses System wäre sehr unpraktisch, da die resultierende Sperrzeit etwas größer ist als die Summe der vorherigen Sperrzeiten.
Zur Klarstellung: Die Verzögerung ist no eine Verzögerung, bevor die Antwort an den Browser zurückgegeben wird. Es handelt sich eher um eine Zeitüberschreitung oder eine Refraktärzeit, in der Anmeldeversuche für ein bestimmtes Konto oder von einer bestimmten IP-Adresse aus nicht akzeptiert oder ausgewertet werden. Das heißt, korrekte Anmeldedaten führen nicht zu einer erfolgreichen Anmeldung, und falsche Anmeldedaten führen nicht zu einer Erhöhung der Verzögerung.
Bewährte Praxis Nr. 2: Eine mittlere Zeitverzögerung, die nach N Fehlversuchen in Kraft tritt, wie:
- 1-4 Fehlversuche = keine Verzögerung
- 5 Fehlversuche = 15-30 Minuten Verzögerung
Ein DoS-Angriff auf dieses System wäre ziemlich unpraktisch, aber durchaus machbar. Außerdem sollte man bedenken, dass eine so lange Verzögerung für einen legitimen Benutzer sehr ärgerlich sein kann. Vergessliche Benutzer werden Sie nicht mögen.
Bewährte Praxis Nr. 3: Die Kombination der beiden Ansätze - entweder eine feste, kurze Verzögerung, die nach N Fehlversuchen in Kraft tritt, wie:
- 1-4 Fehlversuche = keine Verzögerung
- 5+ Fehlversuche = 20 Sekunden Verzögerung
Oder eine zunehmende Verzögerung mit einer festen Obergrenze, etwa:
- 1 Fehlversuch = 5 Sekunden Verzögerung
- 2 Fehlversuche = 15 Sekunden Verzögerung
- 3+ Fehlversuche = 45 Sekunden Verzögerung
Dieses endgültige Schema stammt aus den OWASP-Vorschlägen für bewährte Praktiken (Link 1 aus der MUST-READ-Liste) und sollte als bewährte Praxis betrachtet werden, auch wenn es zugegebenermaßen etwas restriktiv ist.
Als Faustregel würde ich jedoch sagen: Je strenger Ihre Passwortpolitik ist, desto weniger müssen Sie die Benutzer mit Verzögerungen nerven. Wenn Sie starke Passwörter (Groß- und Kleinschreibung, alphanumerische Zeichen + erforderliche Zahlen und Symbole) mit mehr als 9 Zeichen verlangen, könnten Sie den Benutzern 2-4 unverzögerte Passwortversuche geben, bevor Sie die Drosselung aktivieren.
Ein DoS-Angriff auf dieses endgültige Anmeldedrosselungsschema wäre sehr unpraktisch. Und als letzten Schliff sollten Sie immer dauerhafte (Cookie-)Anmeldungen (und/oder ein CAPTCHA-verifiziertes Anmeldeformular) zulassen, damit legitime Benutzer nicht einmal aufgehalten werden. während der Angriff läuft . Auf diese Weise wird der sehr unpraktische DoS-Angriff zu einer extrem undurchführbarer Angriff.
Darüber hinaus ist es sinnvoll, die Drosselung von Administratorkonten zu verschärfen, da dies die attraktivsten Einstiegspunkte sind.
TEIL VII: Verteilte Brute-Force-Angriffe
Nebenbei bemerkt werden fortgeschrittene Angreifer versuchen, die Anmeldedrosselung zu umgehen, indem sie ihre Aktivitäten "ausbreiten":
-
Verteilung der Versuche auf ein Botnetz, um die Kennzeichnung von IP-Adressen zu verhindern
-
Anstatt einen Benutzer auszuwählen und die 50.000 häufigsten Passwörter auszuprobieren (was aufgrund unserer Drosselung nicht möglich ist), wählen sie DAS häufigste Passwort und probieren es stattdessen an 50.000 Benutzern aus. Auf diese Weise umgehen sie nicht nur Maßnahmen wie CAPTCHAs und Login-Drosselungen, sondern erhöhen auch ihre Erfolgschancen, da das häufigste Passwort Nummer 1 viel wahrscheinlicher ist als Nummer 49.995.
-
Die Anmeldeanfragen für die einzelnen Benutzerkonten werden in Abständen von z. B. 30 Sekunden gestellt, um unbemerkt zu bleiben.
Die beste Vorgehensweise wäre hier Protokollierung der Anzahl der fehlgeschlagenen Anmeldungen, systemweit und verwenden Sie einen laufenden Durchschnitt der Häufigkeit von Fehllogins auf Ihrer Website als Grundlage für eine Obergrenze, die Sie dann allen Benutzern auferlegen.
Zu abstrakt? Lassen Sie es mich anders ausdrücken:
Angenommen, auf Ihrer Website gab es in den letzten 3 Monaten durchschnittlich 120 unzulässige Anmeldungen pro Tag. Ausgehend von diesem (laufenden) Durchschnitt könnte Ihr System das globale Limit auf das Dreifache dieses Wertes setzen, d. h. 360 Fehlversuche in einem Zeitraum von 24 Stunden. Wenn dann die Gesamtzahl der Fehlversuche über alle Konten hinweg diese Zahl innerhalb eines Tages übersteigt (oder noch besser, wenn Sie die Beschleunigung überwachen und bei einem berechneten Schwellenwert auslösen), wird die systemweite Anmeldedrosselung aktiviert, d. h. kurze Verzögerungen für ALLE Benutzer (immer noch mit Ausnahme von Cookie-Anmeldungen und/oder Backup-CAPTCHA-Anmeldungen).
Ich habe auch eine Frage mit mehr Details und eine wirklich gute Diskussion darüber, wie man knifflige Pitfals vermeiden kann bei der Abwehr von verteilten Brute-Force-Angriffen
TEIL VIII: Zwei-Faktoren-Authentifizierung und Authentifizierungsanbieter
Anmeldedaten können kompromittiert werden, sei es durch Exploits, aufgeschriebene und verlorene Passwörter, gestohlene Laptops mit Schlüsseln oder Benutzer, die sich auf Phishing-Seiten anmelden. Anmeldungen können mit der Zwei-Faktor-Authentifizierung weiter geschützt werden, die Out-of-Band-Faktoren wie Einmal-Codes verwendet, die über einen Anruf, eine SMS, eine App oder einen Dongle empfangen werden. Mehrere Anbieter bieten Dienste zur Zwei-Faktor-Authentifizierung an.
Die Authentifizierung kann vollständig an einen Single-Sign-On-Dienst delegiert werden, bei dem ein anderer Anbieter die Erfassung der Anmeldedaten übernimmt. Dadurch wird das Problem auf eine vertrauenswürdige Drittpartei verlagert. Google und Twitter bieten beide standardbasierte SSO-Dienste, während Facebook eine ähnliche proprietäre Lösung anbietet.
MUST-READ LINKS Über Web-Authentifizierung
- OWASP-Leitfaden zur Authentifizierung / OWASP-Authentifizierungs-Spickzettel
- Dos and Don'ts of Client Authentication on the Web (sehr lesenswertes MIT-Forschungspapier)
- Wikipedia: HTTP-Cookie
- Persönliche Wissensfragen zur Fallback-Authentifizierung: Security questions in the era of Facebook (sehr lesenswertes Berkeley-Forschungspapier)
54 Stimmen
Warum wird die HTTP-Basisauthentifizierung ausgeschlossen? Sie kann in HTML-Formularen über Ajax funktionieren: peej.co.uk/artikel/http-auth-mit-html-formularen.html
56 Stimmen
HTTP Basic Auth hat die Eigenschaft, dass es (vergleichsweise) schwierig ist, einen Browser zum Vergessen zu bringen. Es ist auch furchtbar unsicher, wenn Sie es nicht mit SSL verwenden, um die Verbindung zu sichern (d. h. HTTPS).
24 Stimmen
Ich denke, es lohnt sich, über Sitzungen (einschließlich Fixierung und Hijacking), Cookies (die Flags secure und http only) und HTTP-basiertes SSO zu sprechen.
2 Stimmen
Key Stretching zur Verringerung von Wörterbuchangriffen, wenn Ihre Passwörter komprimiert sind - de.wikipedia.org/wiki/Schlüssel_Verstärkung
29 Stimmen
Die super-nützliche
HttpOnly
Cookie-Flag, das den JavaScript-basierten Cookie-Diebstahl (eine Untergruppe von XSS-Angriffen) verhindert, sollte ebenfalls irgendwo erwähnt werden.5 Stimmen
Wir sollten vielleicht einen Best-Practices-Tag oder etwas Ähnliches für ausgezeichnete Fragen und Antworten wie diese einführen.
6 Stimmen
Ich stimme für die Schließung, weil ich glaube, dass diese Frage in ihrer jetzigen Form nicht in das SO-Format passt. Eine lange Antwort, die von allen bearbeitet wird, scheint einfach falsch zu sein. Stattdessen würde ich sie umformatieren in kleine nützliche Häppchen wie bei dieser Frage (am meisten hochgestimmte Frage zu Programmers).
81 Stimmen
Wow. Ausführliche Antworten, Dutzende von Bewertungen für einige von ihnen, aber niemand erwähnt den häufigen Fehler der Bereitstellung von Anmeldeformularen über HTTP. Ich habe mich sogar mit Leuten gestritten, die sagten "aber es wird an https:// übermittelt..." und nur leere Blicke ernteten, als ich fragte, ob sie sicher seien, dass ein Angreifer die unverschlüsselte Seite, über die das Formular übermittelt wurde, nicht umgeschrieben hat.
0 Stimmen
Guter Punkt @dzuelke, ganz zu schweigen davon, dass der Nutzer keine direkte Möglichkeit hat, zu überprüfen, ob seine sensiblen Daten über eine sichere Verbindung an einen vertrauenswürdigen Server übertragen werden (ich meine die Überprüfung des Server-Zertifikats)
0 Stimmen
github.com/FallibleInc/security-guide-for-developers ist eine gute Referenz
1 Stimmen
Es gibt einen Vorschlag, die Frage in die SO-Dokumentation zu verschieben meta.stackoverflow.com/questions/332092/
0 Stimmen
Wie sieht es mit dem Zeitaufwand aus, der für das Ausfüllen des Formulars benötigt wird? Man sollte einige Nachforschungen anstellen, eine Website für Bots wie Fleisch vorlegen und die Zeit beobachten, die zum Ausfüllen und Absenden des Formulars benötigt wird. Sie sollte unter einer Sekunde liegen. Dann beobachtet man, wie lange menschliche Nutzer brauchen. Nehmen Sie einfach den Durchschnitt oder führen Sie eine Bayes-Klassifizierung durch, um den einen vom anderen zu unterscheiden...
1 Stimmen
@ChrisPillen Eine Zeit lang konnte man erkennen, ob es sich bei einem Nutzer um einen Bot handelte, weil ein Bot, wenn er auf eine Eingabetaste klickt, erst gerade nach unten und dann gerade nach oben ging. Menschen bewegen sich natürlich in seltsamen, pseudo-zufälligen diagonalen Linien. Die Bot-Autoren reagierten darauf, indem sie ihre Bots in seltsamen, pseudo-zufälligen diagonalen Linien laufen ließen. Wenn Sie Ihre Website so programmieren können, dass sie ein bestimmtes Verhalten erwartet, kann jemand seinen Bot so programmieren, dass er sich so verhält; das ist einfach ein Wettrüsten. Es ist viel besser, sich auf Dinge zu verlassen, die für Computer nachweislich nicht durchführbar sind.
0 Stimmen
@LordFarquaad Ich verstehe das. Aber das bedeutet, dass es eine Reihe von Bot-Schreibern gibt, die sich nicht die Mühe machen. Und Zeit ist etwas Besonderes. Denn der Botautor muss Zeitschleifen einbauen. Das bedeutet, dass Bot-Autoren mehr Zeit brauchen, um ihre Bots laufen zu lassen. Was in einigen Fällen ihr Geschäftsmodell zerstören wird.
0 Stimmen
@Chris Die Teile VI und VII der oberen Antwort befassen sich mit der Drosselung, so dass die Zeit in jedem Fall beeinflusst wird. Ich will damit sagen, dass die Berechnung einer Zahl, die ein Mensch wahrscheinlich nicht schlagen kann, gegen eine der Sicherheitsgrundlagen verstößt, nämlich dass man nicht versuchen sollte, einen Bot zu "überlisten". Es stimmt zwar, dass man die meisten Bots schlagen kann, wenn man clever genug ist, aber wenn man sich auf ein solches Wettrüsten einlässt, bedeutet das in der Regel, dass man irgendwo anders einen grundlegenden Fehler hat. Es ist viel besser, diese Schwachstelle zu beseitigen, als zu versuchen, immer einen Schritt voraus zu sein, denn früher oder später wird ein Bot Sie ausstechen, und das muss er nur einmal tun.
0 Stimmen
Die Lektüre macht zwar Spaß, aber das Thema ist in der Tat zu weit gefasst. Sicherheit ist ein Katz-und-Maus-Spiel. Hacker finden ständig neue Lücken, die durch neue Sicherheitsmaßnahmen gestopft werden, und umgekehrt. In den Antworten noch nicht erwähnt: Verhaltenskontrollen. So wird z. B. Google hin und wieder nach Ihrem Passwort fragen, vor allem, wenn Sie unerwartete Dinge tun. Das Gleiche gilt für kontaktlose Bankkarten, wenn Sie in einem Geschäft oder einer Stadt bezahlen, in der Sie noch nie gesehen wurden.