Wie schützt OAuth 2 mit dem Sicherheitstoken vor Wiederholungsangriffen?

564

Wie ich es verstehe, tritt die folgende Kette von Ereignissen in OAuth 2 , um Site-Aden Zugriff des Benutzers Informationen aus Site-B.

  1. Site-Aregistriert sich Site-Bund erhält ein Geheimnis und einen Ausweis.
  2. Wenn Benutzer sagt für Site-Aden Zugriff Site-B, Benutzer wird gesendet , Site-Bwo sie sagen Site-B, sie würden in der Tat wie zu geben , Site-ABerechtigungen für spezifische Informationen.
  3. Site-BUmleitungen Benutzer zurück zu Site-A, zusammen mit einem Autorisierungscode.
  4. Site-AAnschließend wird dieser Autorisierungscode zusammen mit seinem Geheimnis als Site-BGegenleistung für ein Sicherheitstoken an zurückgegeben.
  5. Site-AAnschließend werden Site-Bim Namen des Benutzers Anforderungen an das Sicherheitstoken zusammen mit den Anforderungen gestellt.

Wie funktioniert all dies in Bezug auf Sicherheit und Verschlüsselung auf hohem Niveau? Wie schützt OAuth 2 mit dem Sicherheitstoken vor Wiederholungsangriffen?

William Jones
quelle
49
oauth2 einfach hier erklärt: gist.github.com/mziwisky/10079157
Paolo
4
Lesen Sie die Spezifikation: tools.ietf.org/html/rfc6749 Sie werden überrascht sein, wie verständlich es ist. Es ist auch richtig, was nicht schlecht sein darf.
Kris Vandermotten
1
Diese Frage und ihre (aktuellen) Antworten konzentrieren sich alle auf einen bestimmten "Grant-Typ" in OAuth 2.0 (dh code), aber es gibt andere in OAuth 2.0 definierte Grant-Typen, die für verschiedene Anwendungsfälle relevant sind (z. B. nicht benutzerbezogene).
Hans Z.
4
Oh, warum nicht "Site B" durch etwas Lesbareres wie "IdProvider Site" ersetzen?
Yurii

Antworten:

1378

Wie OAuth 2.0 im wirklichen Leben funktioniert:

Ich fuhr auf dem Weg zur Arbeit an Olafs Bäckerei vorbei, als ich den köstlichsten Donut im Fenster sah - ich meine, das Ding tropfte von schokoladiger Güte. Also ging ich hinein und forderte "Ich muss diesen Donut haben!". Er sagte: "Sicher, das sind 30 Dollar."

Ja, ich weiß, 30 Dollar für einen Donut! Es muss lecker sein! Ich griff nach meiner Brieftasche, als ich plötzlich den Koch "NEIN! Kein Donut für dich" schreien hörte. Ich fragte: warum? Er sagte, er akzeptiere nur Banküberweisungen.

Ernsthaft? Ja, er meinte es ernst. Ich wäre fast genau dort weggegangen, aber dann rief mir der Donut zu: "Iss mich, ich bin köstlich ...". Wer bin ich, um Befehle von einem Donut nicht zu befolgen? Ich sagte OK.

Er gab mir eine Notiz mit seinem Namen (der Koch, nicht der Donut): "Sag ihnen, dass Olaf dich geschickt hat". Sein Name stand bereits auf dem Zettel, daher weiß ich nicht, wozu das gut war, aber ok.

Ich fuhr anderthalb Stunden zu meiner Bank. Ich gab dem Kassierer die Notiz; Ich sagte ihr, Olaf habe mich geschickt. Sie gab mir einen dieser Blicke, die Art, die sagt, "ich kann lesen".

Sie nahm meine Notiz, fragte nach meinem Ausweis und fragte mich, wie viel Geld in Ordnung sei, um ihn zu geben. Ich sagte ihr 30 Dollar. Sie kritzelte und gab mir eine weitere Notiz. Dieser hatte eine Reihe von Zahlen drauf, ich schätze, so behalten sie die Notizen im Auge.

An diesem Punkt verhungere ich. Eineinhalb Stunden später war ich wieder da und stand mit ausgestreckter Notiz vor Olaf. Er nahm es, sah es sich an und sagte: "Ich komme wieder."

