Frage:
Passwörter werden im Klartext gesendet, weil Benutzer sie falsch in das Feld Benutzername eingegeben haben
Lex
2013-03-05 22:09:55 UTC
view on stackexchange narkive permalink

Beim Überprüfen der von verschiedenen SIEMs generierten Protokolle (Splunk, HP Logger Trial und SIEM der AlienVault-Plattform) habe ich festgestellt, dass aus irgendeinem Grund einige Benutzer den Fehler machen, ihre Kennwörter entweder im Feld Benutzername einzugeben OS Domain-Anmeldung oder in Webanwendungen. Ich vermute, das sind Leute, die nicht tippen können, ohne auf die Tastatur zu schauen, und wenn sie dies versuchen, tun sie es schnell und geben ihre Passwörter in das falsche Feld ein. Dies bedeutet, dass das Kennwort überall im Netzwerk im Klartext gesendet wird und in den Protokollen mit einem Ereignis aufgezeichnet wird, das etwas in der Art sagt:

  Benutzer P @ $$ w0rd existiert nicht [...]  

oder

  Ein Konto konnte sich nicht anmelden: P @ $$ w0rd [...]  

(wobei P @ $$ w0rd das Kennwort des tatsächlichen Benutzers ist)

Es wird ziemlich offensichtlich, wem die Kennwörter gehören: normalerweise das vorherige oder das nächste (un) erfolgreiche Ereignis auf dem Dieselbe Protokolldatei informiert Sie über ein Ereignis, das vom selben Benutzer ausgelöst wurde.

Jeder andere Analyst, der sich die Protokolle ansieht, kann die Anmeldeinformationen eines anderen Benutzers abrufen, ohne dass der Eigentümer dies überhaupt bemerkt. Das schlimmste Szenario ist das Abhören des Netzwerks oder ein tatsächlicher Kompromiss zwischen Protokolldateien.

Ich suche nach einer allgemeinen Anleitung, um dies zu verhindern. Ich gehe davon aus, dass eine einfache Maskierung des Benutzernamens nicht möglich ist, und selbst wenn dies der Fall wäre, würde dies wahrscheinlich einen Großteil der Protokollanalyse eliminieren, da nicht festgestellt werden kann, wer was getan hat.

Hinweis: b > Es gibt bereits einen Beitrag zu einem ähnlichen Problem, aber ich versuche, einen Weg zu finden, um dies zu verhindern. Was ist das Risiko, wenn ich versehentlich mein Kennwort in ein Feld für den Benutzernamen (Windows-Anmeldung) eingebe?


Akzeptierte Antwort: b> Ich wünschte, ich könnte ein paar Antworten aus der Liste auswählen. Leider muss ich mich nur an eine im Forum halten, aber in der Praxis kann ich sie kombinieren. Vielen Dank für alle Antworten; Ich sehe, es gibt keine einzige Lösung. Da ich damit einverstanden bin, dass das Hinzufügen von "Dingen" die Komplexität erhöht, die die Wahrscheinlichkeit von Sicherheitslücken erhöht, muss ich den meisten Wählern zustimmen, dass @AJHenderson als ersten Ansatz die eleganteste und einfachste Antwort hat. Auf jeden Fall SSL und eine einfache Codeüberprüfung auf dem Server oder sogar auf der Clientseite. Da ich nicht gegen böswillige Benutzer, sondern gegen abgelenkte Benutzer vorgehen möchte, ist dies in Ordnung. Sobald dies geschehen ist, können wir gegebenenfalls versuchen, die Implementierung auf nicht beabsichtigte Benutzer auszudehnen. Nochmals vielen Dank für die Beiträge aller.

