SSL-Sitzung Persistenz und sichere Cookies

8

Ich habe derzeit einen eigenen Anwendungssicherheitsdienst, der in meinem Unternehmen ausgeführt wird und den geschäftlichen Anforderungen in den meisten Fällen entspricht.

Das Problem, mit dem ich derzeit konfrontiert bin, ist, dass der Dienst traditionell (naiv) darauf vertraut hat, dass die Quell-IP des Nutzers als Absicherung gegen Session-Hijacking konstant bleibt - die Web-Anwendungen im Unternehmen sind der Öffentlichkeit nicht direkt zugänglich und waren auch nicht Die Vergangenheit ist absolut akzeptabel für mich, dass die Adresse eines Benutzers während einer Sitzung konstant bleibt.

Leider ist das nicht mehr der Fall und ich bin daher gezwungen, zu einer Lösung zu wechseln, die nicht auf die Quell-IP angewiesen ist. Ich würde viel lieber eine Lösung implementieren, die die Absicht des ursprünglichen Designers tatsächlich erfüllt (d. H. Session-Hijacking verhindert).

Meine bisherigen Recherchen haben ergeben, dass dies im Wesentlichen "Salz" bedeutet Ihr Authentifizierungs-Token-Hash mit dem SSL-Sitzungsschlüssel. "

Auf den ersten Blick scheint dies eine perfekte Lösung zu sein, doch bleibt mir der nagende Verdacht, dass die Implementierung dieses Schemas in der Praxis aufgrund der Möglichkeit, dass der Client und der Server jederzeit - effektiv und willkürlich - funktionieren können, unpraktisch ist - Wählen Sie die SSL-Sitzung erneut aus und ändern Sie den Schlüssel.

Dies ist das Szenario, das ich mir vorstelle:

  1. SSL-Sitzung eingerichtet und Schlüssel vereinbart.
  2. Der Client authentifiziert sich auf der Anwendungsebene beim Server (d. h. über Benutzername und Passwort).
  3. Der Server schreibt ein sicheres Cookie, das den SSL-Sitzungsschlüssel enthält.
  4. Etwas tritt auf, das eine Neuverhandlung der Sitzung verursacht. Zum Beispiel denke ich, dass IE dies auf einen Timer mit oder ohne Grund tut.
  5. Der Client sendet eine Anfrage an den Server, der den alten Sitzungsschlüssel enthält (da es auf der Anwendungsebene keine Kenntnis der Neuverhandlung gab, gab es keine Möglichkeit, einen neuen, aktualisierten Hash zu schreiben Client).
  6. Der Server weist die Anmeldeinformationen des Clients aufgrund von fehlgeschlagenen Hash-Übereinstimmungen usw. zurück.

Ist das ein echtes Problem oder ist das ein Missverständnis meinerseits aufgrund eines (zumindest gelinde gesagt) nicht perfekten Verständnisses von SSL?

    
saladpope 27.02.2009, 18:15
quelle

3 Antworten

5

Siehe alle Themen im Zusammenhang mit SSL-Persistenz . Dies ist ein gut erforschtes Problem in der Load-Balancer-Welt.

Die kurze Antwort lautet: Sie können sich nicht auf die SSLID verlassen - die meisten Browser verhandeln neu, und Sie müssen immer noch die Quell-IP verwenden. Wenn sich die IP-Adresse wahrscheinlich während der Sitzung ändert, können Sie eine Soft-Reauthentication erzwingen oder die SSLID als Brücke zwischen den beiden IP-Änderungen verwenden (und umgekehrt, dh nehmen Sie nur Hijacking an, wenn beide IP-Adresse und SSLID ändern sich vom Server aus gesehen gleichzeitig.)

UPDATE 2014

Erzwinge einfach die Verwendung von https und stelle sicher, dass du nicht anfällig für Sitzungsfixierung oder < CRIME . Machen Sie sich nicht die Mühe, Ihr Authentifizierungs-Token mit irgendwelchen clientseitigen Informationen zu sedimentieren, denn wenn ein Angreifer das Token erhalten konnte (vorausgesetzt, dass das Token nicht einfach zu erraten war), wurden alle Mittel verwendet, um es zu erhalten (zB Cross-Site-Scripting oder die vollständige Kompromittierung des Client-Systems" ermöglicht es dem Angreifer außerdem, beliebige clientseitige Informationen zu erhalten möglicherweise in das Token gegangen sein (und diese bei Bedarf auf einem sekundären System replizieren).

Wenn der Client wahrscheinlich nur aus wenigen Systemen eine Verbindung herstellt, könnten Sie generieren ein RSA-Schlüsselpaar im Browser für möglicherweise jedes neue Client-System, von dem aus der Client eine Verbindung herstellt (wobei der öffentliche Teil an Ihren Server gesendet wird und der private Teil in dem bleibt, was hoffentlich sicher ist Client-Speicher) und umleiten zu einem virtuellen Host, der bidirektional (Peer / Client-Zertifikat) verwendet. Verifizierung anstelle der passwortbasierten Authentifizierung.

    
vladr 27.02.2009 20:20
quelle
3

Ich frage mich, warum es nicht einfach genug wäre einfach

  1. erfordert SSL in Ihrem Transport
  2. encode-Eingaben (html / url / attribute), um Cross-Site-Scripting zu verhindern
  3. erfordert nur POSTs für alle Anfragen, die Informationen ändern und
  4. Verhindern Sie CSRF so gut wie möglich (je nachdem, was Ihre Plattform unterstützt).
  5. Setzen Sie Ihre Cookies auf HTTPOnly
Pita.O 20.05.2009 20:32
quelle
1

Ja, aber es gibt mehrere Dinge, die Sie tun können. Am einfachsten ist es, die Sitzungsschlüssel, die Sie als Salz verwenden (pro Benutzer), einfach zwischenzuspeichern und beliebige davon zu akzeptieren. Selbst wenn die Sitzung neu verhandelt wird, haben Sie sie immer noch in Ihrem Cache. Es gibt Details - Ablaufrichtlinie usw. - aber nichts ist unüberwindbar, es sei denn, Sie führen etwas aus, das milspec-gehärtet werden muss. In diesem Fall sollten Sie es nicht so machen.

- MarkusQ

    
MarkusQ 27.02.2009 18:40
quelle

Tags und Links