Ich dachte, er würde meinen Donut bekommen, aber nach 30 Minuten wurde ich misstrauisch. Also fragte ich den Mann hinter der Theke "Wo ist Olaf?". Er sagte "Er ging, um Geld zu bekommen". "Was meinst du?". "Er nimmt Notiz zur Bank".

Huh ... also nahm Olaf die Notiz, die mir die Bank gegeben hatte und ging zurück zur Bank, um Geld von meinem Konto zu bekommen. Da er die Notiz hatte, die die Bank mir gab, wusste die Bank, dass er der Typ war, über den ich sprach, und weil ich mit der Bank sprach, wussten sie, dass sie ihm nur 30 Dollar geben sollten.

Ich musste lange gebraucht haben, um das herauszufinden, denn als ich aufblickte, stand Olaf vor mir und reichte mir endlich meinen Donut. Bevor ich ging, musste ich fragen: "Olaf, hast du Donuts immer so verkauft?". "Nein, ich habe es früher anders gemacht."

Huh. Als ich zu meinem Auto zurückging, klingelte mein Telefon. Ich habe nicht geantwortet, es war wahrscheinlich meine Aufgabe, mich zu entlassen, mein Chef ist so ein Arschloch. Außerdem habe ich über den Prozess nachgedacht, den ich gerade durchlaufen habe.

Ich meine, denken Sie darüber nach: Ich konnte Olaf 30 Dollar von meinem Bankkonto abheben lassen, ohne ihm meine Kontoinformationen geben zu müssen. Und ich musste mir keine Sorgen machen, dass er zu viel Geld herausnehmen würde, weil ich der Bank bereits sagte, er dürfe nur 30 Dollar nehmen. Und die Bank wusste, dass er der richtige war, weil er die Notiz hatte, die sie mir gegeben hatten, um sie Olaf zu geben.

Ok, sicher, ich würde ihm lieber 30 Dollar aus meiner Tasche geben. Aber jetzt, wo er diesen Zettel hatte, konnte ich der Bank einfach sagen, dass er jede Woche 30 Dollar nehmen soll, dann konnte ich einfach in der Bäckerei auftauchen und musste nicht mehr zur Bank gehen. Ich könnte den Donut sogar telefonisch bestellen, wenn ich wollte.

Natürlich würde ich das nie tun - dieser Donut war widerlich.

Ich frage mich, ob dieser Ansatz breitere Anwendungen hat. Er erwähnte, dies sei sein zweiter Ansatz, ich könnte es Olaf 2.0 nennen. Wie auch immer, ich komme besser nach Hause, ich muss mich auf die Suche nach einem neuen Job machen. Aber nicht bevor ich einen dieser Erdbeershakes von diesem neuen Ort in der Stadt bekomme, brauche ich etwas, um den Geschmack dieses Donuts wegzuwaschen.