Hash sowohl Benutzername als auch Passwort und senden über. Natürlich muss die Kontoerstellung über HTTPS erfolgen. Weitere Anmeldungen müssen nicht sein.
@SparKot ॐ - Das Problem ist, dass es äußerst schwierig ist, den Benutzer zu identifizieren, wenn Sie den Benutzernamen ohne ein gemeinsames Salz hashen. Mit einem gemeinsamen Salz für den Benutzernamen wird es möglich, einen Regenbogentabellenangriff gegen die Protokolle durchzuführen, um falsch eingegebene Passwörter zu finden.
Rainbow Table als Siem-Analyst mit App-Protokollen und anderen, die zu mehr als 5000 Eps zählen, klingt sehr wenig überzeugend. Es gibt Siem-Lösungen wie Q1, die auf einen regulären Ausdruck hinweisen, der definiert ist, um nach Benutzernamen zu suchen.
@Lex Ich bin verwirrt, wie hoch das Risiko ist, dass jemand das Passwort auf diese Weise aus dem Kabel schnüffelt. Wie viel Bedrohung bedeutet das? Wenn ich etwas als sslstrip habe, übertrifft es die gesamte Sicherheit auf Draht.
Nur protokollieren, wenn der Benutzername in der Datenbank vorhanden ist?
@asadz Die Bedrohung scheint mir ziemlich groß zu sein, da das Passwort möglicherweise im Klartext vom Benutzernamen übertragen wird, der so abgelegt wurde, als wäre es der Benutzername. Die Wahrscheinlichkeit ist möglicherweise minimal, jedoch die Wahrscheinlichkeit eines internen Betrugs durch jemanden, der die Berechtigungen zum Anzeigen von Protokollen des im Klartext gespeicherten Kennworts missbraucht, was mich am meisten erschreckt.
@Lex, aber das wäre ein weiteres Risiko, insgesamt in Klartext auf der Maschine gespeichert zu werden. Ich bezog mich auf das Risiko, vom Draht gerochen zu werden. Der Angreifer muss in diesem Fall sehr viel Glück haben. Abhängig von der Reaktion des Systems (wenn es nach einem einmaligen Token / Passwort fragt) oder einer Vorauthentifizierung auf irgendeine Weise ist die Wahrscheinlichkeit eines tatsächlichen Kompromisses weitaus geringer.
@asadz Ich stimme Ihnen zu 100% zu
@CodesInChaos das ist eine interessante Idee und ich bin sicher, dass es möglich ist, einen Regex-Filter dafür zu implementieren.
Diejenigen von uns, die tippen können, ohne auf die Tastatur zu schauen, können diesen Fehler auch machen. Normalerweise müssen wir auch nicht auf den Bildschirm schauen und wenn man etwas abgelenkt ist, ist ein solcher Fehler leicht zu machen. Dies ist der Vorteil der Windows XP Home Edition und der späteren Benutzeroberfläche, in der Benutzer aus einem Menü auswählen können. Natürlich nicht nützlich für mehr als eine Handvoll Benutzer.
Dies passierte mir aus folgendem Grund immer wieder: Wenn ich meinen Computer entsperre, wird normalerweise daran erinnert, dass ich der letzte Benutzer war und nur das Kennwort eingegeben werden muss. Ich drücke oft "[Strg] - [Alt] - [Entf]" und gebe mein Passwort ein, bevor mein Monitor wieder mit Strom versorgt wird. Wenn ich mich jedoch zuletzt über den Remotedesktop angemeldet habe, wird der Benutzername gelöscht. Wenn ich in diesem Szenario meiner normalen Routine folge, wird das Passwort als Benutzername eingegeben.
Die Eingabe meines Passworts in ein anderes als ein Passworteingabefeld ist wahrscheinlich die häufigste Ursache für Passwortänderungen für mich. Ich sollte diesen Fehler wahrscheinlich öfter machen!
Ich habe zwei Maschinen und eine Tastatur. Verwenden der Maus ohne Rahmen Manchmal gebe ich mein Passwort ein, wenn ich denke, dass der Cursor fokussiert ist. Nicht immer die Box, die den Login benötigt
Ich habe plötzlich das Bedürfnis, verschiedene Passwörter zu ändern ... Auch wenn ich dies in der Vergangenheit getan habe, tippe ich oft sehr schnell und verpasse versehentlich die Tabulatortaste, um zum nächsten Feld zu gelangen. Mit anderen Worten ... Ein Konto konnte sich nicht anmelden: MikeSP @ $$ W0RD
Ich habe einen wirklich nervigen Fehler bemerkt, bei dem ich auf einer Webseite zum Passwortfeld wechsle und mit der Eingabe beginne, bevor die Seite vollständig geladen ist. Wenn die Seite fertig ist (während ich mein Passwort eingebe), wird der Fokus von der Seite weggerissen Passwortfeld und zurück zum Standard (normalerweise das Feld für den Benutzernamen). Ich wünschte, jeder würde sicherstellen, dass sein Produkt / seine Website dies nicht tut.
Können Sie nach Möglichkeit ein neues Feld hinzufügen, z. B. das Kennwort erneut eingeben und eine clientseitige Validierung hinzufügen?
@Lex "... aus irgendeinem Grund ..." Nur über den Grund spekulieren: Befindet sich auf der Seite Javascript, das nach dem Laden der Seite den Fokus auf das Feld für den Benutzernamen legt? Meine Banking-Website tut dies und ich habe mein pw wegen der asynchronen Belastung in das Feld Benutzername eingegeben. (z. B. habe ich meinen Benutzernamen eingegeben und während der Eingabe - oder kurz vor der Eingabe - wurde meine pw-Seite vollständig geladen, der Fokus auf den Benutzernamen gesetzt und meine pw wurde in das Feld für den Benutzernamen verschoben.)
@Sufyan - Ja, das wäre auch effektiv, aber es wäre ein Usability-Hit, da es zusätzliche Arbeit seitens des Benutzers erfordert, was im Allgemeinen dazu führen wird, dass es schlecht aufgenommen wird. Nicht zu sagen, dass es in manchen Situationen nicht die richtige Wahl sein könnte, aber es wäre keine beliebte Wahl.
-> Benutzer P @ $$ w0rd nicht ** beenden ** ist ein offensichtlicher Tippfehler.
[Entschuldigung, wenn jemand anderes diesen Kommentar bereits abgegeben hat] Diese Art von Dingen passiert jetzt viel häufiger, da so viele Leute Dinge wie KeePass verwenden, um ihre Anmeldeinformationen automatisch einzugeben. Es ist sehr einfach, den Fokus im falschen Feld zu haben und dann den automatisch eingegebenen Namen, die Registerkarte, das Passwort und die Eingabe der Sequenz in die falschen Felder zu füllen.
@ray023 Das kann ich dir leider nicht sagen. Dies passiert jedoch auch Menschen, die ihre Fehler bei der Windows-Anmeldung machen.
Ich hatte kürzlich etwas Ähnliches, als ein Benutzer die "Authorization Basic " in die URL selbst (Abfrageparameter) anstatt in den HTTP-Header einfügte ... Entschuldigung für ihn, aber seine Anfrage ging an die Datei "NCSA-logs" undWir können die Protokollierung nicht einfach verhindern, da wir die Protokollnachricht vor der Protokollierung nicht analysieren.
Siebzehn antworten:
AJ Henderson
2013-03-05 23:33:26 UTC
view on stackexchange narkive permalink

Ein Gedanke ist, das Senden von Formularen nicht zuzulassen, wenn das Kennwortfeld keinen Wert enthält. Wenn sie versehentlich das Passwort in den Benutzernamen eingegeben haben, wird im Passwortdialog wahrscheinlich nichts angezeigt.

Es ist erwähnenswert, dass dies nicht einfach clientseitig erfolgen muss, sondern Dies kann auch auf einem Server erfolgen, solange der verwendete Transport sicher ist und die Eingabe erst protokolliert wird, nachdem überprüft wurde, ob das Kennwortfeld nicht leer ist.

