Verlangsamt die Authentifizierung über HTTPS meine Anwendung?

11

Ich erstelle eine Webanwendung und einen RESTful-Webdienst.

Ich habe verschiedene Artikel darüber gelesen, wie die Anfragen an den Webdienst am besten authentifiziert werden können.

Die beste Option für mich scheint die Verwendung der HTTP-Basisauthentifizierung zu sein. Nahezu jeder Artikel, den ich gelesen habe, besagt, dass die Authentifizierung über SSL oder ein gleichwertiges Dokument verschlüsselt werden sollte.

Ich bin mir nicht ganz sicher, worum es geht. Bedeutet dies, dass sich mein gesamter Webdienst auf einem sicheren Server befinden muss? Wird dies die Dinge verlangsamen?

Gaz_Edge
quelle
Ein Gedanke, die Cachefähigkeit von Daten, die über https geladen wurden. Ich bin mir nicht 100% sicher, ob / wie sich dies auswirken wird.
Ich bin mir nicht sicher, ob ich folge. Wollen Sie damit sagen, dass Caching nicht möglich ist?
Gaz_Edge
Es gibt Interaktionen zwischen ssl / https und dem Webserver, die möglicherweise nicht mit REST beabsichtigt sind - cxf.547215.n5.nabble.com/… - Ich habe mich in einer sicheren Umgebung nicht zu weit mit REST befasst, daher war dies keine Problem für mich. Es ist mehr aus Gedanken und Hinweisen aus meiner Zeit als Apache-Administrator.
Vielen Dank. Sie sagen, Sie haben REST nicht in einer sicheren Umgebung verwendet. Bedeutet das, dass Sie keine Authentifizierung verwenden? Oder machen Sie es anders als http basic.
Gaz_Edge
Es ist entweder keine Authentifizierung, einfach oder IP-basiert ... und rein in einem Intranet (nichts nach außen gerichtet).

Antworten:

11

Versuchen Sie zunächst zu verstehen, wie die SSL- (HTTPS) und HTTP-Authentifizierung funktioniert.

Die üblichen HTTP-Authentifizierungsmethoden (Digest, Basic und alle Formulare + Cookie-basierten Authentifizierungsschemata, die Sie zusätzlich zu HTTP implementieren können) sind für sich genommen unsicher, da sie Authentifizierungsinformationen mehr oder weniger im Klartext senden. Ob sich die Daten in POST-Feldern oder -Headern befinden und ob die Base64-Codierung angewendet wird, spielt in dieser Hinsicht keine Rolle. Das Kennwort ist für jeden, der Zugriff auf den Netzwerkverkehr hat, klar sichtbar. Dies bedeutet, dass die HTTP-Authentifizierung über einen nicht vertrauenswürdigen Kanal wertlos ist: Ein Angreifer benötigt nur ein wenig Netzwerk-Sniffing, um Ihr Kennwort zu lesen.

SSL implementiert einen sicheren Kommunikationskanal über einen inhärent unsicheren Kanal. Dies funktioniert ungefähr wie folgt:

  1. Der Server sendet ein signiertes Zertifikat
  2. Der Client validiert das Zertifikat anhand einer Liste von bekanntermaßen funktionsfähigen Signaturschlüsseln. Zertifikatsignaturen können verkettet werden, sodass jeder Knoten sagt: "Wenn die Signatur, die mich signiert, gut ist, bin ich es auch", aber letztendlich muss die Kette in eine der wenigen vertrauenswürdigen Autoritäten aufgelöst werden, die auf dem Client vorkonfiguriert sind.
  3. Der Client verwendet den öffentlichen Verschlüsselungsschlüssel des Servers, um ein gemeinsames Geheimnis zu senden
  4. Der Server entschlüsselt das gemeinsam genutzte Geheimnis mithilfe eines privaten Schlüssels (da nur der legitime Server über den privaten Schlüssel verfügt, können andere Server das gemeinsam genutzte Geheimnis nicht entschlüsseln).
  5. Der Client sendet die tatsächlichen Anforderungsdaten, die mit dem gemeinsamen Geheimnis verschlüsselt sind
  6. Der Server entschlüsselt Anforderungsdaten und sendet dann eine verschlüsselte Antwort
  7. Der Client entschlüsselt die Antwort und präsentiert sie dem Benutzer.

