Warum verfallen Zugriffstoken?

209

Ich fange gerade erst an, mit Google API und OAuth2 zu arbeiten. Wenn der Client meine App autorisiert, erhalte ich ein "Aktualisierungstoken" und ein kurzlebiges "Zugriffstoken". Jedes Mal, wenn das Zugriffstoken abläuft, kann ich mein Aktualisierungstoken an Google senden, und sie geben mir ein neues Zugriffstoken.

Meine Frage ist, wozu das Zugriffstoken abläuft. Warum kann es nicht einfach ein dauerhaftes Zugriffstoken anstelle des Aktualisierungstokens geben?

Läuft das Aktualisierungstoken auch ab?

Weitere Informationen zum Google OAuth2-Workflow finden Sie unter Verwenden von OAuth 2.0 für den Zugriff auf Google APIs .

levi
quelle

Antworten:

226

Dies ist sehr implementierungsspezifisch, aber die allgemeine Idee besteht darin, Anbietern die Möglichkeit zu geben, kurzfristige Zugriffstoken mit langfristigen Aktualisierungstoken auszugeben. Warum?

  • Viele Anbieter unterstützen Inhaber-Token, die in Bezug auf die Sicherheit sehr schwach sind. Indem sie kurzlebig sind und aktualisiert werden müssen, begrenzen sie die Zeit, in der ein Angreifer einen gestohlenen Token missbrauchen kann.
  • Bei der Bereitstellung in großem Maßstab möchte nicht bei jedem API-Aufruf eine Datenbanksuche durchgeführt werden. Stattdessen wird ein selbstcodiertes Zugriffstoken ausgegeben, das durch Entschlüsselung überprüft werden kann. Dies bedeutet jedoch auch, dass es keine Möglichkeit gibt, diese Token zu widerrufen, sodass sie für kurze Zeit ausgegeben werden und aktualisiert werden müssen.
  • Das Aktualisierungstoken erfordert eine Clientauthentifizierung, wodurch es stärker wird. Im Gegensatz zu den oben genannten Zugriffstoken wird es normalerweise mit einer Datenbanksuche implementiert.
Eran Hammer
quelle
4
Zwei Fragen: 1) Wird die Anforderung an die Clientauthentifizierung bei mobilen Apps überhaupt stärker? Da client_secret Teil des Anwendungsquellcodes ist, ist es überhaupt nicht geheim. Angenommen, das Zugriffstoken wird auch nur über TLS gemeinsam genutzt (und Ihr erster Aufzählungspunkt trifft nicht zu), gibt es zusätzliche Sicherheit? 2) Unter der Annahme, dass all dies in unserem Szenario zutrifft (nur TLS, keine selbstcodierten, nicht widerrufbaren Token), ist es in Ordnung, Zugriffstoken auszugeben, die nicht ablaufen?
Thilo
4
Was ist ein Inhaber-Token und was hat er mit Aktualisierungs- und Zugriffstoken zu tun?
Allyourcode
7
@Thilo Ich denke, die Idee ist, dass Zugriffstoken nicht widerrufbar sein müssen. Wie Eran betont, kann der angeforderte Dienst auf diese Weise entscheiden, ob eine Anforderung <em> bearbeitet werden soll, ohne dass das Zugriffstoken in einer Datenbank </ em> nachgeschlagen werden muss. AFAICT, das ist der eigentliche Vorteil der Trennung von Aktualisierungstoken und Zugriffstoken.
Allyourcode
5
Wie ist ein Zugangstoken (Inhaber?) Von kurzer Dauer? Wenn ich eine Anfrage mit einem abgelaufenen Inhaber-Token mache, gibt das Aktualisierungstoken ein neues Träger-Token zurück. Wenn ich jemandes Token aus seinen Cookies stehle und mein eigenes Cookie mit diesem Token fälsche, sende ich es an den Server. Es wird aktualisiert und mir wird ein neues gesendet. Was soll das verhindern? Sagen Sie nicht IP-Adresse oder gar MAC, denn das ist unvernünftig.
Suamere
3
@Suamere, das wurde schon erklärt. Die Inhaber-Token werden durch einen Kryptoprozess validiert, der die Authentifizierungsdatenbank nicht berührt, wodurch sie für häufigen Ressourcenzugriff wesentlich effizienter sind. Die Aktualisierungstoken werden in einem Prozess überprüft, bei dem die Datenbank überprüft wird, um sicherzustellen, dass sie noch gültig ist. Überlegen Sie nun, wie Google Mail funktioniert. Wenn sich jemand von einem unerwarteten geografischen Ort aus in Ihrem Konto anmeldet, können Sie eine Benachrichtigung erhalten. Sie können alle Speicherorte anzeigen, an denen möglicherweise aktuell gültige Aktualisierungstoken vorhanden sind. Sie können sich von allen Speicherorten abmelden und alle anderen Aktualisierungstoken ungültig machen.
Bon
33

Einige Szenarien können dazu beitragen, den Zweck des Zugriffs und der Aktualisierung von Token sowie die technischen Kompromisse beim Entwurf eines oauth2-Systems (oder eines anderen Auth-Systems) zu veranschaulichen:

Web-App-Szenario

Im Web-App-Szenario haben Sie mehrere Optionen:

  1. Wenn Sie über eine eigene Sitzungsverwaltung verfügen, speichern Sie sowohl das access_token als auch das refresh_token für Ihre Sitzungs-ID im Sitzungsstatus Ihres Sitzungsstatusdienstes. Wenn der Benutzer eine Seite anfordert, für die Sie auf die Ressource zugreifen müssen, verwenden Sie das access_token. Wenn das access_token abgelaufen ist, verwenden Sie das refresh_token, um das neue abzurufen.

Stellen wir uns vor, jemand schafft es, Ihre Sitzung zu entführen. Sie können nur Ihre Seiten anfordern.

  1. Wenn Sie keine Sitzungsverwaltung haben, setzen Sie das access_token in ein Cookie und verwenden Sie es als Sitzung. Wenn der Benutzer dann Seiten von Ihrem Webserver anfordert, senden Sie das access_token. Ihr App-Server kann das access_token bei Bedarf aktualisieren.

Vergleich von 1 und 2:

In 1 werden access_token und refresh_token nur auf dem Weg zwischen dem Autorisierungsserver (in Ihrem Fall Google) und Ihrem App-Server über das Kabel übertragen. Dies würde auf einem sicheren Kanal erfolgen. Ein Hacker könnte die Sitzung entführen, aber nur mit Ihrer Web-App interagieren. In 2 könnte der Hacker das access_token entfernen und eigene Anforderungen an die Ressourcen stellen, auf die der Benutzer Zugriff gewährt hat. Selbst wenn der Hacker das access_token erhält, hat er nur ein kurzes Fenster, in dem er auf die Ressourcen zugreifen kann.

In beiden Fällen sind refresh_token und clientid / secret nur dem Server bekannt, sodass der Webbrowser keinen langfristigen Zugriff erhalten kann.

Stellen Sie sich vor, Sie implementieren oauth2 und legen eine lange Zeitüberschreitung für das Zugriffstoken fest:

In 1) Es gibt hier keinen großen Unterschied zwischen einem kurzen und einem langen Zugriffstoken, da es im App-Server versteckt ist. In 2) könnte jemand das access_token im Browser abrufen und es dann verwenden, um lange Zeit direkt auf die Ressourcen des Benutzers zuzugreifen.

Mobiles Szenario

Auf dem Handy gibt es einige Szenarien, die ich kenne:

  1. Speichern Sie die Client-ID / das Geheimnis auf dem Gerät und lassen Sie das Gerät orchestrieren, um Zugriff auf die Ressourcen des Benutzers zu erhalten.

  2. Verwenden Sie einen Backend-App-Server, um die Client-ID / das Geheimnis geheim zu halten und die Orchestrierung durchführen zu lassen. Verwenden Sie das access_token als eine Art Sitzungsschlüssel und übergeben Sie es zwischen dem Client und dem App-Server.

1 und 2 vergleichen

In 1) Sobald Sie clientid / secret auf dem Gerät haben, sind sie nicht mehr geheim. Jeder kann dekompilieren und dann so tun, als ob er Sie wäre, natürlich mit Erlaubnis des Benutzers. Das access_token und das refresh_token befinden sich ebenfalls im Speicher und können auf einem gefährdeten Gerät aufgerufen werden. Dies bedeutet, dass jemand als Ihre App fungieren kann, ohne dass der Benutzer seine Anmeldeinformationen angibt. In diesem Szenario hat die Länge des access_token keinen Einfluss auf die Hackbarkeit, da sich refresh_token an derselben Stelle wie access_token befindet. In 2) werden die Client-ID / das Geheimnis oder das Aktualisierungstoken kompromittiert. Hier bestimmt die Länge des Ablaufs von access_token, wie lange ein Hacker auf die Ressourcen des Benutzers zugreifen kann, falls er darauf zugreifen kann.

Verfallslängen

Hier hängt es davon ab, was Sie mit Ihrem Authentifizierungssystem sichern, wie lange Ihr access_token-Ablauf dauern soll. Wenn es für den Benutzer besonders wertvoll ist, sollte es kurz sein. Etwas weniger Wertvolles, es kann länger sein.

Einige Leute wie Google verfallen das refresh_token nicht. Manche mögen Stackflow. Die Entscheidung über den Ablauf ist ein Kompromiss zwischen Benutzerfreundlichkeit und Sicherheit. Die Länge des Aktualisierungstokens hängt von der Länge der Benutzerrückgabe ab, dh legen Sie die Aktualisierung so fest, wie oft der Benutzer zu Ihrer App zurückkehrt. Wenn das Aktualisierungstoken nicht abläuft, wird es nur mit einem expliziten Widerruf widerrufen. Normalerweise wird eine Anmeldung nicht widerrufen.

Hoffe, dass ziemlich lange Post nützlich ist.

