webentwicklung-frage-antwort-db.com.de

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

Soweit ich weiß, tritt die folgende Ereigniskette in OAuth 2 auf, damit _Site-A_ auf ser's information from _Site-B_ zugreifen kann.

  1. _Site-A_ registriert sich bei _Site-B_ und erhält ein Geheimnis und eine ID.
  2. Wenn Benutzer _Site-A_ anweist, auf _Site-B_ zuzugreifen, wird Benutzer an _Site-B_ gesendet, wo sie _Site-B_ mitteilen, dass sie auf __ zugreifen möchten Ich möchte in der Tat _Site-A_ Berechtigungen für bestimmte Informationen erteilen.
  3. _Site-B_ leitet Benutzer zusammen mit einem Autorisierungscode zurück zu _Site-A_.
  4. _Site-A_ übergibt diesen Autorisierungscode zusammen mit seinem Geheimnis als Gegenleistung für ein Sicherheitstoken an _Site-B_ zurück.
  5. _Site-A_ sendet dann Anforderungen an _Site-B_ im Namen von Benutzer, indem das Sicherheitstoken zusammen mit Anforderungen gebündelt wird.

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

553
William Jones

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

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

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

OAuth 2 ist nicht gegen Wiederholungsangriffe des Sicherheitstokens oder des Geheimnisses geschützt. Stattdessen hängt es davon ab, dass Site B für diese Elemente verantwortlich ist und sie nicht herauskommen lässt und dass sie während der Übertragung über https gesendet werden (https schützt URL-Parameter).

Der Zweck des Schritts Autorisierungscode ist einfach Bequemlichkeit, und der Autorisierungscode ist für sich genommen nicht besonders empfindlich. Es stellt eine allgemeine Kennung für das Zugriffstoken von Benutzer X für Standort A bereit, wenn Standort 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.

133
William Jones

So funktioniert OAuth 2.0 im wirklichen Leben:

Ich fuhr auf dem Weg zur Arbeit bei Olafs Bäckerei vorbei, als ich den leckersten Donut im Fenster sah - ich meine, das Ding tropfte von schokoladiger Güte. Also ging ich hinein und verlangte "Ich muss diesen Donut haben!". Er sagte "sicher, dass das 30 $ sein wird."

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. Fast wäre ich genau dort weggegangen, aber dann rief mir der Donut zu: "Iss mich, ich bin köstlich ...". Wer bin ich, um Befehle von einem Donut zu missachten? 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 war schon auf dem Zettel, also weiß ich nicht, was der Sinn war, das zu sagen, aber ok.

Ich fuhr anderthalb Stunden zu meiner Bank. Ich reichte dem Kassierer die Notiz; Ich habe ihr gesagt, Olaf hat mich geschickt. Sie warf mir einen Blick zu, der besagt: "Ich kann lesen".

Sie nahm meine Notiz, fragte nach meinem Ausweis und fragte mich, wie viel Geld in Ordnung sei, um ihm zu geben. Ich sagte ihr 30 Dollar. Sie kritzelte und reichte mir eine weitere Notiz. Dieser hatte eine Reihe von Zahlen, ich schätze, so behalten sie die Übersicht über die Noten.

An diesem Punkt verhungere ich. Eineinhalb Stunden später war ich wieder da und stand mit ausgestrecktem Zettel 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 ist gegangen, um Geld zu holen." "Was meinst du?". "Er nimmt zur Bank zur Kenntnis".

Huh ... also nahm Olaf die Notiz, die mir die Bank gab und ging zurück zur Bank, um Geld von meinem Konto zu holen. Da er den Zettel hatte, den 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 gab 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 mein Job, der anrief, um mich zu feuern, mein Chef ist so ein Arschloch. Außerdem war ich über den Prozess nachgedacht, den ich gerade durchgemacht habe.

Ich meine, denken Sie darüber nach: Ich konnte Olaf 30 Dollar von meinem Bankkonto abheben lassen, ohne ihm meine Kontodaten mitteilen zu müssen. Und ich musste mir keine Sorgen machen, dass er zu viel Geld abheben würde, weil ich der Bank bereits gesagt hatte, dass er nur 30 Dollar abheben dürfe. Und die Bank wusste, dass er der Richtige war, weil er die Notiz hatte, die ich Olaf geben sollte.

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

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