Einfach und doch elegant. Ich wünschte, ich könnte es mit +5 bewerten.
Tatsächlich. Wenn wir versuchen, dies mit einem Grundfilter zu kombinieren, wie von @CodesInChaos vorgeschlagen. +1
Eine umgangene Javascript-Steuerung würde den Benutzernamen über die Leitung senden, an der das Risiko besteht. Es würde von etwas ähnlichem wie Wireshark ausgewählt werden und wenn es ssl wäre, wäre es immer noch beispielsweise sslstrip http://www.thoughtcrime.org/software/sslstrip/
Schade, dass wir MS nicht davon überzeugen können, dies für den Windows-Anmeldedialog zu implementieren.
@asadz - Ja, es ist keine Verhinderung, dass ein Angreifer etwas unternimmt. Die Frage war nur, was getan werden kann, um zu verhindern, dass Kennwörter von Benutzern, die Fehler machen, in Protokolldateien landen.
Kann dies ohne JavaScript-Steuerelemente in modernen Browsern garantiert werden? Gibt es vor HTML5 irgendeine Art von Formularelement (http://john.foliot.ca/required-inputs/)?
@DanNeely Der Windows-Anmeldedialog kann jedoch ein Kennwort mit der Länge Null haben. Diese Lösung kann dort also nicht implementiert werden, oder?
@EricG: Da das Hauptanliegen des OP eher Serverprotokolle als Netzwerk-Sniffing sind, kann die Logik serverseitig dupliziert werden, bevor der Benutzername in die Protokollnachricht aufgenommen wird.
@ruakh: Das ist ein guter Punkt, aber das steht nicht in der Antwort, sondern darin, das Senden von Formularen zu verhindern und nicht die Protokollierung zu verhindern, was in einigen anderen Antworten vorgeschlagen wird.
@EricG: Ja, ich stimme zu. Der Hauptzweck von Kommentaren besteht darin, die Antworten zu verbessern. Daher schlug ich etwas vor, von dem ich dachte, dass es Ihnen helfen würde, Ihr Problem mit dieser Antwort anzugehen.
@AnuragKalia aktivieren Sie es daher nur, wenn eine Kennwortrichtlinie vorhanden ist.
@AJ Henderson populärer Beitrag :).
Einverstanden - schöner schneller und einfacher Gewinn für den Kunden.
Hat jemand einen konkreten Weg, dies zu tun, oder verlassen wir uns nur auf JavaScript? Wenn ja, sollten wir diese Antwort mit einigen Details erweitern?
@EricG - Ich habe die Antwort aktualisiert, um zu berücksichtigen, dass dies auch serverseitig erfolgen kann. Während Form ein Schlüsselwort für HTML-Posts ist, war es nie eine beabsichtigte Implikation meiner Antwort. Die Idee ist einfach, dass Sie einen Anmeldeversuch erst verarbeiten, wenn das Kennwortfeld einen Wert hat. Dies kann auf dem Server oder Client sein.
@Iszi Sie können ihm +5 geben, indem Sie ein Kopfgeld fallen lassen.
@AJHenderson: Ich würde jedoch annehmen, dass Ihre Webserver- oder Netzwerkverkehrsprotokolle das Kennwort enthalten. Sie können die Verarbeitung beenden, bevor Protokolle auf Anwendungsebene erstellt werden. Sie benötigen Filter für Ihre Web- / Netzwerkprotokollierung.
@EricG - Wenn Sie die Post-Daten jeder Forum-Einreichung protokollieren, wird dies eine Menge Protokollierung bedeuten. Ich nehme an, Sie müssten immer noch vorsichtig sein, wie Sie die Dinge einrichten, aber ich denke, Sie könnten wahrscheinlich umgehen, dass sie protokolliert werden, solange die Authentifizierung nicht tatsächlich versucht wird. Zugegeben, es funktioniert möglicherweise nicht in allen Systemen.
Schöne Lösung, danke für diesen Vorschlag! Alle Anmeldedialoge sollten dies implementieren. Ich beginne damit, es in einer meiner Anwendungen zu implementieren.
fixulate
2013-03-05 22:13:39 UTC
view on stackexchange narkive permalink

Angenommen, Ihre Backend-Anwendung und SIEM müssen fehlgeschlagene Anmeldeversuche bei verschiedenen Anwendungen anzeigen (und daher die Fehlermeldung "Benutzer P @ $$ w0rd ist ungültig" anzeigen), dann ist es nicht trivial, dies zu stoppen.

Es ist jedoch eine gute Möglichkeit, sicherzustellen, dass alle Anwendungen, die vertrauliche Daten einschließlich Benutzernamen und Kennwörtern senden, HTTPS (verschlüsseltes HTTP mit SSL) implementieren, um sicherzustellen, dass Netzwerkgeräte und alle Personen im Netzwerk nicht das Kennwort erhalten, das fälschlicherweise verwendet wurde in das Feld für den Benutzernamen eingegeben!

Tatsächlich. das würde die Hälfte meiner Probleme / Bedenken lösen. +1. Vielen Dank.
Ich denke, SSL ist eine Problemumgehung, keine Code-Korrektur. Probleme sollten bestenfalls an der Quelle behoben werden.
@asadz: Die Tatsache, dass die Anwendung den Benutzernamen anzeigt, wenn sie falsch eingegeben wird, ist kein Anwendungsfehler, sondern eine beabsichtigte Funktionalität und erfordert keine Korrektur imo.
@devcity2012 Eine beabsichtigte Funktionalität, aber vielleicht schlecht gedacht; Es gibt einen Teil der Anforderungsanalyse in der Softwareentwicklung. Hier sollten diese Dinge vorzugsweise mithilfe eines Sequenzdiagramms überprüft werden. Wie kommt es, dass vor dem Absenden keine Prüfung auf ein Formular erfolgt? Eingabevalidierung ungültig?
Wenn das Formular einen Benutzernamen und ein Kennwort enthält und beide vorhanden sind und das Backend so konfiguriert ist, dass der Benutzername angezeigt wird, ist dies kein Anwendungsfehler, wenn der Benutzer fälschlicherweise sein Kennwort in das Textfeld Benutzername eingibt.
Ich spreche es nur in einem Sinne als Problem, in dem eine Anfrage nur basierend auf dem Feld für den Benutzernamen gesendet wird.
Ja klar, dann kann das ja gestoppt werden. :) :)
goodguys_activate
2013-03-05 23:43:00 UTC
view on stackexchange narkive permalink

Das Problem ist also, dass Analysten die Kennwörter nicht in den vertraulichen Protokolldateien sehen sollen.

Achtung: Selbst wenn Sie Javascript verwenden, werden die auf Ihrer Festplatte gespeicherten Kennwortdaten nicht im Klartext verarbeitet.

Eine bessere Lösung besteht darin, die Protokolle vorzuverarbeiten, bevor die Analysten sie sehen, und Informationen in den Protokollen zu redigieren.

