Formularbasierte Authentifizierung für Websites
Wir glauben, dass der Stapelüberlauf nicht nur eine Ressource für sehr spezifische technische Fragen sein sollte, sondern auch für allgemeine Richtlinien zur Lösung von Variationen bei häufig auftretenden Problemen. "Formularbasierte Authentifizierung für Websites" sollte ein gutes Thema für ein solches Experiment sein.
Es sollte Themen enthalten wie:
- So melden Sie sich an
- So melden Sie sich ab
- So bleiben Sie angemeldet
- Cookies verwalten (einschließlich empfohlener Einstellungen)
- SSL / HTTPS-Verschlüsselung
- So speichern Sie Passwörter
- Geheime Fragen verwenden
- Vergessener Benutzername / Passwort-Funktionalität
- Verwendung von Nonces zur Verhinderung von Fälschungen von standortübergreifenden Anfragen (CSRF)
- OpenID
- Kontrollkästchen "Erinnere dich an mich"
- Automatische Vervollständigung von Benutzernamen und Passwörtern durch den Browser
- Geheime URLs (öffentliche URL durch Digest geschützt)
- Überprüfen der Passwortstärke
- E-Mail-Validierung
- und vieles mehr über formularbasierte Authentifizierung ...
Es sollte keine Dinge enthalten wie:
- Rollen und Autorisierung
- HTTP-Basisauthentifizierung
Bitte helfen Sie uns durch:
- Unterthemen vorschlagen
- Gute Artikel zu diesem Thema einreichen
- Bearbeiten der offiziellen Antwort
security
http
authentication
language-agnostic
article
Michiel de Mare
quelle
quelle
HttpOnly
Cookie-Flag, das JavaScript-basierten Cookie-Diebstahl (eine Teilmenge von XSS-Angriffen) verhindert, sollte ebenfalls irgendwo erwähnt werden.Antworten:
TEIL I: So melden Sie sich an
Wir gehen davon aus, dass Sie bereits wissen, wie Sie ein HTML-Formular für Login + Passwort erstellen, das die Werte zur Authentifizierung in ein Skript auf der Serverseite überträgt. In den folgenden Abschnitten werden Muster für eine solide praktische Authentifizierung und die Vermeidung der häufigsten Sicherheitsrisiken behandelt.
Zu HTTPS oder nicht zu HTTPS?
Sofern die Verbindung nicht bereits sicher ist (dh mithilfe von SSL / TLS über HTTPS getunnelt wird), werden Ihre Anmeldeformularwerte im Klartext gesendet, sodass jeder, der die Leitung zwischen Browser und Webserver abhört, die Anmeldungen während des Durchlaufs lesen kann durch. Diese Art des Abhörens wird routinemäßig von Regierungen durchgeführt, aber im Allgemeinen werden wir keine "eigenen" Drähte ansprechen, außer dies zu sagen: Verwenden Sie einfach HTTPS.
Im Wesentlichen besteht der einzige praktische Weg zum Schutz vor Abhören / Paket-Sniffing während der Anmeldung in der Verwendung von HTTPS oder einem anderen zertifikatbasierten Verschlüsselungsschema (z. B. TLS ) oder einem bewährten und getesteten Challenge-Response-Schema (z. B. Diffie-Hellman) -basiertes SRP). Jede andere Methode kann von einem abhörenden Angreifer leicht umgangen werden.
Wenn Sie bereit sind, ein wenig unpraktisch zu werden, können Sie natürlich auch ein Zwei-Faktor-Authentifizierungsschema verwenden (z. B. die Google Authenticator-App, ein physisches Codebuch im Stil des Kalten Krieges oder einen RSA-Schlüsselgenerator-Dongle). Bei korrekter Anwendung könnte dies auch bei einer ungesicherten Verbindung funktionieren, aber es ist schwer vorstellbar, dass ein Entwickler bereit wäre, eine Zwei-Faktor-Authentifizierung zu implementieren, jedoch kein SSL.
(Nicht) Roll-your-own JavaScript-Verschlüsselung / Hashing
Angesichts der wahrgenommenen (wenn auch jetzt vermeidbaren ) Kosten und technischen Schwierigkeiten beim Einrichten eines SSL-Zertifikats auf Ihrer Website sind einige Entwickler versucht, ihre eigenen Hashing- oder Verschlüsselungsschemata im Browser zu verwenden, um zu vermeiden, dass Klartextanmeldungen über eine ungesicherte Leitung übertragen werden.
Obwohl dies ein nobler Gedanke ist, ist er im Wesentlichen nutzlos (und kann eine Sicherheitslücke sein ), es sei denn, er wird mit einer der oben genannten kombiniert - das heißt, entweder die Leitung mit starker Verschlüsselung zu sichern oder eine bewährte Challenge-Response zu verwenden Mechanismus (wenn Sie nicht wissen, was das ist, wissen Sie einfach, dass es eines der am schwierigsten zu beweisenden, am schwierigsten zu entwerfenden und am schwierigsten zu implementierenden Konzepte in der digitalen Sicherheit ist).
Es stimmt zwar, dass die Passwort - Hashing sein kann gegen wirksames Passwort Offenlegung , es ist anfällig Angriffe zu wiederholen, Man-In-The-Middle - Angriffe / Entführungen (wenn ein Angreifer ein paar Bytes in der ungesicherte HTML - Seite injizieren kann , bevor es erreicht Ihre Browser können sie einfach das Hashing im JavaScript auskommentieren) oder Brute-Force-Angriffe (da Sie dem Angreifer sowohl den Benutzernamen als auch das Salt und das Hash-Passwort übergeben).
CAPTCHAS gegen die Menschheit
CAPTCHA soll eine bestimmte Angriffskategorie vereiteln: automatisiertes Wörterbuch / Brute-Force-Versuch und Irrtum ohne menschlichen Bediener. Es besteht kein Zweifel, dass dies eine echte Bedrohung ist. Es gibt jedoch Möglichkeiten, nahtlos damit umzugehen, ohne dass ein CAPTCHA erforderlich ist, das speziell für die serverseitige Anmeldedrosselung entwickelt wurde. Wir werden diese später erörtern.
Wissen Sie, dass CAPTCHA-Implementierungen nicht gleich erstellt werden. Sie sind oft nicht vom Menschen lösbar, die meisten von ihnen sind tatsächlich gegen Bots unwirksam, alle sind gegen billige Arbeitskräfte aus der Dritten Welt unwirksam (laut OWASP beträgt die aktuelle Sweatshop-Rate 12 USD pro 500 Tests), und einige Implementierungen können es sein In einigen Ländern technisch illegal (siehe OWASP Authentication Cheat Sheet ). Wenn Sie ein CAPTCHA verwenden müssen, verwenden Sie das reCAPTCHA von Google , da es per Definition OCR-hart ist (da es bereits OCR-falsch klassifizierte Buchscans verwendet) und sich sehr bemüht, benutzerfreundlich zu sein.
Persönlich finde ich CAPTCHAS eher ärgerlich und verwende sie nur als letzten Ausweg, wenn sich ein Benutzer mehrmals nicht angemeldet hat und die Drosselungsverzögerungen maximal sind. Dies geschieht selten genug, um akzeptabel zu sein, und stärkt das Gesamtsystem.
Speichern von Passwörtern / Überprüfen von Anmeldungen
Dies mag nach all den öffentlich bekannt gewordenen Hacks und Benutzerdatenlecks, die wir in den letzten Jahren gesehen haben, endlich allgemein bekannt sein, aber es muss gesagt werden: Speichern Sie Passwörter nicht im Klartext in Ihrer Datenbank. Benutzerdatenbanken werden routinemäßig durch SQL-Injection gehackt, durchgesickert oder abgerufen. Wenn Sie rohe Klartext-Kennwörter speichern, ist dies für Ihre Anmeldesicherheit ein sofortiges Spielende.
Wenn Sie das Passwort nicht speichern können, wie überprüfen Sie dann, ob die Kombination aus Login und Passwort, die über das Login-Formular veröffentlicht wurde, korrekt ist? Die Antwort ist Hashing mit einer Schlüsselableitungsfunktion . Wenn ein neuer Benutzer erstellt oder ein Kennwort geändert wird, nehmen Sie das Kennwort und führen es über eine KDF wie Argon2, bcrypt, scrypt oder PBKDF2 aus. Dabei wird das Klartext-Kennwort ("korrekthorsebatterystaple") in eine lange, zufällig aussehende Zeichenfolge umgewandelt , was viel sicherer in Ihrer Datenbank zu speichern ist. Um eine Anmeldung zu überprüfen, führen Sie dieselbe Hash-Funktion für das eingegebene Kennwort aus, geben diesmal das Salt ein und vergleichen die resultierende Hash-Zeichenfolge mit dem in Ihrer Datenbank gespeicherten Wert. Argon2, bcrypt und scrypt speichern das Salz bereits mit dem Hash. Weitere Informationen finden Sie in diesem Artikel auf sec.stackexchange.
Der Grund, warum ein Salz verwendet wird, ist, dass das Hashing an sich nicht ausreicht. Sie sollten ein sogenanntes "Salz" hinzufügen, um den Hash vor Regenbogentabellen zu schützen . Ein Salt verhindert effektiv, dass zwei Passwörter, die genau übereinstimmen, als der gleiche Hashwert gespeichert werden, und verhindert, dass die gesamte Datenbank in einem Durchgang gescannt wird, wenn ein Angreifer einen Angriff zum Erraten von Passwörtern ausführt.
Ein kryptografischer Hash sollte nicht zum Speichern von Passwörtern verwendet werden, da vom Benutzer ausgewählte Passwörter nicht stark genug sind (dh normalerweise nicht genügend Entropie enthalten) und ein Angreifer mit Zugriff auf die Hashes in relativ kurzer Zeit einen Angriff zum Erraten von Passwörtern ausführen kann. Aus diesem Grund werden KDFs verwendet - diese "strecken den Schlüssel" effektiv , was bedeutet, dass jede Kennwortschätzung, die ein Angreifer vornimmt, mehrere Wiederholungen des Hash-Algorithmus verursacht, beispielsweise 10.000 Mal, wodurch der Angreifer das Kennwort 10.000 Mal langsamer errät.
Sitzungsdaten - "Sie sind als Spiderman69 angemeldet"
Nachdem der Server die Anmeldung und das Kennwort für Ihre Benutzerdatenbank überprüft und eine Übereinstimmung gefunden hat, muss sich das System daran erinnern, dass der Browser authentifiziert wurde. Diese Tatsache sollte immer nur serverseitig in den Sitzungsdaten gespeichert werden.
Stellen Sie nach Möglichkeit sicher, dass für das Sitzungscookie beim Senden an den Browser die Flags "Sicher" und "Nur HTTP" gesetzt sind. Das HttpOnly-Flag bietet einen gewissen Schutz gegen das Lesen des Cookies durch einen XSS-Angriff. Das sichere Flag stellt sicher, dass das Cookie nur über HTTPS zurückgesendet wird, und schützt daher vor Netzwerk-Sniffing-Angriffen. Der Wert des Cookies sollte nicht vorhersehbar sein. Wenn ein Cookie angezeigt wird, das auf eine nicht vorhandene Sitzung verweist, sollte sein Wert sofort ersetzt werden, um eine Sitzungsfixierung zu verhindern .
TEIL II: So bleiben Sie eingeloggt - Das berüchtigte Kontrollkästchen "Remember Me"
Permanente Login-Cookies ("Remember Me" -Funktionalität) sind eine Gefahrenzone. Einerseits sind sie genauso sicher wie herkömmliche Anmeldungen, wenn Benutzer verstehen, wie sie damit umgehen sollen. Auf der anderen Seite stellen sie ein enormes Sicherheitsrisiko für unachtsame 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 sie gelöscht werden können.
Persönlich mag ich dauerhafte Anmeldungen für die Websites, die ich regelmäßig besuche, aber ich weiß, wie ich sicher damit umgehen kann. Wenn Sie sicher sind, dass Ihre Benutzer dasselbe wissen, können Sie dauerhafte Anmeldungen mit gutem Gewissen verwenden. Wenn nicht, können Sie sich der Philosophie anschließen, dass Benutzer, die mit ihren Anmeldedaten unachtsam sind, diese selbst in die Hand genommen haben, wenn sie gehackt werden. Es ist nicht so, als würden wir zu den Häusern unserer Benutzer gehen und all die Post-It-Notizen, die die Gesichtspalme auslösen, mit Passwörtern abreißen, die sie am Rand ihrer Monitore aufgereiht haben.
Natürlich leisten einige Systeme nicht haben keine Konten gehackt; Für solche Systeme gibt es keine Möglichkeit, dauerhafte Anmeldungen zu rechtfertigen.
Wenn Sie sich für die Implementierung dauerhafter Anmelde-Cookies entscheiden, gehen Sie folgendermaßen vor:
Nehmen Sie sich zunächst etwas Zeit, um den Artikel der Paragon Initiative zu diesem Thema zu lesen . Sie müssen eine Reihe von Elementen richtig machen, und der Artikel erklärt die einzelnen Elemente hervorragend.
Und um nur eine der häufigsten Fallstricke zu wiederholen, SPEICHERN SIE DAS PERSISTENT LOGIN COOKIE (TOKEN) NICHT IN IHRER DATENBANK, NUR EIN HASH! Das Anmeldetoken ist Passwort-äquivalent. Wenn ein Angreifer Ihre Datenbank in die Hände bekommt, kann er sich mit den Token bei jedem Konto anmelden, als wären es Klartext-Login-Passwort-Kombinationen. Verwenden Sie daher Hashing (laut https://security.stackexchange.com/a/63438/5002 reicht ein schwacher Hash für diesen Zweck aus), wenn Sie persistente Anmeldetoken speichern.
TEIL III: Geheime Fragen verwenden
Implementieren Sie keine "geheimen Fragen" . Die Funktion "Geheime Fragen" ist ein Sicherheits-Anti-Muster. Lesen Sie das Papier von Link Nummer 4 aus der MUST-READ-Liste. Sie können Sarah Palin danach fragen, nachdem ihr Yahoo! E-Mail-Konto wurde während einer früheren Präsidentschaftskampagne gehackt, weil die Antwort auf ihre Sicherheitsfrage ... "Wasilla High School" war!
Selbst bei benutzerdefinierten Fragen ist es sehr wahrscheinlich, dass die meisten Benutzer Folgendes wählen:
Eine "normale" geheime Frage wie der Mädchenname der Mutter oder das Lieblingshaustier
Eine einfache Kleinigkeit, die jeder aus seinem Blog, LinkedIn-Profil oder ähnlichem herausholen kann
Jede Frage, die einfacher zu beantworten ist, als ihr Passwort zu erraten. Was für jedes anständige Passwort jede Frage ist, die Sie sich vorstellen können
Zusammenfassend lässt sich sagen, dass Sicherheitsfragen in praktisch allen Formen und Variationen von Natur aus unsicher sind und aus irgendeinem Grund nicht in einem Authentifizierungsschema verwendet werden sollten.
Der wahre Grund, warum Sicherheitsfragen sogar in der Natur existieren, besteht darin, dass sie bequem die Kosten einiger Supportanrufe von Benutzern sparen, die nicht auf ihre E-Mails zugreifen können, um zu einem Reaktivierungscode zu gelangen. Dies auf Kosten der Sicherheit und des Rufs von Sarah Palin. Es ist es wert? Wahrscheinlich nicht.
TEIL IV: Funktion für vergessenes Passwort
Ich habe bereits erwähnt, warum Sie niemals Sicherheitsfragen für den Umgang mit vergessenen / verlorenen Benutzerkennwörtern verwenden sollten. Es versteht sich auch von selbst, dass Sie Benutzern niemals ihre tatsächlichen Passwörter per E-Mail senden sollten. In diesem Bereich sind mindestens zwei weitere allzu häufige Fallstricke zu vermeiden:
Nicht zurückgesetzt ein vergessenes Kennwort ein automatisch generierter starkes Passwort - solche Passwörter sind notorisch schwer zu merken, die der Benutzer bedeutet entweder ändern müssen oder schreiben Sie es auf - sagen wir, auf einem leuchtend gelben Post-It auf dem Rand ihres Monitors. Anstatt ein neues Passwort festzulegen, lassen Sie die Benutzer sofort ein neues auswählen - was sie sowieso tun möchten. (Eine Ausnahme hiervon kann sein, wenn die Benutzer allgemein einen Kennwortmanager zum Speichern / Verwalten von Kennwörtern verwenden, an die sie sich normalerweise nicht erinnern können, ohne sie aufzuschreiben.)
Hash immer den verlorenen Passwortcode / Token in der Datenbank. WIEDER ist dieser Code ein weiteres Beispiel für ein Passwort-Äquivalent. Er MUSS also gehasht werden, falls ein Angreifer Ihre Datenbank in die Hände bekommt. Wenn ein verlorener Passwortcode angefordert wird, senden Sie den Klartextcode an die E-Mail-Adresse des Benutzers, hashen Sie ihn, speichern Sie den Hash in Ihrer Datenbank - und werfen Sie das Original weg . Genau wie ein Passwort oder ein dauerhaftes Login-Token.
Ein letzter Hinweis: Stellen Sie immer sicher, dass Ihre Schnittstelle zur Eingabe des Codes für verlorenes Passwort mindestens so sicher ist wie Ihr Anmeldeformular selbst. Andernfalls verwendet ein Angreifer dies einfach, um stattdessen Zugriff zu erhalten. Es ist ein guter Anfang, sicherzustellen, dass Sie sehr lange "verlorene Kennwortcodes" generieren (z. B. 16 alphanumerische Zeichen, bei denen zwischen Groß- und Kleinschreibung unterschieden wird). Fügen Sie jedoch dasselbe Drosselungsschema hinzu, das Sie für das Anmeldeformular selbst verwenden.
TEIL V: Überprüfen der Passwortstärke
Zunächst sollten Sie diesen kleinen Artikel lesen, um die Realität zu überprüfen: Die 500 häufigsten Passwörter
Okay, vielleicht die Liste ist nicht die kanonische Liste der häufigsten Passwörter auf jedem System überall immer , aber es ist ein guter Indikator dafür , wie schlecht die Menschen ihre Passwörter wählen , wenn es keine erzwungene Politik an seinem Platz ist. Außerdem sieht die Liste erschreckend nah an der Heimat aus, wenn Sie sie mit öffentlich verfügbaren Analysen kürzlich gestohlener Passwörter vergleichen.
Also: Ohne Mindestanforderungen an die Kennwortstärke verwenden 2% der Benutzer eines der 20 häufigsten Kennwörter. Das heißt: Wenn ein Angreifer nur 20 Versuche erhält, kann 1 von 50 Konten auf Ihrer Website geknackt werden.
Um dies zu verhindern, muss die Entropie eines Passworts berechnet und anschließend ein Schwellenwert angewendet werden. Die Sonderpublikation 800-63 des Nationalen Instituts für Standards und Technologie (NIST) enthält eine Reihe sehr guter Vorschläge. In Kombination mit einer Wörterbuch- und Tastaturlayoutanalyse (z. B. "qwertyuiop" ist ein falsches Kennwort) können 99% aller schlecht ausgewählten Kennwörter mit einer Entropie von 18 Bit abgelehnt werden . Die einfache Berechnung der Passwortstärke und die Anzeige eines visuellen Stärkemessgeräts für einen Benutzer ist gut, aber unzureichend. Wenn es nicht erzwungen wird, werden viele Benutzer es höchstwahrscheinlich ignorieren.
Randall Munroes Password Strength xkcd wird dringend empfohlen, um die Benutzerfreundlichkeit von Passwörtern mit hoher Entropie aufzufrischen .
Verwenden Sie die API von Troy Hunt , um Benutzerpasswörter anhand von Passwörtern zu überprüfen, die bei Verstößen gegen öffentliche Daten gefährdet sind.
TEIL VI: Viel mehr - oder: Verhindern von schnellen Anmeldeversuchen
Schauen Sie sich zunächst die Zahlen an: Kennwortwiederherstellungsgeschwindigkeiten - Wie lange hält Ihr Kennwort?
Wenn Sie nicht die Zeit haben, die Tabellen in diesem Link zu durchsuchen, finden Sie hier eine Liste:
Es dauert praktisch keine Zeit , ein schwaches Passwort zu knacken, selbst wenn Sie es mit einem Abakus knacken
Es dauert praktisch keine Zeit , ein alphanumerisches 9-stelliges Passwort zu knacken, wenn die Groß- und Kleinschreibung nicht berücksichtigt wird
Wenn es weniger als 8 Zeichen lang ist, dauert es praktisch keine Zeit , ein kompliziertes Kennwort mit Symbolen, Buchstaben und Zahlen sowie Groß- und Kleinbuchstaben zu knacken (ein Desktop-PC kann den gesamten Schlüsselbereich mit bis zu 7 Zeichen durchsuchen von Tagen oder sogar Stunden)
Es würde jedoch übermäßig viel Zeit in Anspruch nehmen, selbst ein 6-stelliges Passwort zu knacken, wenn Sie auf einen Versuch pro Sekunde beschränkt wären!
Was können wir also aus diesen Zahlen lernen? Nun, viele, aber wir können uns auf den wichtigsten Teil konzentrieren: Die Tatsache, dass es wirklich nicht so schwierig ist , eine große Anzahl aufeinanderfolgender Schnellfeuer-Anmeldeversuche (dh den Brute-Force- Angriff) zu verhindern. Aber es richtig zu verhindern ist nicht so einfach, wie es scheint.
Im Allgemeinen haben Sie drei Möglichkeiten , die alle wirksam gegen Brute-Force - Angriffe sind (und Wörterbuch - Attacken, aber da Sie bereits eine starke Passwort Politik beschäftigen, sollten sie nicht ein Problem sein) :
Präsentieren Sie ein CAPTCHA nach N fehlgeschlagenen Versuchen (verdammt nervig und oft ineffektiv - aber ich wiederhole mich hier)
Sperren von Konten und Erfordernis einer E-Mail-Überprüfung nach N fehlgeschlagenen Versuchen (dies ist ein DoS- Angriff, der darauf wartet, ausgeführt zu werden)
Und schließlich die Drosselung der Anmeldung : Das heißt, eine Zeitverzögerung zwischen den Versuchen nach N fehlgeschlagenen Versuchen festlegen (ja, DoS-Angriffe sind immer noch möglich, aber zumindest sind sie weitaus weniger wahrscheinlich und viel komplizierter durchzuführen).
Best Practice Nr. 1: Eine kurze Zeitverzögerung, die mit der Anzahl der fehlgeschlagenen Versuche zunimmt, wie z.
Ein DoS, der dieses Schema angreift, wäre sehr unpraktisch, da die resultierende Sperrzeit geringfügig größer ist als die Summe der vorherigen Sperrzeiten.
Best Practice Nr. 2: Eine Zeitverzögerung mittlerer Länge, die nach N fehlgeschlagenen Versuchen wirksam wird, wie z.
DoS, die dieses Schema angreifen, wären ziemlich unpraktisch, aber sicherlich machbar. Es kann auch relevant sein zu beachten, dass eine so lange Verzögerung für einen legitimen Benutzer sehr ärgerlich sein kann. Vergessliche Benutzer werden dich nicht mögen.
Best Practice Nr. 3: Kombination der beiden Ansätze - entweder eine feste, kurze Zeitverzögerung, die nach N fehlgeschlagenen Versuchen wirksam wird, wie z.
Oder eine zunehmende Verzögerung mit einer festen Obergrenze, wie:
Dieses endgültige Schema wurde den OWASP-Best-Practice-Vorschlägen (Link 1 aus der MUST-READ-Liste) entnommen und sollte als Best-Practice angesehen werden, auch wenn es zugegebenermaßen restriktiv ist.
Ein Angriff auf dieses endgültige Anmeldedrosselungsschema wäre sehr unpraktisch. Lassen Sie als letzten Schliff immer dauerhafte (Cookie-) Anmeldungen (und / oder ein von CAPTCHA verifiziertes Anmeldeformular) durch, damit legitime Benutzer nicht einmal verzögert werden, während der Angriff ausgeführt wird . Auf diese Weise wird der sehr unpraktische DoS-Angriff zu einem äußerst unpraktischen Angriff.
Darüber hinaus ist es sinnvoller, Administratorkonten aggressiver zu drosseln, da dies die attraktivsten Einstiegspunkte sind
TEIL VII: Verteilte Brute-Force-Angriffe
Abgesehen davon werden fortgeschrittenere Angreifer versuchen, die Drosselung der Anmeldung zu umgehen, indem sie "ihre Aktivitäten verbreiten":
Verteilen der Versuche in einem Botnetz, um das Markieren von IP-Adressen zu verhindern
Anstatt einen Benutzer auszuwählen und die 50.000 häufigsten Passwörter auszuprobieren (was sie aufgrund unserer Drosselung nicht können), wählen sie DAS häufigste Passwort aus und versuchen es stattdessen mit 50.000 Benutzern. Auf diese Weise umgehen sie nicht nur Maßnahmen mit maximalem Versuch wie CAPTCHAs und Anmeldedrosselung, sondern erhöhen auch ihre Erfolgschancen, da das häufigste Kennwort Nummer 1 weitaus wahrscheinlicher ist als Nummer 49.995
Abstand der Anmeldeanforderungen für jedes Benutzerkonto, z. B. im Abstand von 30 Sekunden, um sich unter das Radar zu schleichen
Hier empfiehlt es sich, die Anzahl der fehlgeschlagenen Anmeldungen systemweit zu protokollieren und einen laufenden Durchschnitt der Häufigkeit der fehlerhaften Anmeldungen Ihrer Site als Grundlage für eine Obergrenze zu verwenden, die Sie dann allen Benutzern auferlegen.
Zu abstrakt? Lassen Sie mich umformulieren:
Angenommen, Ihre Website hat in den letzten 3 Monaten durchschnittlich 120 fehlerhafte Anmeldungen pro Tag erhalten. Mit diesem (laufenden Durchschnitt) kann Ihr System das globale Limit auf das Dreifache festlegen - dh. 360 fehlgeschlagene Versuche über einen Zeitraum von 24 Stunden. Wenn dann die Gesamtzahl der fehlgeschlagenen Versuche in allen Konten diese Anzahl innerhalb eines Tages überschreitet (oder noch besser, überwachen Sie die Beschleunigungsrate und lösen Sie einen berechneten Schwellenwert aus), wird die systemweite Anmeldedrosselung aktiviert - was für ALLE Benutzer kurze Verzögerungen bedeutet (mit Ausnahme von Cookie-Anmeldungen und / oder Backup-CAPTCHA-Anmeldungen).
Ich habe auch eine Frage mit mehr Details und einer wirklich guten Diskussion darüber gepostet, wie man knifflige Pitfals bei der Abwehr verteilter Brute-Force-Angriffe vermeidet
TEIL VIII: Zwei-Faktor-Authentifizierung und Authentifizierungsanbieter
Anmeldeinformationen können gefährdet sein, sei es durch Exploits, das Aufschreiben und Verlieren von Passwörtern, den Diebstahl von Laptops mit Schlüsseln oder die Eingabe von Anmeldungen bei Phishing-Sites durch Benutzer. Anmeldungen können durch eine Zwei-Faktor-Authentifizierung weiter geschützt werden, bei der Out-of-Band-Faktoren wie Einwegcodes verwendet werden, die von einem Telefonanruf, einer SMS-Nachricht, einer App oder einem Dongle empfangen wurden. Mehrere Anbieter bieten Zwei-Faktor-Authentifizierungsdienste an.
Die Authentifizierung kann vollständig an einen Single-Sign-On-Dienst delegiert werden, bei dem ein anderer Anbieter das Sammeln von Anmeldeinformationen übernimmt. Dadurch wird das Problem an einen vertrauenswürdigen Dritten weitergeleitet. Google und Twitter bieten beide standardbasierte SSO-Dienste an, während Facebook eine ähnliche proprietäre Lösung bietet.
MUSS LINKS ÜBER DIE Webauthentifizierung LESEN
quelle
Endgültiger Artikel
Anmeldeinformationen senden
Die einzige praktische Möglichkeit, Anmeldeinformationen 100% sicher zu senden, ist die Verwendung von SSL . Die Verwendung von JavaScript zum Hashing des Kennworts ist nicht sicher. Häufige Fallstricke beim clientseitigen Passwort-Hashing:
Es gibt eine andere sichere Methode namens SRP , die jedoch patentiert ist (obwohl sie frei lizenziert ist ) und nur wenige gute Implementierungen verfügbar sind.
Passwörter speichern
Speichern Sie niemals Passwörter als Klartext in der Datenbank. Nicht einmal, wenn Sie sich nicht um die Sicherheit Ihrer eigenen Website kümmern. Angenommen, einige Ihrer Benutzer verwenden das Kennwort ihres Online-Bankkontos erneut. Speichern Sie also das Hash-Passwort und werfen Sie das Original weg. Stellen Sie außerdem sicher, dass das Kennwort nicht in Zugriffsprotokollen oder Anwendungsprotokollen angezeigt wird. OWASP empfiehlt die Verwendung von Argon2 als erste Wahl für neue Anwendungen. Wenn dies nicht verfügbar ist, sollte stattdessen PBKDF2 oder scrypt verwendet werden. Und wenn keine der oben genannten Optionen verfügbar ist, verwenden Sie bcrypt.
Hashes an sich sind auch unsicher. Zum Beispiel bedeuten identische Passwörter identische Hashes - dies macht Hash-Nachschlagetabellen zu einer effektiven Methode, um viele Passwörter gleichzeitig zu knacken. Bewahren Sie stattdessen den gesalzenen Hasch auf. Ein Salt ist eine Zeichenfolge, die vor dem Hashing an das Kennwort angehängt wird. Verwenden Sie pro Benutzer ein anderes (zufälliges) Salt. Das Salt ist ein öffentlicher Wert, sodass Sie sie mit dem Hash in der Datenbank speichern können. Weitere Informationen hierzu finden Sie hier .
Dies bedeutet, dass Sie dem Benutzer keine vergessenen Passwörter senden können (da Sie nur den Hash haben). Setzen Sie das Kennwort des Benutzers nur zurück, wenn Sie den Benutzer authentifiziert haben (Benutzer müssen nachweisen, dass sie E-Mails lesen können, die an die gespeicherte (und validierte) E-Mail-Adresse gesendet wurden.)
Sicherheitsfragen
Sicherheitsfragen sind unsicher - vermeiden Sie ihre Verwendung. Warum? Alles, was eine Sicherheitsfrage tut, ist ein Passwort besser. Lesen Sie TEIL III: Verwenden geheimer Fragen in @Jens Rolands Antwort hier in diesem Wiki.
Sitzungscookies
Nachdem sich der Benutzer angemeldet hat, sendet der Server dem Benutzer ein Sitzungscookie. Der Server kann den Benutzernamen oder die ID aus dem Cookie abrufen, aber niemand anderes kann ein solches Cookie generieren (TODO-Erklärungsmechanismen).
Cookies können entführt werden : Sie sind nur so sicher wie der Rest des Client-Computers und andere Kommunikationen. Sie können von der Festplatte gelesen, im Netzwerkverkehr beschnüffelt, durch einen Cross-Site-Scripting-Angriff aufgehoben und von einem vergifteten DNS phishing-fähig gemacht werden, sodass der Client seine Cookies an die falschen Server sendet. Senden Sie keine dauerhaften Cookies. Cookies sollten am Ende der Client-Sitzung ablaufen (Browser schließen oder Domain verlassen).
Wenn Sie Ihre Benutzer automatisch anmelden möchten, können Sie ein dauerhaftes Cookie festlegen, das sich jedoch von einem Cookie für eine vollständige Sitzung unterscheiden sollte. Sie können ein zusätzliches Flag setzen, für das sich der Benutzer automatisch angemeldet hat und das sich für vertrauliche Vorgänge für echt anmelden muss. Dies ist beliebt bei Einkaufsseiten, die Ihnen ein nahtloses, personalisiertes Einkaufserlebnis bieten und dennoch Ihre finanziellen Daten schützen möchten. Wenn Sie beispielsweise zu Amazon zurückkehren, wird eine Seite angezeigt, die aussieht, als wären Sie angemeldet. Wenn Sie jedoch eine Bestellung aufgeben (oder Ihre Lieferadresse, Kreditkarte usw. ändern), werden Sie zur Bestätigung aufgefordert Ihr Passwort.
Finanzwebsites wie Banken und Kreditkarten enthalten hingegen nur vertrauliche Daten und sollten keine automatische Anmeldung oder einen Modus mit geringer Sicherheit zulassen.
Liste der externen Ressourcen
21-seitiger akademischer Artikel mit vielen tollen Tipps.
Diskussion im Forum zur Benutzerauthentifizierung zu diesem Thema
speichern Passwörter wahrscheinlich falsch Einführender Artikel zum Speichern von Passwörtern
Forum-Diskussion über einen Coding Horror-Artikel.
Eine weitere Warnung zum Speichern von Passwörtern in der Datenbank.
Wikipedia-Artikel zum Knacken von Passwörtern über Schwachstellen mehrerer Passwort-Hashing-Schemata.
Diskussion über Regenbogentabellen und wie Sie sich gegen sie und andere Threads verteidigen können. Beinhaltet eine ausführliche Diskussion.
quelle
Erstens eine starke Einschränkung, dass diese Antwort nicht genau zu dieser Frage passt. Es sollte definitiv nicht die Top-Antwort sein!
Ich werde Mozillas vorgeschlagene BrowserID (oder genauer gesagt das verifizierte E-Mail-Protokoll ) erwähnen , um in Zukunft einen Upgrade-Pfad für bessere Ansätze zur Authentifizierung zu finden.
Ich werde es so zusammenfassen:
@
Kontodomäne“ ist übersichtlich und wird von einer Vielzahl von Protokollen und URI-Schemata unterstützt. Eine solche Kennung wird natürlich am allgemeinsten als E-Mail-Adresse anerkannt.Dies ist keine reine "formularbasierte Authentifizierung für Websites". Es ist jedoch ein Versuch, von der aktuellen Norm der formularbasierten Authentifizierung zu etwas Sichererem überzugehen: der browserunterstützten Authentifizierung.
quelle
Ich dachte nur, ich würde diese Lösung teilen, die meiner Meinung nach gut funktioniert.
Ich nenne es das Dummy Field (obwohl ich das nicht erfunden habe, also schreibe es mir nicht gut).
Kurz gesagt: Sie müssen dies nur in Ihre einfügen
<form>
und prüfen, ob es bei der Validierung leer ist:Der Trick besteht darin, einen Bot zu täuschen, er müsse Daten in ein erforderliches Feld einfügen. Deshalb habe ich die Eingabe "E-Mail" genannt. Wenn Sie bereits ein Feld namens E-Mail haben, das Sie verwenden, sollten Sie versuchen, das Dummy-Feld mit einem anderen Namen wie "Firma", "Telefon" oder "E-Mail-Adresse" zu benennen. Wählen Sie einfach etwas aus, von dem Sie wissen, dass Sie es nicht benötigen und das sich nach etwas anhört, das normalerweise logisch ist, um es in ein Webformular auszufüllen. Verstecken Sie nun das
input
Feld mit CSS oder JavaScript / jQuery - was auch immer am besten zu Ihnen passt - setzen Sie die Eingabe einfach nicht auftype
,hidden
sonst fällt der Bot nicht darauf herein.Wenn Sie das Formular validieren (entweder clientseitig oder serverseitig), überprüfen Sie, ob Ihr Dummy-Feld ausgefüllt wurde, um festzustellen, ob es von einem Menschen oder einem Bot gesendet wurde.
Beispiel:
Im Falle eines Menschen: Der Benutzer sieht das Dummy-Feld (in meinem Fall "E-Mail") nicht und versucht nicht, es zu füllen. Der Wert des Dummy-Felds sollte also nach dem Senden des Formulars noch leer sein.
Im Falle eines Bots: Der Bot sieht ein Feld, dessen Typ
text
und Nameemail
(oder wie auch immer Sie es nennen) ist, und versucht logisch, es mit geeigneten Daten zu füllen. Es ist egal, ob Sie das Eingabeformular mit ausgefallenem CSS gestaltet haben, Webentwickler tun dies die ganze Zeit. Was auch immer der Wert im Dummy-Feld ist, es ist uns egal, solange es größer als0
Zeichen ist.Ich habe diese Methode in einem Gästebuch in Kombination mit CAPTCHA verwendet und seitdem keinen einzigen Spam-Beitrag mehr gesehen. Ich hatte zuvor eine reine CAPTCHA-Lösung verwendet, aber schließlich kam es zu ungefähr fünf Spam-Posts pro Stunde. Das Hinzufügen des Dummy-Felds zum Formular hat (zumindest bis jetzt) das Auftreten von Spam verhindert.
Ich glaube, dass dies auch gut mit einem Anmelde- / Authentifizierungsformular verwendet werden kann.
Warnung : Natürlich ist diese Methode nicht 100% narrensicher. Bots können so programmiert werden, dass Eingabefelder mit dem darauf
display:none
angewendeten Stil ignoriert werden . Sie müssen auch an Personen denken, die eine Form der automatischen Vervollständigung verwenden (wie die meisten Browser bereits integriert sind!), Um alle Formularfelder für sie automatisch auszufüllen. Sie könnten genauso gut ein Dummy-Feld aufnehmen.Sie können dies auch ein wenig variieren, indem Sie das Dummy-Feld sichtbar lassen, jedoch außerhalb der Bildschirmgrenzen. Dies liegt jedoch ganz bei Ihnen.
Seien Sie kreativ!
quelle
visibility:hidden
und auchposition:absolute;top:-9000px
können Sie auch tun ,text-indent
und auchz-index
auf ein paar dieser Elemente und legen Sie sie in komprimierter CSS Dateinamen mit unbeholfenen Namen - da Bots erkennen 1Rufen: none` und prüfen sie jetzt für eine Reihe von Kombinationen - Ich benutze diese Methoden tatsächlich und sie sind alte Tricks des Handels. +1<input type="text" name="email" class="cucaracha">
und in Ihrem CSS :.cucaracha { display:none; }
.Ich denke nicht, dass die obige Antwort "falsch" ist, aber es gibt große Bereiche der Authentifizierung, die nicht berührt werden (oder vielmehr liegt der Schwerpunkt auf "Implementieren von Cookie-Sitzungen", nicht auf "Welche Optionen stehen zur Verfügung und was ist der Handel?" -offs ".
Meine vorgeschlagenen Änderungen / Antworten sind
Versuchen Sie NICHT, Ihr eigenes Anmeldeformular oder die Datenbankspeicherung von Passwörtern zu implementieren, es sei denn, die gespeicherten Daten sind bei der Kontoerstellung wertlos und werden selbst generiert (dh im Web 2.0-Stil wie Facebook, Flickr usw.).
Dadurch wird vermieden, dass "Sitzungen" oder Cookies erforderlich sind, da der Browser selbst die Kommunikation jedes Mal neu verschlüsselt. Es ist der "leichteste" Entwicklungsansatz.
Ich empfehle dies jedoch nicht, außer für öffentliche, geringwertige Dienste. Dies ist ein Problem mit einigen der oben genannten Antworten. Versuchen Sie nicht, serverseitige Authentifizierungsmechanismen erneut zu implementieren. Dieses Problem wurde behoben und wird von den meisten gängigen Browsern unterstützt. Verwenden Sie keine Cookies. Speichern Sie nichts in Ihrer eigenen handgerollten Datenbank. Fragen Sie einfach pro Anfrage, ob die Anfrage authentifiziert ist. Alles andere sollte durch Konfiguration und vertrauenswürdige Software von Drittanbietern unterstützt werden.
Damit ...
Zunächst verwechseln wir die erstmalige Erstellung eines Kontos (mit einem Passwort) mit der anschließenden Überprüfung des Passworts. Wenn ich Flickr bin und Ihre Website zum ersten Mal erstelle, hat der neue Benutzer Zugriff auf den Wert Null (leerer Webspace). Es ist mir wirklich egal, ob die Person, die das Konto erstellt, über ihren Namen lügt. Wenn ich ein Konto des Krankenhauses erschaffe Intranet / Extranet, liegt der Wert in allen medizinischen Aufzeichnungen, und so ich tun kümmern uns um die Identität (*) des Kontos Schöpfer.
Dies ist der sehr sehr schwierige Teil. Die einzig vernünftige Lösung ist ein Netz des Vertrauens. Zum Beispiel treten Sie als Arzt ins Krankenhaus ein. Sie erstellen eine Webseite, die irgendwo mit Ihrem Foto, Ihrer Passnummer und einem öffentlichen Schlüssel gehostet wird, und hashen sie alle mit dem privaten Schlüssel. Anschließend besuchen Sie das Krankenhaus und der Systemadministrator überprüft Ihren Reisepass, prüft, ob das Foto zu Ihnen passt, und hasht dann die Webseite / den Foto-Hash mit dem privaten Schlüssel des Krankenhauses. Von nun an können wir Schlüssel und Token sicher austauschen. Wie jeder, der dem Krankenhaus vertraut (es gibt übrigens die geheime Sauce). Der Systemadministrator kann Ihnen auch einen RSA- Dongle oder eine andere Zwei-Faktor-Authentifizierung geben.
Dies ist jedoch ein großer Aufwand und nicht sehr Web 2.0. Dies ist jedoch die einzige sichere Möglichkeit, neue Konten zu erstellen, die Zugriff auf wertvolle Informationen haben, die nicht selbst erstellt wurden.
Kerberos und SPNEGO - Single Sign-On-Mechanismen mit einem vertrauenswürdigen Dritten - Der Benutzer überprüft im Grunde genommen einen vertrauenswürdigen Dritten. (NB dies ist in keiner Weise die nicht vertrauenswürdige OAuth )
SRP - eine Art clevere Passwortauthentifizierung ohne vertrauenswürdigen Dritten. Aber hier kommen wir zu den Bereichen "Es ist sicherer, die Zwei-Faktor-Authentifizierung zu verwenden, auch wenn dies teurer ist".
SSL- Client-Seite - Geben Sie den Clients ein Public-Key-Zertifikat (Unterstützung in allen gängigen Browsern - wirft jedoch Fragen zur Sicherheit des Client-Computers auf).
Am Ende ist es ein Kompromiss - was kostet eine Sicherheitsverletzung im Vergleich zu den Kosten für die Implementierung sicherer Ansätze? Eines Tages wird möglicherweise eine ordnungsgemäße PKI allgemein akzeptiert und daher keine eigenen gerollten Authentifizierungsformulare und -datenbanken mehr. Eines Tages...
quelle
Verwenden Sie beim Hashing keine schnellen Hash-Algorithmen wie MD5 (es gibt viele Hardware-Implementierungen). Verwenden Sie so etwas wie SHA-512. Bei Passwörtern sind langsamere Hashes besser.
Je schneller Sie Hashes erstellen können, desto schneller kann jeder Brute-Force-Checker arbeiten. Langsamere Hashes verlangsamen daher das brutale Forcen. Ein langsamer Hash-Algorithmus macht Brute Forcing für längere Passwörter (8 Stellen +) unpraktisch.
quelle
Ein guter Artikel über eine realistische Schätzung der Passwortstärke ist:
Dropbox Tech Blog »Blog-Archiv» zxcvbn: realistische Schätzung der Passwortstärke
quelle
Meine Lieblingsregel in Bezug auf Authentifizierungssysteme: Verwenden Sie Passphrasen, keine Passwörter. Leicht zu merken, schwer zu knacken. Weitere Informationen: Coding Horror: Passwörter vs. Passphrasen
quelle
Ich möchte einen Vorschlag hinzufügen, den ich verwendet habe, basierend auf der Tiefenverteidigung. Sie müssen nicht dasselbe Authentifizierungs- und Authentifizierungssystem für Administratoren haben wie normale Benutzer. Sie können ein separates Anmeldeformular für eine separate URL haben, die separaten Code für Anforderungen ausführt, die hohe Berechtigungen gewähren. Dieser kann Entscheidungen treffen, die für normale Benutzer ein totaler Schmerz wären. Eine solche, die ich verwendet habe, besteht darin, die Anmelde-URL für den Administratorzugriff zu verschlüsseln und dem Administrator die neue URL per E-Mail zu senden. Stoppt jeden Brute-Force-Angriff sofort, da Ihre neue URL beliebig schwierig sein kann (sehr lange zufällige Zeichenfolge), die einzige Unannehmlichkeit Ihres Administrators jedoch darin besteht, einem Link in seiner E-Mail zu folgen. Der Angreifer weiß nicht mehr, wohin er überhaupt posten soll.
quelle
Ich weiß nicht, ob es am besten war, dies als Antwort oder als Kommentar zu beantworten. Ich habe mich für die erste Option entschieden.
In Bezug auf das Poing TEIL IV: Vergessene Passwortfunktionalität in der ersten Antwort möchte ich auf Timing-Angriffe eingehen.
In den Formularen zum Speichern Ihres Kennworts kann ein Angreifer möglicherweise eine vollständige Liste der E-Mails überprüfen und feststellen, welche im System registriert sind (siehe Link unten).
In Bezug auf das Formular für vergessenes Passwort möchte ich hinzufügen, dass es eine gute Idee ist, die Zeiten zwischen erfolgreichen und nicht erfolgreichen Abfragen mit einer Verzögerungsfunktion gleichzusetzen.
https://crypto.stanford.edu/~dabo/papers/webtiming.pdf
quelle
Ich möchte einen sehr wichtigen Kommentar hinzufügen: -
Viele Unternehmen stellen Websites nur für den internen Gebrauch bereit, bei denen es sich effektiv um "Unternehmensanwendungen" handelt, die zufällig über URLs implementiert wurden. Diese URLs können (angeblich ...) nur innerhalb des "internen Netzwerks des Unternehmens" aufgelöst werden. (Welches Netzwerk enthält auf magische Weise alle mit VPN verbundenen "Straßenkämpfer"?)
Wenn ein Benutzer pflichtbewusst mit dem oben genannten Netzwerk verbunden ist, ist seine Identität ("Authentifizierung") [bereits ...] "endgültig bekannt", ebenso wie seine Erlaubnis ("Autorisierung") , bestimmte Dinge zu tun ... wie z. .. "um auf diese Website zuzugreifen."
Dieser Dienst "Authentifizierung + Autorisierung" kann von verschiedenen Technologien bereitgestellt werden, z. B. LDAP (Microsoft OpenDirectory) oder Kerberos.
Aus Ihrer Sicht wissen Sie einfach Folgendes: Jeder, der legitimerweise auf Ihrer Website landet , muss von [einer Umgebungsvariablen, die auf magische Weise ...] ein "Token" enthält, begleitet werden. ( dh das Fehlen eines solchen Tokens muss ein unmittelbarer Grund dafür sein
404 Not Found
.)Der Wert des Tokens macht für Sie keinen Sinn, aber falls dies erforderlich sein sollte, gibt es "geeignete Mittel", mit denen Ihre Website "[autoritativ] jemanden fragen kann, der (LDAP ... usw.)" über alle (!) Frage, die Sie haben können. Mit anderen Worten, Sie nicht in Anspruch nehmen , sie von jeder „home-grown - Logik.“ Stattdessen erkundigen Sie sich bei der Behörde und vertrauen implizit ihrem Urteil.
Ähhh ... es ist ein ziemlicher mentaler Wechsel vom "wild-wolligen Internet".
quelle
Verwenden Sie OpenID Connect oder User-Managed Access .
Denn nichts ist effizienter als es überhaupt nicht zu tun.
quelle