Ich frage mich, ob dieser Ansatz umfassendere 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 ganzen Stadt bekomme, brauche ich etwas, um den Geschmack dieses Donuts wegzuspülen.

1364
Luis Perez

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

Hier ist eine Use-Case-Demo:

  1. Ich melde mich bei LinkedIn an und möchte einige Freunde verbinden, die sich in meinen Google Mail-Kontakten befinden. LinkedIn unterstützt dies. Es wird eine sichere Ressource (meine Google Mail-Kontaktliste) von Google Mail angefordert. Also klicke ich auf diesen Button:
    Add Connection

  2. Eine Webseite wird geöffnet und zeigt die Google Mail-Anmeldeseite an, wenn ich mein Konto und mein Passwort eingebe:
    Add Connection

  3. Google Mail zeigt dann eine Einverständniserklärung an, auf der ich auf "Akzeptieren" klicke: Add Connection

  4. Jetzt kann LinkedIn in Google Mail auf meine Kontakte zugreifen: Add Connection

Unten ist ein Flussdiagramm des obigen Beispiels:

Add Connection

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

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

Schritt 3: Der Nutzer erteilt die Anfrage an LinkedIn, 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 finden Sie unter OAuth hier .

102
Owen Cao

Abbildung 1, angehoben von RFC675 :

     +--------+                               +---------------+
     |        |--(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 ---|               |
     +--------+                               +---------------+
24
8bitjunkie

So funktioniert Oauth 2.0, gut erklärt in dieser Artikel

enter image description here

13
Suraj

Dies ist ein Juwel:

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

Sehr kurze Zusammenfassung:

OAuth definiert vier Rollen:

  1. Ressourceneigentümer
  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 verwalten, sodass Sie nicht ständig wechseln müssen. Ihr GMail (Client) bittet Sie (über den Autorisierungsserver von Yahoo) um Zugriff auf Ihre Yahoo-E-Mails (Ressourcen-Server), 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 Yahoo-Passwort zu speichern.

enter image description here

10
Belfield

Die andere Antwort ist sehr detailliert und behandelt den Großteil der vom OP aufgeworfenen Fragen.

Um die Frage des OP "Wie schützt OAuth 2 mit dem Sicherheitstoken vor Wiederholungsangriffen?" Näher zu erläutern und konkret anzusprechen, enthält die offizielle Empfehlung für Implementieren von OAuth 2:

1) Tokens haben normalerweise einen kurzen Ablaufzeitraum ( http://tools.ietf.org/html/rfc6819#section-5.1.5. ):

Eine kurze Verfallszeit für Token ist ein Mittel zum Schutz vor den folgenden Bedrohungen:

  • wiederholung...

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

Clients MÜSSEN authentifizierte Anforderungen mit einem Inhaber-Token unter Verwendung des Anforderungsheaderfelds "Autorisierung" mit dem HTTP-Autorisierungsschema "Inhaber" ausführen. ...

Die Methode "application/x-www-form-urlencoded" DARF NICHT verwendet werden, außer in Anwendungskontexten, 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

8
Will

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

Ähnlichkeit

Alle Finanzhilfetypenflüsse bestehen aus 2 Teilen:

  • Zugriffstoken erhalten
  • Verwenden Sie das Zugriffstoken

Der zweite Teil 'use access token' ist für alle Flows gleich

Unterschied

Der erste Teil des Ablaufs 'Zugriffstoken abrufen' für jeden Grant-Typ ist unterschiedlich.

Im Allgemeinen kann der Teil 'get access token' in 5 Schritten zusammengefasst werden:

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

Hier ist ein nebeneinander angeordnetes Diagramm, in dem verglichen wird, wie sich die einzelnen Gewährungstypen anhand der fünf Schritte unterscheiden.

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

enter image description here

Jeder hat unterschiedliche Schwierigkeitsgrade bei der Implementierung, Sicherheit und Anwendungsfälle. Abhängig von Ihren Bedürfnissen und Ihrer Situation müssen Sie einen davon verwenden. Welches verwenden?

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

Resource Owner Password Crendential : Dies sollte nur als letzter Ausweg verwendet werden, da der Benutzer seine Anmeldeinformationen an die App übergeben muss, was bedeutet, dass die App dies kann alles was der Benutzer kann

Autorisierungscode : Der beste Weg, um eine Benutzerautorisierung zu erhalten

Implizit : Wenn Ihre App eine mobile oder eine einseitige App ist

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

3
nethsix