Sie können diese zeilenweise Filterung durchführen, wenn Sie Zeilen auf die Whitelist setzen oder andere auf die schwarze Liste setzen Linien. Beispiel:

Sie können Benutzernamen auf die Whitelist setzen, wenn sie in einer Protokolldatei mit

  • einem Muster ([az] + Nummer) oder angezeigt werden ([az] + Punkt + [az])
  • enthält einen Domänennamen, gefolgt von einem Schrägstrich "\" für AD-Umgebungen.
  • wird mehrmals angezeigt.
  • Can Sie müssen mit einem LDAP-Verzeichnis bekannter Benutzernamen verglichen werden, bevor die Analysten es sehen.

Sie identifizieren Kennwörter auch anhand von:

  • Die Kennwortrichtlinie folgt häufig einem Muster (ein Symbol, obere / untere, x Zeichen ...).

Mit diesem Wissen können Sie einen benutzerdefinierten Protokolldatenbereiniger erstellen, um die von Ihnen eingegebenen Informationen zu schützen Ich möchte nicht, dass Analysten sehen.

Wie sieht eine gefilterte Zeile aus?

Sie können fragwürdige Benutzernamen einfach redigieren, indem Sie sie hashen, ihnen eine menschliche ID zuweisen und sie speichern Ein sicherer Speicherort:

  eb574b236133e60c989c6f472f07827b Redact1 7e67b89a695bfbffc05b7ed2c38f927f Redact2 ..etc  

Die Analysten können immer wieder feststellen, ob ein bestimmter Eintrag wiederholt wird in der Frequenz.

Die genaue Hashing-Methode (oder Verschlüsselungsmethode), die Sie auswählen, unterliegt Risiken, da diese "Hash-Datenbank" hochwertige Informationen enthält. Und Seeding verhindert (von Natur aus) eine Frequenzanalyse, die für Sie von Wert sein kann oder nicht.

+1 Es ist eine gute Idee, immer davon auszugehen, dass Protokolle vertrauliche Informationen enthalten, sofern dies nicht ausdrücklich redigiert wurde oder bis das Gegenteil bewiesen ist.
Nathan Goings
2013-03-06 07:13:02 UTC
view on stackexchange narkive permalink

Ich kann nur drei Probleme mit dem, was Sie besprechen, identifizieren.

  1. Benutzer geben Informationen nicht korrekt ein.
  2. Analysten können Kennwörter aus Protokollen erkennen.
  3. Passwörter werden im Klartext gesendet und sind anfällig für man-in-the-middle strike> lauschen.
  4. ol>

    Meiner Meinung nach ist dies der Fall ziemlich einfach zu beheben.

    1. Benutzerfehler akzeptieren, widerwillig .
    2. Protokollieren Sie keine ungültigen Benutzernamen, sondern protokollieren Sie fehlgeschlagene Versuche und IP.
    3. Senden Sie keine Benutzernamen im Klartext. Verwenden Sie Technologien wie HTTPS oder Javascript, um den Klartext zu codieren (z. B. ROT13).
    4. ol>

      Beispielprotokoll einer fehlgeschlagenen Anmeldung und anschließend ein erfolgreicher Wiederholungsversuch.

        [00:00:00] Ein Konto konnte sich ab 192.168.1.100 nicht anmelden. [00:21:00] Erfolgreiche Anmeldung 'root' ab 192.168.1.100  

      Beim Lesen anderer Antworten möchte ich dies einschließen.

      • Überprüfen Sie alle Felder vor dem Absenden.
      • Ziehen Sie in Betracht, das Formular als Eric zwischen mehreren Seiten aufzuteilen G erwähnt.
Ich bin mir nicht sicher, was genau Sie unter "Rollen Sie Ihre eigenen in Javascript" verstehen, aber ich bin mir ziemlich sicher, dass es eine schlechte Idee ist.
-1 Rollen Sie niemals Ihr eigenes https in Javascript. Wenn Sie das nicht gemeint haben, klären Sie dies bitte.
@makerofthings7 habe ich geklärt. Ich habe nie gesagt, roll https in Javascript, ich sagte ODER Javascript (mit Verschlüsselung geklärt). Obwohl dies nicht die einfachste Implementierung * korrekt * ist, gibt es Ressourcen für diese Art von Lösung. Es ist eine gültige Antwort und ich verstehe nicht, warum es einen negativen Punkt wert ist.
Javascript mit Krypto-Code, der vom Server geliefert wird (was Sie zu beschreiben scheinen), ist selten eine gute Idee. Der Server kann diesen JS-Code ändern und die lokalen privaten Schlüssel verfügbar machen. Ein weiterer Vektor ist XSS / CSRF. Es ist ein riskantes Sicherheitsdesign. HTTPS sollte ein Minimum sein. Lassen Sie mich wissen, wenn Sie an eine andere Bereitstellung denken, z. B. eine in PhoneGap verpackte HTML / SPA-Anwendung oder ähnliches.
@makerofthings7, Mein Denkprozess war nicht für Mann in der Mitte. Das ist eine Dose Würmer. Ich stellte mir das Abhören vor. Eines der Systeme, an denen ich gearbeitet habe, hat alle Formulardaten mit Javascript (mit einem zufälligen Schlüssel) codiert, sodass Mitarbeiter sich nicht gegenseitig beschnüffeln konnten.
Eric G
2013-03-06 01:49:18 UTC
view on stackexchange narkive permalink

