So implementieren Sie die automatische Anmeldung sicher

15

Ich habe viele, viele, viele Beiträge darüber gelesen, wie "Sie wahrscheinlich Passwörter falsch speichern". Sie beziehen sich immer auf das Speichern von Kennwörtern auf einem Server, auf dem sich ein Benutzer anmeldet. Grundsätzlich werden allgegenwärtige Ratschläge wiederholt (Wortspiel beabsichtigt), wie z. B. Sicherstellen, dass die Kennwörter gesalzen werden usw. usw. Ich habe jedoch noch nie einen Artikel über bewährte Methoden zum Speichern von Kennwörtern auf einem Client gesehen, damit sich der Client nicht anmelden muss manuell jedes Mal, wenn sie sich anmelden möchten; die Funktion "Erinnere dich an mich".

Viele Softwareteile verfügen über diese Funktion, von Browsern bis zu Programmen wie Dropbox.

Ich habe kürzlich einen alten Artikel darüber gelesen, wie Dropbox eine ID auf Ihrem Computer speichert, die Sie einfach kopieren / auf einen anderen Computer einfügen und Dropbox starten und als das Gerät angemeldet sein können, von dem Sie die ID erhalten haben. Kein Login, kein Nichts und voller Zugriff auf das Dropbox-Konto. Dies scheint ein wirklich dummer Entwurf zu sein, aber ich kann mir keinen besseren Weg vorstellen, dies zu tun.

Ich bin mir nicht mal sicher, wie ich vermeiden soll, dass so etwas wie ein Cookie im Klartext gespeichert wird. Wenn Sie es verschlüsseln, wo speichern Sie den Schlüssel, um es zu entschlüsseln?

Die einzige Möglichkeit, Sicherheitslücken zu vermeiden, besteht darin, die Autologin-Funktion zu entfernen und den Benutzer jedes Mal zur Eingabe seines Kennworts zu bewegen, wenn er einen Dienst nutzen möchte.

Was kann ich über das sichere lokale Speichern von Anmeldeinformationen lesen, um die automatische Anmeldefunktion zu implementieren? Wenn die Prinzipien für einen ganzen Artikel zu einfach sind, welche? Die betreffende Software sollte nicht von Funktionen abhängen, die nicht auf allen Plattformen verfügbar sind (wie der "Schlüsselbund", den einige Linux-Distributionen haben).

Jay Simon
quelle
2
Es geht darum, wem Sie vertrauen. Wenn Sie dem Computer nicht vertrauen, speichern Sie die ID. Dies ist Ihr Problem. Wenn Sie dem Schlüsselbund vertrauen, ist dies die maximale Sicherheit, die Sie erhalten. Natürlich können Sie auch benutzerdefinierte Sicherheitsfunktionen wie das Erkennen von Gerätehardware oder Ähnliches hinzufügen, aber alles ist fälschbar, sodass Sie es am Ende nicht wissen können. Es liegt außerhalb Ihrer Kontrolle. Natürlich dumme Dinge wie das Speichern von Klartext-Passwörtern ausgeschlossen.
Luc Franken
@LucFranken wie können Sie der Maschine vertrauen? Jemand kann Sie ausnutzen, wie es Dropbox tat. Ich würde auch dem Schlüsselbund vertrauen, aber nicht alle Computer haben einen, und Windows tut dies nie (AFAIK). Und wenn Sie Passwörter speichern, wie vermeiden Sie es, sie im Klartext zu speichern? Wenn Sie sie verschlüsseln, wo speichern Sie dann den Schlüssel, um ihn zu entschlüsseln?
Jay Simon
Das ist genau das, worauf Sie nicht vertrauen können. Der Benutzer kann nur definieren, um ihm zu vertrauen. Dies berücksichtigt, dass der Benutzer versteht, wie sicher sein Computer ist. Das Schreiben eines Virus zum Abrufen von Daten von Dropboxes ist nur möglich. Gleiches gilt für lokal gespeicherte Schlüssel und andere lokale Daten. Sie können dazu beitragen, die Sicherheit zu erhöhen (denken Sie an Apps, für die ein 5-Nummern-Code erforderlich ist). Letztendlich ist dies jedoch lokal und liegt außerhalb Ihrer Kontrolle.
Luc Franken
@ LucFranken ist es nur ich oder scheint Autologin ein allgegenwärtiges Feature? Wenn ja, warum haben die Leute nicht darüber geschrieben, wie man es richtig macht?
Jay Simon
Es ist eine so häufige Anforderung, obwohl einige weitere Unternehmenssoftware dies nicht zulässt. Zum Beispiel erlaubt SalesForce, nur den Benutzernamen zu speichern, nicht das Passwort. Lassen Sie uns übrigens klarstellen. dass Sie das Passwort nicht auf dem Client speichern müssen, um sich anzumelden. Sie können einen zufälligen Hash speichern, der einem Hash auf dem Server entspricht.
Luc Franken