Luis Perez
quelle
41
In der Praxis sollte Olaf jederzeit 30 US-Dollar von Ihrem Konto abheben können, auch wenn Sie keinen Donut bestellen. Interessanterweise ist dies das Hauptziel in den realen oauth2.0-Szenarien :) Dies ist sicherlich eine großartige Antwort, aber wer dies liest, geht bitte zu dem Punkt, den Paolo in seinem Kommentar zur Frage erwähnt hat ( gist.github.com/mziwisky/). 10079157 ). Eine gute ergänzende Lektüre, um das Konzept kristallklar zu machen.
Samiron
4
Tolle Antwort, aber 2 Punkte: 1. Wie @Samiron betonte, könnte Olaf 30 $ nehmen, wann immer er will. 2. In einem echten OAuth2.0-Szenario kann Olaf den Donut nicht bedienen, bevor er Geld von der Bank genommen hat. In diesem Beispiel hätte er den Scheck behalten und Luis einfach seinen wohlverdienten Donut geben können. Wenn wir also das Beispiel dahingehend ändern, dass ich Olaf ermächtige, Teig von einem mir bekannten Dritten zu beziehen, wäre dies sinnvoller, da Olaf den Teig holen müsste, bevor er mit dem Backen des Donuts beginnt (unter der Annahme des einsamen Donuts Olaf) hatte war nur zu Anzeigezwecken!).
Ticker23
4
ticker23, die Donut-Story schlägt leider Ihre technische Korrektur - ich war von der Story begeistert, als ich sie las. Es wurde von Homer Simpson geschrieben.
Shevy
4
@Prageeth Olaf trägt die Banknote immer zur und von der Bank in einer sicheren Box, in der Tinte austritt, wenn sie manipuliert wird. Die Wiederherstellung der Banknote würde viele Leben dauern. Die Bank nimmt Kunden auch bei ihrem ersten Besuch Fingerabdrücke ab. Wenn Olaf bei einem Backunfall die Finger verliert, muss er Luis bitten, die Überweisung erneut einzurichten, und die Bank muss Olaf beim nächsten Mal anhand seines Breaking Bread-Tattoos identifizieren .
Chris
11
Ich liebe niedliche Antworten genauso wie die nächste Person, und wenn ihre Niedlichkeit dazu beiträgt, die Antwort zugänglicher zu machen, ist das großartig ... aber am Ende des Tages geht es bei Stack Overflow darum, Menschen zu erziehen, und diese niedliche Geschichte tut das nicht. Um die Donut-Analogie überhaupt zu verstehen, muss man bereits verstehen, wie OAuth2 funktioniert, aber der springende Punkt der Antwort sollte sein, genau das zu erklären. Bitte überlegen Sie, diese (obere) Antwort zu bearbeiten, um die Konzepte tatsächlich zu erklären, und verweisen Sie sie am Ende nicht nur schräg ... auch wenn dies ein oder zwei Witze kostet.
Machineghost
133

Basierend auf dem, was ich gelesen habe, funktioniert alles so:

Der in der Frage beschriebene allgemeine Ablauf ist korrekt. In Schritt 2 wird Benutzer X authentifiziert und autorisiert auch den Zugriff von Site A auf die Informationen von Benutzer X auf Site B. In Schritt 4 gibt die Site ihr Geheimnis an Site B zurück und authentifiziert sich selbst sowie den Autorisierungscode und gibt an, was es fragt nach (dem Zugriffstoken von Benutzer X).

Insgesamt ist OAuth 2 ein sehr einfaches Sicherheitsmodell, und die Verschlüsselung kommt nie direkt ins Spiel. Stattdessen sind sowohl das geheime als auch das Sicherheitstoken im Wesentlichen Kennwörter, und das Ganze wird nur durch die Sicherheit der https-Verbindung gesichert.

OAuth 2 bietet keinen Schutz gegen Wiederholungsangriffe des Sicherheitstokens oder des Geheimnisses. Stattdessen ist Site B ausschließlich dafür verantwortlich, dass diese Elemente für diese Elemente verantwortlich sind und sie nicht herauskommen, und dass sie während der Übertragung über https gesendet werden (https schützt URL-Parameter).

Der Zweck des Autorisierungscode-Schritts ist einfach die Bequemlichkeit, und der Autorisierungscode ist für sich genommen nicht besonders sensibel. Es bietet eine allgemeine Kennung für das Zugriffstoken von Benutzer X für Site A, wenn Site B nach dem Zugriffstoken von Benutzer X gefragt wird. Nur die Benutzer-ID von Benutzer X auf Site B hätte nicht funktioniert, da möglicherweise viele ausstehende Zugriffstoken darauf warten, gleichzeitig an verschiedene Sites verteilt zu werden.