Eine Lösung, die einige Banken zumindest in Web-Apps implementiert haben, ist die Anmeldung auf zwei Seiten.

  1. Akzeptieren Sie auf der ersten Seite nur den Benutzernamen
  2. Fordern Sie auf der nächsten Seite des Prozesses das Kennwort an und geben Sie den Benutzernamen nur zurück, damit es sich nicht um ein bearbeitbares Feld handelt.
  3. ol>

    Daher sollte die einzige Eingabe auf der zweiten Seite das Passwort sein. Da der Benutzer weiß, dass er die erste Seite mit einem Benutzernamen löschen muss, weiß er, dass er dieses Gate löschen muss. Die einzige Option auf der zweiten Seite ist das Kennwort.

    Wenn Sie diesen Workflow implementieren können, können Sie die Benutzer darauf konzentrieren, was sie wann eingeben.


    Berücksichtigen Sie auch Ihre Protokollierung: Möglicherweise können Sie Ihre Protokollierung ändern tatsächliche Anmeldeinformationen nicht enthalten?

    Verwenden Sie beispielsweise bei einer erfolgreichen Anmeldung die Primärschlüssel-ID, anstatt die Eingabe zurückzugeben: "Der Benutzer mit der ID: '2342342' hat versucht, sich anzumelden", dann "Der Benutzer mit der ID '2342342' hat erfolgreich ein Passwort angegeben ".

    Wenn Sie nachschlagen und der Benutzername nicht vorhanden ist, hat beispielsweise "Benutzer von IP-Adresse '192.168.0.10' versucht, sich mit einer ungültigen Benutzer-ID anzumelden".

    Dies wären Ihre Protokolle auf App-Ebene. Webserver-Protokolle können Abfrageparameter enthalten, sodass die Adressierung möglicherweise etwas schwieriger ist, oder Sie können eine Art Proxy-Filter zwischen die Aktion und das Schreiben des Protokolls einfügen, um den Protokollinhalt basierend auf bestimmten Regeln zu redigieren. Dies wäre plattformspezifisch, aber es sieht so aus, als ob es unter Apache möglich sein könnte.

    Beschränken Sie als sekundäre Steuerung den Lesezugriff auf die verschiedenen Protokolldateien, die Sie verarbeiten.

serielle Authentifizierung? vielleicht
Zwei-Schritt-Formulare sind tatsächlich der Ort, an dem ich am wahrscheinlichsten stolpere und mein Passwort in das Feld Benutzername auf der ersten Seite gebe!
Es würde mich interessieren, mehr über den UX-Fall zu erfahren. Haben Sie einen Grund, warum Sie glauben, dass dies passiert? Speichert der Site-Login Ihren Benutzernamen bei wiederholten Besuchen oder nicht? Ich würde mir vorstellen, dass dies helfen würde (aber weh tun könnte), da Sie nicht einmal ein Feld zum Eingeben hätten, wenn es Ihren Benutzernamen vorfüllt. Lassen Sie mich einige Details wissen und ich werde sehen, ob ich meiner Antwort einige zusätzliche Informationen hinzufügen kann.
Das macht mich viel weniger frustriert, dass eine meiner Banken dies tut, danke für diese Antwort (hah).
Abhijit
2013-03-06 01:23:39 UTC
view on stackexchange narkive permalink

Im Allgemeinen sind alle Client-Codes intelligent genug, um grundlegende Fehler zu behandeln.

  1. Benutzer-ID und / oder fehlendes Passwort
  2. Passwort entspricht nicht den Richtlinien
  3. ol>

    Wenn Sie diese Einträge immer noch im Protokoll sehen, wird

      Benutzer P @ $$ w0rd nicht [...] beendet. Ein Konto konnte sich nicht anmelden: P @ $$ w0rd [...]  

    Keine der Client-Überprüfungen hat funktioniert, und das System hat das unverschlüsselte Kennwort über das Netzwerk gesendet. Was war also im Passwortfeld? Auf keinen Fall leer, da die Client-Validierung fehlschlagen würde. Es muss etwas anderes sein als das Passwort

    . Machen Sie also eine Zwei-Pass-Authentifizierung.

    1. Beim ersten Pass senden Sie alle verschlüsselten Details einschließlich des Passworts an den Server. Überprüfen Sie, ob das Feld Kennwort leer ist.
    2. Erster Durchgang, Überprüfen Sie, ob das Kennwort mit den Richtlinien übereinstimmt. Andernfalls Fehler.
    3. Erster Durchgang. Überprüfen Sie anschließend, ob das Kennwort in Ihrer Datenbank vorhanden ist. Wenn nicht Fehler aus.
    4. Senden Sie eine RPC-Antwort an den Client zurück und lassen Sie ihn jetzt die Benutzer-ID und das Kennwort senden.
    5. Führen Sie nun den Authentifizierungsprozess aus
    6. ol >

      Die ganze Essenz dieses Prozesses besteht darin,

      1. das Risiko zu minimieren. Beachten Sie, dass Sie das Risiko für Zero
      2. , dem Client nicht zu vertrauen, nicht ausschließen können.
      3. ol>

        Lassen Sie Ihre Benutzeroberfläche schließlich von einem UX-Experten überprüfen. Möglicherweise weist Ihre Benutzeroberfläche einen Fehler auf, der dazu führt, dass Benutzer das Kennwort in das ID-Feld eingeben.

Hervorragender Vorschlag. Ich denke, die meisten Antworten hier haben bisher eine gute Zusammenfassung geliefert, und alles macht sehr viel Sinn. +1
Kevin Reid
2013-03-06 10:06:44 UTC
view on stackexchange narkive permalink

Nach Ihrer Beschreibung Ihrer Architektur ist dies nicht möglich, aber meiner Meinung nach lautet die richtige Lösung: Senden Sie den Benutzernamen nicht im Klartext und protokollieren Sie keine Benutzernamen fehlgeschlagener Anmeldeversuche. Der einzige Ort, an dem der Benutzername und das Kennwort gespeichert werden sollen, ist das Subsystem, das das Kennwort überprüft. Bis dahin ist der Benutzername nicht authentifizierte, willkürliche Daten - jeder, der Zugriff auf das Anmeldeformular hat, bei dem es sich in einer Webanwendung um das gesamte Internet handelt, kann alles eingeben, was er möchte, wie oft er möchte - und daher sagt Ihnen sehr wenig von Interesse. (Es sei denn, Ihr Anmeldeformular ist nicht für das Internet verfügbar.)

Dies würde wahrscheinlich einen Großteil der Protokollanalyse eliminieren, da nicht festgestellt werden kann, wer was getan hat ...? P. >

Wenn Sie einen Benutzernamen ohne das richtige Kennwort angegeben haben, wissen Sie nicht, dass die Anfrage tatsächlich von diesem Benutzer stammt. Sie wissen also immer noch nicht, wer stark> hat den Anmeldeversuch gemacht.