Antworten:

12

Ein Weg ist:

  • Wenn sich der Benutzer anmeldet, speichern Sie eine Sitzungs-ID in einem Cookie auf dem Computer des Clients (nicht den Benutzernamen oder das Kennwort).
  • Binden Sie die Sitzung an die IP-Adresse, sodass eine einzelne Sitzungs-ID nur mit dem Computer funktioniert, auf dem sie gestartet wurde.

Je nachdem, in welchem ​​Framework Sie Ihre Site entwickeln, ist dieses Verhalten möglicherweise als integrierte Funktion verfügbar.

Da das HTTP-Protokoll ohnehin zustandslos ist, gibt es keinen funktionalen Unterschied zwischen der Beibehaltung der Anmeldung einer Person während einer einzelnen Sitzung zur Nutzung der Website und der automatischen Anmeldung bei der nächsten Nutzung der Website. Es ist nur eine Frage der Zeit, die Sie vor Ablauf der Sitzung einplanen.

Update: Verwenden Sie auch HTTPS, um die Sicherheit zu erhöhen.

Update 2: Beachten Sie, dass dieser Ansatz Einschränkungen aufweist, da er nicht für Benutzer geeignet ist, die ihre IP-Adresse häufig ändern. Es bietet jedoch ein erhöhtes Maß an Sicherheit und kann in bestimmten Situationen hilfreich sein.


quelle
1
Es hilft nicht viel, es an eine IP-Adresse zu binden, da jemand einen Computer hat, der sich hinter derselben Firewall befindet wie Sie.
Jay Simon
2
@ JaySimon, ich würde nicht sagen "hilft nicht viel". Die Anzahl der Computer, die sich hinter derselben Firewall befinden, ist erheblich geringer als die Anzahl der Computer auf der Welt. Es geht darum, Ihr potenzielles Angriffsrisiko zu begrenzen, und dies schränkt es erheblich ein. Dies ist ein Standardansatz, und ich glaube nicht, dass Sie darüber hinaus noch viel tun können. Wenn jemand die gleiche IP-Adresse wie der Benutzer hat und es schafft, eine Sitzungs-ID zu erhalten, ist diese Person aus Sicht des Servers vom Benutzer nicht zu unterscheiden. Wenn Sie haben jede Art von Log-in auf Ihrer Website, werden Sie zu einem solchen Angriff ausgesetzt.
3
Denken Sie, dass ein solcher Ansatz für Benutzer von Mobiltelefonen ärgerlich sein wird, deren IP-Adresse sich möglicherweise häufig ändert?
Jay Simon
@ JaySimon, wenn es innerhalb einer Sitzung passieren würde, würde der Benutzer es als plötzliches Abmelden erleben, was sicherlich ärgerlich wäre. Ich weiß jedoch nicht, wie oft sie sich tatsächlich ändern (eine schnelle Google-Suche gibt keine endgültige Antwort). Ich würde mir keine Sorgen machen, wenn sich die IP-Adresse nicht ändern würde, während sie tatsächlich verwendet wird.
Das Beschränken der Sitzung auf die IP ist wie gesagt nicht wirklich realistisch. Benutzer wechseln häufig den Standort. Mit Handys aber auch mit Laptops; Zum Beispiel Flex Working. Das Beste, was Sie tun können, sind einige GeoIP-Überprüfungen in Kombination mit der Reisezeit für diese Strecke. wie Google Mail.
Lode
5

Amazon (und viele andere) verwenden einen hybriden Ansatz. Sie bieten eine automatische Anmeldung zum Durchsuchen, Hinzufügen von Artikeln zum Warenkorb und zum Aufgeben von Bestellungen unter Verwendung der zuvor verwendeten Kombinationen aus Gutschrift und Versandadresse. Sie müssen jedoch für viele Aktionen Ihr Kennwort eingeben, z. B. zum Hinzufügen von Kreditkarten, zum Hinzufügen / Ändern von Lieferadressen, zum Aktualisieren von Kennwörtern, zum Anzeigen früherer Bestellungen (optional für den Benutzer) und für viele andere Kontoeinstellungen.

Also ja, Leute, die Zugang zu Ihrem Computer haben, könnten Ihre Sitzung übernehmen, aber Sie bekommen immer noch, was sie bestellen! (Noch wichtiger ist, dass der Anreiz, eine Sitzung zu hijacken, so gut wie zunichte gemacht wird.) Wenn jedoch jemand Zugang zu meinem Computer hat, habe ich größere Probleme als die Leute, die die durchschnittlichen Site-Sitzungen stehlen.