William Jones
quelle
28
Sie haben eine wichtige Funktion des Autorisierungscodes übersehen. Warum nicht einfach das Aktualisierungstoken (was Sie als Sicherheitstoken bezeichnen) sofort zurückgeben, anstatt den zusätzlichen Schritt des Autorisierungscodes dafür auszutauschen? Weil das Erfassen des Aktualisierungstokens Wiederholungsangriffe ermöglichen würde, während der Autorisierungscode nur einmal verwendet werden kann.
Maurice Naftalin
3
OK, @mauricen, das macht Sinn ... Aber konnte der Wiederholungsangriff nicht genauso gut mit dem Aktualisierungstoken stattfinden, da dies bei jeder Anforderung übergeben wird?
Herr Mikkél
15
Der Autorisierungscode wird über den Benutzer übergeben, sodass er beispielsweise als Cookie gespeichert werden kann (siehe stackoverflow.com/questions/4065657/… ). Das Aktualisierungstoken wird direkt zwischen den beiden Standorten übertragen und ist daher weniger anfällig.
Maurice Naftalin
Gibt OAuth aus Neugier eindeutige Kennungen zurück, die das Programm verwenden kann? Zum Beispiel verlasse ich mich derzeit auf die MAC-Adresse zur Benutzeridentifikation, aber trotzdem sind MACs unzuverlässig / leicht zu prüfen / etc. Ich kann den MAC-Adressidentifikationsmechanismus einfach ausrangieren und OAuth verwenden, wenn es mir ermöglicht, Benutzer eindeutig zu identifizieren.
TheGreenCabbage
1
Beachten Sie in diesem Diagramm: tools.ietf.org/html/rfc6749#section-4.1, dass das "Geheimnis" nicht angezeigt wird, sondern nur die Client-ID (ID in der Frage). Warum ist das Geheimnis wichtig und warum ist es nicht im RFC enthalten? In der Frage gibt es auch den lokalen Status, der bei der ersten Übertragung der Client-ID (A) übergeben werden soll, und die Rückleitung zum Client zusammen mit dem Autorisierungscode zum Schutz vor XSSF.
David Williams
104

OAuth ist ein Protokoll, mit dem eine Drittanbieter-App ohne Ihr Konto und Passwort auf Ihre auf einer anderen Website gespeicherten Daten zugreifen kann. Eine offiziellere Definition finden Sie im Wiki oder in der Spezifikation.

Hier ist eine Anwendungsfall-Demo:

  1. Ich melde mich bei LinkedIn an und möchte einige Freunde in meinen Google Mail-Kontakten verbinden. LinkedIn unterstützt dies. Es wird eine sichere Ressource (meine Google Mail-Kontaktliste) von Google Mail angefordert. Also klicke ich auf diese Schaltfläche:
    Verbindung hinzufügen

  2. Eine Webseite wird angezeigt und zeigt die Google Mail-Anmeldeseite an, wenn ich mein Konto und mein Passwort eingebe:
    Verbindung hinzufügen

  3. Google Mail zeigt dann eine Einwilligungsseite an, auf der ich auf "Akzeptieren" klicke: Verbindung hinzufügen

  4. Jetzt kann LinkedIn auf meine Kontakte in Google Mail zugreifen: Verbindung hinzufügen

Unten sehen Sie ein Flussdiagramm des obigen Beispiels:

Verbindung hinzufügen

Schritt 1: LinkedIn fordert ein Token vom Autorisierungsserver von Google Mail an.

Schritt 2: Der Google Mail-Autorisierungsserver authentifiziert den Ressourcenbesitzer und zeigt dem Benutzer die Einwilligungsseite an. (Der Benutzer muss sich bei Google Mail anmelden, wenn er noch nicht angemeldet ist.)

Schritt 3: Der Benutzer erteilt LinkedIn die Anforderung, auf die Google Mail-Daten zuzugreifen.

Schritt 4: Der Google Mail-Autorisierungsserver antwortet mit einem Zugriffstoken.

Schritt 5: LinkedIn ruft die Google Mail-API mit diesem Zugriffstoken auf.

Schritt 6: Der Google Mail-Ressourcenserver gibt Ihre Kontakte zurück, wenn das Zugriffstoken gültig ist. (Das Token wird vom Google Mail-Ressourcenserver überprüft.)

Weitere Informationen zu OAuth finden Sie hier .

Owen Cao
quelle
Alle Ihre Bilder sind verschwunden. Gibt es eine Chance, dass Sie sie in stack.imgur laden können?
ChrisF
1
Wie kann das richtig sein? Wird dieser Prozess nicht von dem Benutzer initiiert, der vor dem Browser sitzt, nicht von LinkedIn? Aber Sie haben das als Schritt 3. Das verstehe ich nicht.
Matt
17
Die einfachste Erklärung. Danke, ich werde nie wieder Donuts kaufen
OverCoder
4. Schritt LinkedIn kehrt mit einem Autorisierungstoken zurück. Dies muss im 5. Schritt bereitgestellt werden, wo wir ein Zugriffstoken und ein Aktualisierungstoken erhalten, die für geschützte Ressourcen weiter verwendet werden könnten.
Amesh
@amesh Danke, Sie haben Recht, das ist der Ablauf des Autorisierungscodes. Hier habe ich nur vereinfacht angegeben, um die Grundidee von OAuth 2 zu zeigen.
Owen Cao
24