+1 für die Frage, ob wir den Benutzernamen wirklich kennen müssen oder nicht. Ich neige dazu zu denken, dass wir noch einen Benutzernamen in den Protokollen haben müssen, könnte aber ansonsten überzeugt sein, wenn die Argumente stark genug sind. Einer der Gründe ist die Verwendung der Korrelations-Engine, um Zeit-, Frequenz-, Quell- und Ziel-IPs mit dem Benutzernamen zusammenzustellen. Wie gesagt, ich habe immer noch keine sehr schlüssige Meinung dazu, aber danke für den Gedanken: Es hat mich dazu gebracht, noch mehr darüber nachzudenken. @KevinReid
nalply
2013-03-06 17:24:05 UTC
view on stackexchange narkive permalink

Das allgemeine Problem ist die kennwortbasierte Authentifizierung. Jeder Tante-Emma-Laden besteht auf einer eigenen Authentifizierung mit Passwörtern. Das ist dumm.

Lassen Sie einen anderen Identitätsanbieter die harte Arbeit leisten, um die Anmeldeinformationen sicher zu halten. Gehen Sie genauso vor wie bei StackOverflow: Ermöglichen Sie die Authentifizierung mit OpenID, Google Mail usw.

Ihre Benutzer werden es Ihnen danken, dass Sie irgendwo kein weiteres Kennwort benötigen.

dr jimbob
2013-03-06 04:29:30 UTC
view on stackexchange narkive permalink

Client-seitiges Javascript erscheint vernünftig.

Überprüfen Sie, ob das Kennwortfeld vor der Übermittlung nicht leer ist. Überprüfen Sie, ob der Benutzername in einer gültigen Form vorliegt. Besonders elegant ist etwas, bei dem der Benutzername eine E-Mail-Adresse sein muss. Sie können außerdem verhindern, dass das Passwort in Ihrem Mechanismus zum Festlegen / Ändern von Passwörtern in Form einer E-Mail-Adresse vorliegt. Überprüfen Sie dann einfach, ob der Benutzername in Form einer gültigen E-Mail-Adresse vorliegt, bevor Sie das Formular senden. Dies könnte ähnlich mit beispielsweise Sonderzeichen oder Zahlen geschehen. (ZB sind in Kennwörtern Zahlen / Sonderzeichen erforderlich, Benutzernamen jedoch verboten.)

Verwenden Sie außerdem für alle Formularübermittlungen eine aktuelle SSL-Bibliothek (dies sollte erfolgen, um zu verhindern, dass Netzwerk-Lauscher abhören im). Zum Lesen dieser Protokolle sind erhöhte Berechtigungen erforderlich (z. B. kann das Webserverkonto in diese Protokolle schreiben, aber nur root kann sie lesen). Sobald das Kennwort den Authentifizierungsschritt nicht besteht, geben Sie den Benutzernamen nicht an andere Systeme weiter. (Verwenden Sie auch SSL zwischen verschiedenen internen Systemen, um Netzwerk-Lauschangriffe zu verhindern.)

Daniel Pryden
2013-03-06 09:53:14 UTC
view on stackexchange narkive permalink

Ich mag den Ansatz, den mein aktuelles Unternehmen bei diesem Problem verfolgt: Wenn Sie Ihr Passwort in das falsche Feld eingeben, läuft Ihr Passwort durch ein automatisiertes System sofort ab. Daher muss der Benutzer sein Kennwort ändern, und das Kennwort im Protokoll ist jetzt nicht mehr anfällig.

Dies ist natürlich immer noch nicht ideal, wenn der Benutzer dieses Kennwort weiterhin für ein anderes System verwendet. Wenn ein Benutzer jedoch hoffentlich gezwungen wird, sein Kennwort zu ändern, wird er sich der möglichen Sicherheitsrisiken bewusster.

Wie funktioniert das? Überprüft es den "Benutzernamen" mit dem in der Datenbank gespeicherten "Passwort", erzwingt das Zurücksetzen, wenn sie übereinstimmen? Ist dies webbasiert oder auch auf Windows / LDAP-Ebene? Wenn ja, ist dies ein kundenspezifisches oder handelsübliches Produkt?
@EricG: Es ist ein benutzerdefiniertes System, und ich habe es nicht erstellt, daher weiß ich nicht wirklich, wie es implementiert wurde. Das heißt, ich glaube, es funktioniert, indem der Benutzername gehasht und die Hashes mit den Passwort-Hashes verglichen werden. Meines Wissens nach führen sie eine Datenbank mit "unter verdächtigen Umständen gefundenen Passwörtern" und verfallen alle aktiven Passwörter, die dieser Liste entsprechen.
Ich denke, Sie haben den Teil verpasst, in dem er gefragt hat, woher sie wissen, dass das Passwort in das Namensfeld eingegeben wurde.
@jcolebrand: Entschuldigung, ich dachte, ich hätte Folgendes erklärt: Hash, was auch immer in das Feld Benutzername eingegeben wird, und überprüfen Sie den Hash anhand der Kennwortdatenbank. Verwenden Sie optional so etwas wie einen Bloom-Filter, wenn Sie eine wirklich große Passwortdatenbank haben und diese schnell überprüfen möchten. Ich habe keine Ahnung, ob sie das tatsächlich tun: Vielleicht gibt es einen noch besseren Weg.
Das kann tatsächlich eine gültige Sache sein. Dann ist das Problem, dass ich 1234567 oder Passwort1 usw. eingeben und eine ganze Menge Passwörter ungültig machen kann. Wenn ich glaube, ich kenne das Passwort meines Freundes usw.
Ich bin bei EricG. Ich verstehe nicht, wie ich dies tatsächlich auf sichere Weise implementieren kann. Wenn in der Kennwortdatenbank ein Kennwort mithilfe eines Salt gespeichert wird (und ein langsamer Kennwort-Hash wie bcrypt verwendet wird), ist es nicht einfach zu überprüfen, ob ein falscher Benutzername tatsächlich das Kennwort einer Person ist, und wenn ja, finden Sie heraus, wer es war - das Beste, was Sie tun können ist eine umfassende Suche über alle Benutzer in der Datenbank, die nicht skalierbar ist. Wenn die Passwortdatenbank kein Salt verwendet (oder keinen langsamen Passwort-Hash), treten schwerwiegendere Probleme auf - das ist definitiv ein Nein-Nein.
Izac Mac
2013-03-06 21:18:47 UTC
view on stackexchange narkive permalink