Wenn Teile Ihrer Anwendung nicht so sicher sind, können Sie ein Hybridmodell auswählen, in dem Sie eine Sitzungs-ID (Hash oder was auch immer) speichern, um Benutzer automatisch bei Teilen der Site mit niedriger Sicherheit anzumelden Sie müssen jedoch das Kennwort eingeben, wenn Sie höhere Sicherheitsbereiche betreten, und das Hochsicherheitstoken löschen, wenn die Sitzung endet.

Wenn dies eine Website auf Bankebene ist, ist die automatische Anmeldung natürlich keine Option. Wiederum setzen Sites, die diese Art von Sicherheit verwenden, den Wert der zu schützenden Daten und den zusätzlichen Komfort für den Benutzer voraus, um das potenzielle Risiko einer entführten Sitzung abzuwägen. Wenn Sie der Meinung sind, dass dies für Ihre Anwendung nicht der Fall ist, implementieren Sie keine automatischen Anmeldungen. Sie müssen darauf zugreifen können, welche Sicherheits- / Benutzerfreundlichkeits-Kompromisse für Ihren Anwendungsfall angemessen sind.

Eric G
quelle
2

Es ist eigentlich nicht so schwer. Speichern Sie zuerst ein Cookie mit diesem Format:

userID.token

Sie können einen sha1-Hash für das Token verwenden. Dann wird in der Benutzer-ID Ihres Datenbanktabellenspeichers "remember_me_tokens" ein bcrypt-Hash des Tokens und die Zeit, zu der das Token generiert wurde, angegeben.

Wenn jemand Ihre Website besucht, überprüfen Sie, ob das Cookie gesetzt ist. Wenn das Cookie gesetzt ist, prüfen Sie, ob innerhalb der letzten 7 Tage eine gültige Zeile in der Datenbank vorhanden ist. Wenn die Datenbank eine gültige Zeile für das Cookie enthält, legen Sie die Sitzung so fest, dass angezeigt wird, dass der Benutzer angemeldet ist. Löschen Sie außerdem die übereinstimmende Cookie- / Datenbankzeile und generieren Sie eine neue Cookie- / Token- / Datenbankzeile.

Wenn sie sich abmelden, löschen Sie den Cookie.

Führen Sie einen Cron-Job aus, um remember_me_tokens zu löschen, die älter als etwa 7 Tage sind.

Ryan
quelle
Was hindert jemanden daran, diesen Schlüssel zu kopieren, auf seinem Computer einzufügen und ohne Benutzernamen oder Passwort auf das Konto zuzugreifen?
Jay Simon
Wie bekommst du den Schlüssel? Es wird lokal auf dem Computer einer anderen Person gespeichert.
Ryan
Sie gehen zum Computer und öffnen die Datei, in der sie gespeichert ist :)
Jay Simon
2
@JaySimon Dasselbe Argument kann für jemanden vorgebracht werden, der sich anmeldet und 5 Minuten lang weggeht, ohne seinen Computer zu sperren, oder auf "Remember Me" klickt und jemand auf sein Kontopasswort zugreift. Wenn Sie diese mögliche Sicherheitssituation akzeptieren können, ist der Komfort gut, aber aus diesem Grund wird in der CIA-NOC-Liste keine Funktion zum Speichern von Daten angezeigt :) Der Server muss Ihnen eine Art Token geben, das der Client speichern muss auf dem Dateisystem. Aus Server-Sicht liegt es jedoch nicht mehr in Ihren Händen.
maple_shaft
@maple_shaft warum war irgendjemand überrascht, dass du das dann mit dropbox machen konntest? (Ich habe es in meiner Frage verlinkt.)
Jay Simon
0

Dies ist nur möglich, wenn Sie dem Gerät vertrauen, auf dem Sie es aufbewahren. Es liegt am Benutzer (wenn Sie das Gerät nicht beeinflussen können), wie sicher es ist. Es liegt einfach nicht in Ihrer Hand.

Wie in den Kommentaren angegeben:

Es geht darum, wem Sie vertrauen. Wenn Sie dem Computer nicht vertrauen, speichern Sie die ID. Dies ist Ihr Problem. Wenn Sie dem Schlüsselbund vertrauen, ist dies die maximale Sicherheit, die Sie erhalten. Natürlich können Sie auch benutzerdefinierte Sicherheitsfunktionen wie das Erkennen von Gerätehardware oder Ähnlichem hinzufügen, aber alles ist fälschbar, sodass Sie es am Ende nicht wissen können. Es liegt außerhalb Ihrer Kontrolle.

Luc Franken
quelle