Abbildung 1 aus RFC6750 :

     +--------+                               +---------------+
     |        |--(A)- Authorization Request ->|   Resource    |
     |        |                               |     Owner     |
     |        |<-(B)-- Authorization Grant ---|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(C)-- Authorization Grant -->| Authorization |
     | Client |                               |     Server    |
     |        |<-(D)----- Access Token -------|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(E)----- Access Token ------>|    Resource   |
     |        |                               |     Server    |
     |        |<-(F)--- Protected Resource ---|               |
     +--------+                               +---------------+
8bitjunkie
quelle
13

So funktioniert Oauth 2.0, das in diesem Artikel ausführlich erläutert wird

Geben Sie hier die Bildbeschreibung ein

Suraj
quelle
Können Sie OAUTH2 so beschreiben, dass Sie Facebook oder andere Drittanbieter nicht verwenden, aber wenn Sie einen geheimen Schlüssel und TOTP-Token mit Telefon-App verwenden, um die Webanwendung zu sichern?
Al Grant
Facebook ist in diesem Beispiel der Autorisierungsserver, der jedem Client Zugriffstoken ausstellt, damit er auf Facebook-APIs zugreifen kann. Wenn Sie Ihre APIs sichern möchten, müssen Sie Ihren eigenen Autorisierungsserver implementieren. Anschließend entscheiden Sie, welchen Grant-Typ Sie verwenden möchten, um Zugriffstoken zu erhalten. Sag mir was genau du willst? erklären wollen.
Suraj
Ich möchte mit Springboot-Sicherheit einrichten. Client (Telefon) und Webapp tauschen bei der Registrierung ein Geheimnis aus. Verwenden Sie dann den Google-Authentifikator, um einen zeit- / geheimen Code zu generieren, den Sie während der Anmeldung zusätzlich zum Passwort eingeben können.
Al Grant
Erleuchtet dich mein letzter Kommentar noch? Siehe mein Profil für Twitter-Informationen
Al Grant
Sie können Kunden-ID und Geheimnis bei der Registrierung erhalten. Rufen Sie dann telefonisch eine Anmeldeanforderung mit der Client-ID an Ihre Webanwendung (Autorisierungsserver) an. Die Web-App überprüft die Client-ID und sendet das OTP an das Telefon. Das Telefon stellt eine weitere Anfrage mit dem Clientgeheimnis an die Webanwendung, um das OTP mit dem Zugriffstoken auszutauschen. Telefon Verwenden Sie dieses Zugriffstoken, um auf die geschützten Ressourcen in der Webanwendung zuzugreifen. Ich denke, dies wäre der Oauth2-Fluss für das gegebene Szenario. Lass es mich wissen, wenn es dir hilft.
Suraj
10

Dies ist ein Juwel:

https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2

Sehr kurze Zusammenfassung:

OAuth definiert vier Rollen:

  1. Ressourcenbesitzer
  2. Klient
  3. Ressourcenserver
  4. Autorisierungsserver

Sie (Ressourcenbesitzer) haben ein Mobiltelefon. Sie haben mehrere verschiedene E-Mail-Konten, möchten jedoch alle Ihre E-Mail-Konten in einer App haben, sodass Sie nicht ständig wechseln müssen. Ihr GMail (Client) fordert daher den Zugriff (über den Autorisierungsserver von Yahoo) auf Ihre Yahoo-E-Mails (Resource Server) an, damit Sie beide E-Mails in Ihrer GMail-Anwendung lesen können.

Der Grund, warum OAuth existiert, ist, dass es für GMail nicht sicher ist, Ihren Yahoo-Benutzernamen und Ihr Passwort zu speichern.

Geben Sie hier die Bildbeschreibung ein

Belfield
quelle
8

Die andere Antwort ist sehr detailliert und befasst sich mit dem Großteil der vom OP aufgeworfenen Fragen.