Beachten Sie hier einige wichtige Punkte:

  • Mithilfe der Zertifikatkette können Clients sicherstellen, dass der Server, mit dem sie sprechen, der echte ist und nicht jemand, der ihre Anforderungen abfängt. Aus diesem Grund sollten Sie ein echtes SSL-Zertifikat kaufen und Browser werfen beängstigende Warnungen auf Sie, wenn Sie auf eine Site stoßen, die ein ungültiges, abgelaufenes oder anderweitig falsches Zertifikat verwendet: Die gesamte Verschlüsselung der Welt hilft nicht, wenn Sie es sind mit der falschen Person sprechen.
  • Die öffentliche / private Verschlüsselung, die zum Austausch des Geheimnisses verwendet wird, stellt sicher, dass eine erfolgreiche Kommunikation nur zwischen diesem bestimmten Client- und Serverpaar funktioniert: Sniffed-Netzwerkpakete werden verschlüsselt und erfordern den privaten Schlüssel des Servers, um an die Daten zu gelangen.
  • Symmetrische Verschlüsselung wird für den Großteil der Anforderung verwendet, da sie einen viel geringeren Leistungsaufwand aufweist als die Verschlüsselung mit privaten / öffentlichen Schlüsseln. Der Schlüssel (gemeinsames Geheimnis) wird jedoch mithilfe der Verschlüsselung mit privaten / öffentlichen Schlüsseln ausgetauscht, da dies der einzige Weg ist, dies auf sichere Weise zu tun (außer ihn über einen separaten Kanal wie einen Kurierdienst zu transportieren).

Es ist also offensichtlich ein gewisser Overhead erforderlich, aber es ist nicht so schlimm, wie Sie denken würden - es liegt hauptsächlich in der Größenordnung, in der "mehr Hardware darauf werfen" die angemessene Antwort ist, es sei denn, Sie bereiten sich auf absolut massiven Datenverkehr vor ( denke an Google oder Facebook). Unter normalen Umständen, dh bei der typischen Verwendung von Webanwendungen, ist der SSL-Overhead vernachlässigbar. Sobald Sie also vertrauliche Daten haben, ist es am besten, alles über SSL auszuführen, einschließlich Ressourcen. SSL ist auch die einzige praktikable Möglichkeit, den HTTP-Verkehr zu sichern. andere Methoden sind einfach nicht so standardisiert und werden daher nicht allgemein unterstützt, und Sie möchten diese Dinge absolut nicht selbst implementieren, da es ehrlich gesagt einfach zu einfach ist, sie falsch zu verstehen.

TL; DR: Ja, SSL + Basisauthentifizierung ist eine gute Idee. Ja, Sie benötigen einen sicheren Server (und ein gültiges Zertifikat ). Ja, dies verlangsamt die Arbeit ein wenig, aber nein, das ist kein Grund zur Sorge jetzt.

tdammers
quelle
12

HTTPS (SSL) ist keine Benutzerauthentifizierung. Es bietet lediglich eine Verschlüsselung zwischen zwei Endpunkten.

Aber ja, es gibt ein winziges bisschen Overhead (obwohl nicht genug, um eine Änderung der Pläne / Hardware zu rechtfertigen). Siehe hier :

/programming/548029/how-much-overhead-does-ssl-impose