Meistens ist die EINFACHSTE Antwort die richtige Antwort. Jetzt stellen wir fest, dass jede E-Mail-Adresse kurz vor dem Domain-Namen mit einem "@" gekennzeichnet ist. Wenn Sie "@" zu einem NICHT AKZEPTIERBAREN Schlüssel im Passwort machen, ist die Lösung ziemlich offensichtlich. Wenn der Benutzername NICHT @ hat und ALLE BENUTZERNAMEN E-Mail-Adressen sind, protokollieren Sie nur diejenigen, die mindestens @ enthalten.

Wenn der Benutzername NICHT "@" hat, kann dies wahrscheinlich einige Benutzer verärgern, aber Dies ist eine saubere Lösung. Das heißt, EIN EINZIGES Sonderzeichen, das VOR einem Passwort kommt. Genau wie ALLE BENUTZERNAMEN, die E-Mail-Konten sind, haben sie ein Format. Alle Antworten haben am Anfang oder am Ende einen Sondercharakter. Wenn der Benutzer ein Kennwort eingibt, teilen Sie ihm mit, dass er es eingeben muss.

Die dritte Lösung ist die FARBCODIERUNG. Machen Sie das Benutzernamenfeld gelb und das Passwortfeld rot. Rot erregt normalerweise Ihre Aufmerksamkeit, da es für empfindliche Dinge verwendet wird. Selbst wenn sie auf die Tastatur schauen, werden sie SEHR SCHNELL LERNEN, dass Passwörter rot sind. Im Grunde genommen ist das Textfeld UND die Kennzeichnung des Kennworts vorzugsweise in einem separaten Feld rot und die Bezeichnung und das Textfeld des Benutzernamens sind GELB

Die Verwendung von E-Mail-Adressen als Benutzernamen ist für öffentliche Apps alles andere als universell und in internen Apps selten. Es ist unwahrscheinlich, dass die Farbcodierung hilft: Der übliche Grund für die Verwendung des falschen Felds ist die Unaufmerksamkeit, auf welches Feld fokussiert wird (insbesondere, wenn das Feld für den Benutzernamen normalerweise vorab ausgefüllt ist, aus irgendeinem Grund jedoch nicht in einem Fall).
l--''''''---------''''''''''''
2013-03-06 02:01:05 UTC
view on stackexchange narkive permalink

Warum nicht einfach damit antworten?

  Dieser Benutzername existiert nicht  