Um die Frage des OP "Wie schützt OAuth 2 vor Wiederholungsangriffen mit dem Sicherheitstoken?" Zu erläutern und speziell zu beantworten, sind in den offiziellen Empfehlungen für die Implementierung von OAuth 2 zwei zusätzliche Schutzmaßnahmen enthalten :

1) Tokens haben normalerweise eine kurze Ablauffrist ( http://tools.ietf.org/html/rfc6819#section-5.1.5.3 ):

Eine kurze Ablaufzeit für Token schützt vor folgenden Bedrohungen:

  • Wiederholung...

2) Wenn das Token von Site A verwendet wird, wird empfohlen, dass es nicht als URL-Parameter, sondern im Feld Header der Autorisierungsanforderung ( http://tools.ietf.org/html/rfc6750 ) angezeigt wird :

Clients sollten authentifizierte Anforderungen mit einem Bearer-Token unter Verwendung des Anforderungsheaderfelds "Authorization" mit dem HTTP-Autorisierungsschema "Bearer" stellen. ...

Die Methode "application / x-www-form-urlencoded" darf nur in Anwendungskontexten verwendet werden, in denen teilnehmende Browser keinen Zugriff auf das Anforderungsheaderfeld "Authorization" haben. ...

URI-Abfrageparameter ... ist enthalten, um die aktuelle Verwendung zu dokumentieren. Die Verwendung wird aufgrund von Sicherheitsmängeln nicht empfohlen

Wille
quelle
3

Hier ist vielleicht die einfachste Erklärung, wie OAuth2 für alle 4 Grant-Typen funktioniert, dh 4 verschiedene Flows, in denen die App das Zugriffstoken erwerben kann.

Ähnlichkeit

Alle Grant-Flows bestehen aus 2 Teilen:

  • Zugriffstoken erhalten
  • Verwenden Sie das Zugriffstoken

Der zweite Teil 'Zugriffstoken verwenden' ist für alle Flows gleich

Unterschied

Der erste Teil des Ablaufs "Zugriffstoken abrufen" für jeden Grant-Typ variiert.

Im Allgemeinen kann der Teil "Zugriffstoken abrufen" jedoch in 5 Schritten zusammengefasst werden:

  1. Registrieren Sie Ihre App (Client) vorab beim OAuth-Anbieter, z. B. Twitter usw., um die Client-ID / das Client-Geheimnis zu erhalten
  2. Erstellen Sie eine soziale Anmeldeschaltfläche mit der Client-ID und den erforderlichen Bereichen / Berechtigungen auf Ihrer Seite, damit der Benutzer beim Klicken zur Authentifizierung an den OAuth-Anbieter weitergeleitet wird
  3. Der OAuth-Anbieter fordert den Benutzer auf, Ihrer App (Client) die Berechtigung zu erteilen.
  4. OAuth-Anbieter gibt Code aus
  5. App (Client) erwirbt Zugriffstoken

In diesem nebeneinander angeordneten Diagramm wird anhand der 5 Schritte verglichen, wie sich die einzelnen Zuschussarten unterscheiden.

Dieses Diagramm stammt von https://blog.oauth.io/introduction-oauth2-flow-diagrams/

Geben Sie hier die Bildbeschreibung ein

Jeder hat unterschiedliche Schwierigkeitsgrade, Sicherheits- und Anwendungsfälle. Abhängig von Ihren Bedürfnissen und Ihrer Situation müssen Sie eine davon verwenden. Welche verwenden?

Client-Berechtigungsnachweis : Wenn Ihre App nur einen einzelnen Benutzer bedient

Kennwort des Ressourcenbesitzers Crendential : Dies sollte nur als letzter Ausweg verwendet werden, da der Benutzer seine Anmeldeinformationen an die App übergeben muss . Dies bedeutet, dass die App alles tun kann, was der Benutzer kann

Autorisierungscode : Der beste Weg, um eine Benutzerautorisierung zu erhalten

Implizit : Wenn Ihre App eine mobile oder einseitige App ist

Weitere Erklärungen zur Auswahl finden Sie hier: https://blog.oauth.io/choose-oauth2-flow-grant-types-for-app/

nethsix
quelle