brian
quelle
7
+1 besser, um zu sicher zu sein, als nicht sicher genug angesichts des geringen Overheads
Earlz
2
Diese Antwort ist sehr irreführend. SSL ist Authentifizierung, normalerweise keine Benutzerauthentifizierung . SSL authentifiziert, dass der Server, mit dem Sie sprechen, wirklich der ist, von dem es sagt, dass er ist. (Die Aufgabe der CA ist nur Zertifikate ausstellen für facebook.com Book.) Auch SSL kann die Benutzerauthentifizierung mit Client - Zertifikaten tun.
Josh3736
@brian: Ich stimme mit josh3736 überein. SSL bietet Authentifizierung im kryptografischen Sinne des Wortes. Ohne (zB Server-) Authentifizierung sind Sie offen für Man-in-the-Middle-Angriffe. SSL kann eine sichere Client- (Benutzer-) Authentifizierung mithilfe von Smartcards bereitstellen. Wenn der Server authentifiziert wurde, können andere Mittel (z. B. Benutzername / Kennwort) über den sicheren Kanal verwendet werden.
Guy Sirton
Es war wirklich offensichtlich, dass das OP nach der Benutzerauthentifizierung fragte und sich keine Sorgen darüber machte, dass der Client authentifiziert, mit wem er spricht / Mann in den mittleren Angriffen. Ich habe meinen Beitrag angesichts schwerer Pedanterie bearbeitet;) technisch korrekt ist die beste Art von korrekt, schließlich
brian
6

Bei der HTTP-Basisauthentifizierung werden der vom Benutzer angegebene Benutzername und das Kennwort bei jeder Anforderung an den Server gesendet. Dies bedeutet, dass sie auch in Bereichen Ihrer Website im Klartext vorliegen, die nicht unbedingt sicher sein müssen. Natürlich möchten Sie, dass SSL hier Ihre Benutzer schützt.

Theoretisch könnten Sie die Cookie-Authentifizierung verwenden und nur SSL auf der Anmeldeseite einfügen (wo der Benutzername und das Passwort gesendet werden). Wenn Ihre Cookies anständig sicher und sicher gegen Wiederholungsangriffe sind, kann ein Angreifer nichts damit anfangen, selbst wenn er es geschafft hat, einen zu erhalten.

Earlz
quelle
3

Bei der Standardauthentifizierung werden im Header der http-Anforderung ein Benutzername und ein Kennwort festgelegt. Wenn Sie kein SSL oder ein gleichwertiges Produkt verwenden, werden dieser Benutzername und dieses Kennwort im Klartext gesendet und sind für jeden trivial, um sie zu stehlen.

Die meisten Webserver unterstützen heutzutage sofort HTTPS, und obwohl dies den Aufwand für jeden Anruf erhöht, ist dieser Aufwand minimal.

Sie können einige Endpunkte sichern und andere nicht (dh einen authentifizierten Endpunkt, der ein Token erzeugt, das für andere Anrufe verwendet werden kann). Ich würde SSL für den gesamten Dienst wärmstens empfehlen, da es viel sicherer ist. (Wenn nichts anderes verhindert wird, dass vertrauliche Daten abgefangen werden)

Tom Squires
quelle
Ja, ich denke, das klingt nach der besten Idee. Meine Webanwendung verwaltet die Benutzersitzung usw., sodass das Token dort gespeichert werden kann. Aber jemand könnte immer noch das Token für diese Sitzung schnüffeln, oder?
Kann
Ja im Allgemeinen. Es gibt Dinge, die Sie tun können, um Cookies zu sichern (dh zu verschlüsseln), aber der einfachere und effektivere Weg besteht darin, die gesamte Website zu sichern. Sofern Sie keinen bestimmten Anwendungsfall haben, würde ich die einfachste Lösung empfehlen
Tom Squires
2

Jeff Atwood hat vor nicht allzu langer Zeit einen kurzen Blogpost darüber geschrieben, ob eine vollständige Verschlüsselung der richtige Weg ist. Er beschreibt einige Beispiele aus der Praxis und hat auch einige Zeilen zu Leistungsaspekten.

Außerdem verweist er auf diesen Artikel über eine Google Mail-Fallstudie und zitiert Folgendes:

Im Januar dieses Jahres (2010) hat Google Mail standardmäßig HTTPS für alles verwendet. Früher wurde es als Option eingeführt, jetzt verwenden alle unsere Benutzer HTTPS, um ihre E-Mails ständig zwischen ihren Browsern und Google zu sichern. Dazu mussten wir keine zusätzlichen Maschinen und keine spezielle Hardware bereitstellen. Auf unseren Produktions-Frontend-Computern macht SSL / TLS weniger als 1% der CPU-Auslastung, weniger als 10 KB Speicher pro Verbindung und weniger als 2% des Netzwerk-Overheads aus. Viele Leute glauben, dass SSL viel CPU-Zeit in Anspruch nimmt, und wir hoffen, dass die oben genannten Zahlen (zum ersten Mal öffentlich) dazu beitragen werden, dies zu beseitigen.

Er erwähnt auch einige der jüngsten Verbesserungen beim clientseitigen Zwischenspeichern von Seiten über HTTPS durch den Browser .

Trotzdem gibt es andere Strafen, von denen die meisten nicht die Leistung, sondern die Implementierungskosten sind:

  • Beibehaltung der Softwarequalität bei gleichzeitiger Erhöhung der Komplexität für bereits beschäftigte Teams,
  • Das Proxy-Caching ist viel schwieriger zu konfigurieren und erfordert auch Codeänderungen.
  • Es ist schwierig, die richtige Sicherheit für ein Mashup von Inhalten aus verschiedenen Quellen zu finden.
  • Low-End-Mobilgeräte haben möglicherweise Probleme mit der Verschlüsselung.
Daniel Dinnyes
quelle
Bitte erweitern Sie Ihre Antwort und fügen Sie einige Highlights aus dem Blog hinzu.
Walter
Highlights aus dem Blogbeitrag werden hinzugefügt.
Daniel Dinnyes
0

Die HTTP-Basisauthentifizierung ohne eigene Sitzungsbehandlung lässt Sie wahrscheinlich für Cross-Site-Anforderungsfälschungsangriffe offen. Sie können es wahrscheinlich verwenden, wenn Sie mit Ihrer eigenen Sitzungsbehandlung koppeln, aber Sie haben möglicherweise Probleme, eine saubere Abmeldefunktion bereitzustellen.

Unabhängig davon, was Sie für die Authentifizierung verwenden, müssen Sie HTTPS zum Verschlüsseln der Verbindung verwenden (es sei denn, auf die Webanwendung wird nur in einem kontrollierten, sicheren Netzwerk zugegriffen). Es kann die Dinge etwas verlangsamen (Verbindungsaufbau ist teuer, aber Browser neigen dazu, Verbindungen für eine Weile aufrechtzuerhalten), aber wenn Sie eine sichere Anwendung wünschen, können Sie sie sowieso nicht vermeiden, sodass Sie sie nicht wirklich benötigen sich darüber Sorgen machen.

Hinweis: "HTTPS-Authentifizierung" (die Sie im Titel erwähnt haben) ist irreführend. Sie kann sich auf die Authentifizierung von SSL-Clientzertifikaten beziehen, die wenig mit dem Text Ihrer Frage zu tun hat und ihre eigenen Vorteile und Probleme hat. Das wollen Sie wahrscheinlich nicht anfassen.

Jan Schejbal
quelle
0

Wie werden Sie die Basisauthentifizierung durchführen?
Wenn es sich um einen fest codierten Benutzernamen / ein fest codiertes Kennwort handelt und Sie die integrierte Funktionalität Ihres Webservers verwenden, um dies zu tun, hat dies wahrscheinlich keine Auswirkungen. Wenn Sie verrückte Dinge in einer Datenbank oder ähnlichem tun, kann dies Auswirkungen haben.

Wie andere hier bemerkt haben, werden SSL und das Senden der zusätzlichen Header die Dinge technisch langsamer machen, aber es wird in keiner Weise von Bedeutung sein.

brianfeucht
quelle