Sie sollten dies wahrscheinlich nicht tun oder sich in der Antwort eine andere Zeit nehmen. Antworten wie diese und manchmal der Unterschied in der Zeit, die für die Verarbeitung benötigt wird, können missbraucht werden. Sie enthalten eine Liste gültiger Benutzernamen, die sogar aus anderen Gründen als dem Versuch verwendet werden können, Zugriff auf die Site / den Dienst selbst zu erhalten (z. B. könnten sie Versuchen Sie, in Google Mail usw. eine E-Mail an denselben Benutzernamen zu senden.
@GaryS.Weaver: <- Ja. Beispielsweise erstellen Sie einen A / B-Test in Ihrem Brute Forcer, und wenn Sie die verschiedenen Bedingungen erhalten, von denen Sie wissen, dass Sie einen gültigen Benutzernamen identifiziert haben.
@GaryS.Weaver gibt es keine narrensichere Lösung, aber denkst du nicht, dass das ein wenig übertrieben ist? Er betreibt nicht americanexpress.com
@ Артём-Царионов Es liegt an Ihnen, ihm und allen anderen, die Sicherheit nach eigenem Ermessen zu implementieren.
Das Problem bei der Frage ist, dass der Benutzername in Protokolldateien landet, die den Benutzernamen dauerhaft im Klartext aufzeichnen. Wenn der Server jemals kompromittiert wurde oder ein Administrator nicht ehrlich war, konnte er ohne Aufzeichnung im System auf das Benutzerkonto zugreifen. Die Protokolldatei muss noch wissen, welche Benutzernamen versucht werden, daher müsste die Lösung irgendwie verhindern, dass ein Kennwort in einem Protokoll gespeichert wird, wenn es in das Feld Benutzername eingegeben wird.
-1
A. Wilson
2013-03-06 06:48:39 UTC
view on stackexchange narkive permalink

Wie viel Kontrolle haben Sie darüber, wie der empfangende Server damit umgeht? Es scheint, als ob die Lösung, die ein Benutzer oben vorgeschlagen hat, um sowohl den Benutzernamen als auch das Kennwort zu hashen, auf verschiedene Arten funktioniert:

Methode 1 (JavaScript erforderlich): Hash sowohl des Benutzernamens als auch des Kennworts. Speichern Sie in Ihrer Datenbank gehashte Benutzernamen und führen Sie dann Ihre Authentifizierungssuche mithilfe dieses Felds durch. Dies ist ideal, wenn Sie die Kontrolle über die Art und Weise haben, wie die Daten auf Ihrem Server behandelt werden, aber nicht die Protokollierungskapazität.

Methode 2 (ohne JavaScript): Empfangen Sie den Benutzernamen wie gewohnt im Klartext. Konvertieren Sie es jedoch wie in Methode 1 in einen Hash, sobald Sie es auf dem Server erhalten haben. Wenn der Versuch fehlschlägt, protokollieren Sie den Hash und nicht den Benutzernamen. Die Protokolle sind weiterhin nützlich (etwas weniger nützlich, wenn sie kursiv überprüft werden), da jeder Hash einen Benutzer immer noch eindeutig identifiziert. Keines davon ist so elegant wie die Top-Antwort hier (und ich würde vorschlagen, dies auch zu verwenden), aber sie sind gründlicher.

sharp12345
2013-03-06 08:52:51 UTC
view on stackexchange narkive permalink
  • erlaubt nur das Übertragen von MD5-Hashes von Benutzernamen UND Passwörtern (oder ähnlichen Hashs), so dass alles, was in den Protokolldateien protokolliert wird, immer wie eine feste Länge zufälliger Zeichen aussieht, was niemandem möglich ist Erraten Sie schnell, dass es sich um einen MD5 eines Passworts oder eines Benutzernamens handelt.

Con: Um mit Benutzernamen in Ihrer Datenbank zu vergleichen, müssen Sie entweder zwei Spalten speichern, z. 'Benutzername' und 'md5 (Benutzername)' ODER Sie müssen jedes Mal, wenn Sie den Benutzernamen für die Anmeldung abfragen, dynamisch hashen.


  • Erstellen Sie einen Protokolleintrag nur, wenn der Benutzername in der Datenbank vorhanden ist. Andernfalls protokollieren Sie nur die IP-Adresse.

  • Erlauben Sie dem Benutzer, mit der Maus und nicht mit der Tastatur auf die Eingabetaste zu klicken, oder lassen Sie die Tastatur erst nach 5 Sekunden des zuletzt eingegebenen Zeichens in einem der Felder zu, damit der Benutzer Zeit hat, auf den Bildschirm zu schauen und seinen Fehler zu erkennen.
    • beschränken Sie zulässige Benutzernamen und Kennwörter:

      1. Kennwörter müssen ein Sonderzeichen wie! @ # $% ^ & * enthalten. ()
      2. Benutzernamen dürfen KEINE Sonderzeichen enthalten
      3. ol>

    Auf diese Weise können Sie mit Javascript schnell feststellen, ob es sich bei dem eingegebenen Benutzernamen um einen handelt oder Passwort.

louis_coetzee
2013-03-06 15:54:52 UTC
view on stackexchange narkive permalink

Eine einfache, aber ärgerliche Lösung könnte darin bestehen, ein Bildschirmtastaturlayout mit HTML-Schaltflächen zu haben, in dem Benutzer ihren Benutzernamen nur über diese Schaltflächen eingeben können. Dadurch wird verhindert, dass der Fehler gemacht wird. Mir ist klar, wie ärgerlich dies sein kann out to be, aber nach dem ersten Login können Sie ein Cookie verwenden, um sich den Benutzernamen zu merken und ihn nicht erneut zu benötigen. Javascript wird natürlich benötigt. Jetzt ist es unmöglich, das Passwort versehentlich im Klartext zu senden. Hoffe es hilft.

stimmt jedoch, was ist mit Personen, die sich von einem Laptop aus bei ihrer Windows-Domäne anmelden? Wir sammeln auch diese Protokolle.
Tek Tengu
2013-03-06 17:55:00 UTC
view on stackexchange narkive permalink

Ich habe eine andere Einstellung ... Welches Problem versuchen Sie wirklich zu lösen?

  1. Falsche Passwörter? Das heißt, Wenn Sie sehen, dass eine Person "Passwort" (oder eine Variante) verwendet, möchten Sie in der Lage sein, zum Benutzer zurückzukehren und es zu korrigieren?

  2. Passwörter, die im Klartext gesendet werden?

  3. Oder das Problem mit Idioten, die keine Formulare eingeben oder lesen können (oder vielleicht eine schlecht gestaltete Benutzeroberfläche)?

  4. ol>

    Denken Sie immer daran, dass Sie bei jedem "Hinzufügen" zum System möglicherweise Komplexität hinzufügen und definitiv Code hinzufügen - beides erhöht die Möglichkeit, dass Sie irgendwo Sicherheitslücken in Ihrer Gesamtarchitektur öffnen (möglicherweise im Stapel, möglicherweise) über das Web könnte über das Netz sein ...). Wenn Sie also eine der drei lösen, müssen Sie messen, ob der Wert der Lösung das Risiko wert ist, ein Loch zu stechen, von dem Sie nichts wissen - der Teufel, den Sie kennen, ist immer besser als der Teufel, den Sie nicht kennen.

    Nun zu jedem.

    Das Auflösen fehlerhafter Passwörter sollte beim Einrichten und Ändern des Passworts über die Validierungsregeln erfolgen. Und nur dort. Wenn Sie einen weiteren Ort hinzufügen, besteht nur die Gefahr, dass die Validierungsregeln verwirrt oder nicht mehr synchron sind.

    Passwörter werden im Klartext gesendet. Wen interessiert das? Zugegeben, es könnte sich unsicher anfühlen, aber denken Sie daran, dass dies eine n-teilige Authentifizierung ist. Wenn Sie nur einen Teil haben, unterscheidet sich dies nicht von einem Wort in einem Wörterbuch. Vielleicht, nur vielleicht, wenn Sie einen aktiven Schnüffler haben, kann er ihnen einige Hinweise geben, aber dann ist das bereits vorhandene Eindringen Ihr eigentliches Problem, nicht ein gelegentliches, zufälliges, fettes Fingern von Passwörtern im Feld für den Benutzernamen. Nun, wenn alle Teile in dem klaren, großen Problem gesendet werden.

    Problem mit Idioten oder schlechtem UI-Design. Benutzer oder Benutzeroberfläche erneut vermitteln. Einfach. Bieten Sie aktive Hilfe auf der Benutzeroberfläche an, lassen Sie die Abteilungen eine Schulung durchführen oder so. Einfache Lösung, die begrenzte Codierungsänderungen mit geringem Risiko erfordert (oder - sollte jedoch mit dem UI-Aspekt vorsichtig sein).

    Während ich viele der Vorschläge hier bewundere und viele von ihnen wunderbare Ideen in ihrem Kern haben. Ich empfehle einen KISS, keinen BS-Ansatz, und denke immer daran, dass Sie beim Hinzufügen zu Ihren Systemen das Risiko eingehen, Ihre Unsicherheit zu erhöhen.

    Nur meine 2 Cent.

rjt
2014-07-31 14:21:09 UTC
view on stackexchange narkive permalink

Biometrie ist derzeit recht kostengünstig und funktioniert mindestens 80% der Zeit. Ich finde es großartig auf TabletPCs und wollte biometrische Tastaturen bereitstellen, weil es schneller ist (zumindest in 80% der Fälle).

Ich wette, dies war bei Win2000 bei weitem kein so großes Problem , WinXP, Win2003 und WinVista, da das Feld Benutzername standardmäßig bereits mit dem letzten erfolgreichen Benutzernamen gefüllt war. Nicht genau sicher, welche Version von ActiveDirectory oder Workstation geändert wurde, aber die Standardeinstellung ist jetzt, dass das Feld für den Benutzernamen leer ist, wodurch dieses Problem häufiger auftritt.



Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...