Ed Sykes
quelle
Bei MOBILE SCENARIO spielt es keine Rolle, ob Sie die Client-ID auf Ihrem Server speichern. Jede andere App kann also einfach eine Anfrage an Ihren Server senden und über Ihren Server auf die Benutzerressourcen zugreifen. Es ist also dasselbe
Amir Bar
true, aber dann haben sie nur Zugriff auf die von Ihnen bereitgestellten Funktionen und keinen vollständigen Zugriff auf das zugrunde liegende Token. Dh sie können sich als Ihre App ausgeben. Häufig können die Token über umfassende Berechtigungen verfügen, während Sie nur eine Teilmenge benötigen. Das Festhalten am Token im Backend bietet weitere Einschränkungen, falls Sie diese benötigen.
Ed Sykes
11

Zusätzlich zu den anderen Antworten:

Einmal erhalten, werden Zugriffstoken normalerweise zusammen mit jeder Anforderung von Clients an geschützte Ressourcenserver gesendet. Dies birgt ein Risiko für das Stehlen und Wiedergeben von Zugriffstoken (vorausgesetzt natürlich, dass Zugriffstoken vom Typ "Träger" sind (wie im ursprünglichen RFC6750 definiert).

Beispiele für diese Risiken im wirklichen Leben:

  • Ressourcenserver sind im Allgemeinen verteilte Anwendungsserver und weisen im Vergleich zu Autorisierungsservern normalerweise niedrigere Sicherheitsstufen auf (niedrigere SSL / TLS-Konfiguration, weniger Härtung usw.). Autorisierungsserver hingegen werden normalerweise als kritische Sicherheitsinfrastruktur betrachtet und unterliegen einer stärkeren Verhärtung.

  • Zugriffstoken werden möglicherweise in HTTP-Traces, -Protokollen usw. angezeigt, die zu Diagnosezwecken auf den Ressourcenservern oder Clients legitim erfasst werden. Diese Spuren können über öffentliche oder halböffentliche Orte (Bug-Tracer, Service-Desk usw.) ausgetauscht werden.

  • Backend-RS-Anwendungen können an mehr oder weniger vertrauenswürdige Dritte ausgelagert werden.

Das Aktualisierungstoken wird dagegen normalerweise nur übertragen zweimal über die Kabel und immer zwischen dem Client und dem Autorisierungsserver übertragen: einmal, wenn es vom Client abgerufen wird, und einmal, wenn es vom Client während der Aktualisierung verwendet wird (wobei die vorherige Aktualisierung effektiv "abläuft") Zeichen). Dies ist eine drastisch begrenzte Möglichkeit zum Abfangen und Wiedergeben.

Letzter Gedanke: Aktualisierungstoken bieten, wenn überhaupt, nur sehr wenig Schutz vor kompromittierten Clients.

Guillaume
quelle
Sie haben dies etwas angesprochen, aber ich möchte betonen, dass die größere Angriffsfläche zum Abrufen (oder umgekehrt zum versehentlichen Weitergeben) von Token in Anwendungsprotokollen oder schändlich hinzugefügten Ressourcendiensten enthalten ist (heute kein MITM-Angriff). Fast überall in einem gemeinsamen API-Backend hat Zugriff auf das verwendete Zugriffstoken (wenn es Zugriff auf das Objekt HttpRequest usw. hat). Nur ZWEI Codepfade im System haben Zugriff auf das Aktualisierungstoken - den, der es zuerst generiert, und den, der es gegen ein neues Zugriffstoken austauscht. Das ist ein signifikanter Unterschied in der Angriffsfläche.
Tom Dibble
9

Es ist im Wesentlichen eine Sicherheitsmaßnahme. Wenn Ihre App kompromittiert ist, hat der Angreifer nur Zugriff auf das kurzlebige Zugriffstoken und keine Möglichkeit, ein neues zu generieren.

Aktualisierungstoken verfallen ebenfalls, sie sollten jedoch viel länger als das Zugriffstoken leben.

Claudio Cherubino
quelle
45
Aber hätte der Angreifer nicht auch Zugriff auf das Aktualisierungstoken? und kann man dann damit ein neues Zugriffstoken erstellen?
Levi
10
@levi, der Hacker kann das Aktualisierungstoken nicht zum Erstellen eines neuen Zugriffstokens verwenden, da die Client-ID und das Clientgeheimnis zusammen mit dem Aktualisierungstoken benötigt werden, um das neue Zugriffstoken zu generieren.
Spike
9
@Spike Stimmt, aber ist in der App nicht auch die Client-ID und das Geheimnis eingebettet?
Andy
9
Es bietet also einen gewissen Schutz vor Paket-Sniffing, solange der Intercept nur normale Datenanforderungen abfängt (Chuck erhält nur das Zugriffstoken)? Das klingt etwas schwach; Der schwarze Hut muss nur ein wenig warten, bis der Benutzer ein neues Zugriffstoken anfordert, und dann erhält er die Client-ID, das Geheimnis und das Aktualisierungstoken.
3
Dies mag nur dazu führen, dass ich hier zurückgeblieben bin, aber wenn dies über SSL gesendet wird, trägt dies nicht zu einer weiteren möglichen Sicherheitsebene bei. Ich gehe davon aus, dass jeder weiß, was SSL ist.
Damon Drake