Dlaczego wygasają tokeny dostępu?


209

Właśnie zaczynam pracę z Google API i OAuth2. Gdy klient autoryzuje moją aplikację, otrzymuję „token odświeżania” i krótkotrwały „token dostępu”. Teraz za każdym razem, gdy wygaśnie token dostępu, mogę wysłać mój token odświeżania do Google, a oni dadzą mi nowy token dostępu.

Moje pytanie brzmi: jaki jest cel wygasania tokena dostępu? Dlaczego zamiast tokena odświeżania nie może istnieć tylko długotrwały token dostępu?

Czy wygasa także token odświeżania?

Aby uzyskać więcej informacji o przepływie pracy Google OAuth2, zobacz Korzystanie z protokołu OAuth 2.0 w celu uzyskania dostępu do interfejsów API Google.

Odpowiedzi:


226

Jest to w dużej mierze specyficzne dla implementacji, ale ogólną ideą jest umożliwienie dostawcom wydawania krótkoterminowych tokenów dostępu z tokenami długoterminowego odświeżania. Czemu?

  • Wielu dostawców obsługuje tokeny nośnika, które są bardzo słabe pod względem bezpieczeństwa. Dzięki temu, że są krótkotrwałe i wymagają odświeżenia, ograniczają czas, w którym atakujący może wykorzystać skradziony token.
  • Wdrażanie na dużą skalę nie chce przeprowadzać wyszukiwania bazy danych przy każdym wywołaniu API, więc zamiast tego wystawiają token dostępu z własnym kodowaniem, który można zweryfikować przez odszyfrowanie. Oznacza to jednak również, że nie ma możliwości cofnięcia tych tokenów, więc są wydawane na krótki czas i muszą zostać odświeżone.
  • Token odświeżania wymaga uwierzytelnienia klienta, co czyni go silniejszym. W przeciwieństwie do powyższych tokenów dostępu, zwykle jest implementowany z wyszukiwaniem bazy danych.

4
Dwa pytania: 1) Czy w przypadku aplikacji mobilnych wymóg uwierzytelnienia klienta w ogóle go wzmacnia? Ponieważ client_secret jest częścią kodu źródłowego aplikacji, więc nie jest wcale tajny. Zakładając, że token dostępu jest współdzielony tylko przez TLS (i twój pierwszy punkt nie ma zastosowania), czy jest jakieś dodatkowe bezpieczeństwo? 2) Zakładając, że wszystko to obowiązuje w naszym scenariuszu (tylko TLS, brak samodzielnie kodowanych nieodwołalnych tokenów), czy można wydawać tokeny dostępu, które nie wygasają?
Thilo,

4
Co to jest token nośnika i co to ma wspólnego z tokenami odświeżania i dostępu?
allyourcode

7
@ Thilo Myślę, że chodzi o to, że tokeny dostępu nie muszą być odwołalne. Jak podkreśla Eran, umożliwia to żądanej usłudze podjęcie decyzji o obsłudze żądania <em> bez konieczności wyszukiwania tokena dostępu w jakiejś bazie danych </em>. AFAICT, czyli prawdziwa zaleta oddzielania tokenów odświeżania i tokenów dostępu.
allyourcode

5
W jaki sposób token dostępu (okaziciela?) Jest krótkotrwały? Jeśli złożę żądanie z wygasłym tokenem na okaziciela, token odświeżania zwróci nowy token na okaziciela. Podobnie, jeśli ukradnę czyjś token z jego plików cookie i sfałszuję własne ciasteczko tym tokenem, wysyłam je na serwer, odświeży się i wyśle ​​mi nowy. Co to ma powstrzymać? Nie mów adresu IP ani nawet MAC, ponieważ jest to nieuzasadnione.
Suamere

3
@ Suamere, to już zostało wyjaśnione. Tokeny nośnika są sprawdzane przez proces kryptograficzny, który nie dotyka bazy danych uwierzytelniania, co czyni je znacznie wydajniejszymi w przypadku częstego dostępu do zasobów. Tokeny odświeżania są sprawdzane w procesie, który obejmuje sprawdzenie bazy danych, aby upewnić się, że nadal jest poprawna. Pomyśl teraz o tym, jak działa Gmail. Jeśli ktoś zaloguje się na Twoje konto z nieoczekiwanej lokalizacji geograficznej, możesz otrzymać alert. Możesz zobaczyć wszystkie lokalizacje, które mogą mieć obecnie prawidłowe tokeny odświeżania. Możesz wylogować się ze wszystkich lokalizacji, unieważniając wszystkie inne tokeny odświeżania.
Bon

33

Kilka scenariuszy może pomóc zilustrować cel dostępu i odświeżania tokenów oraz kompromisy inżynieryjne w projektowaniu systemu oauth2 (lub dowolnego innego auth):

Scenariusz aplikacji internetowej

W scenariuszu aplikacji internetowej masz kilka opcji:

  1. jeśli masz własne zarządzanie sesjami, przechowuj zarówno access_token, jak i refresh_token względem identyfikatora sesji w stanie sesji w usłudze stanu sesji. Gdy użytkownik zażąda strony wymagającej dostępu do zasobu, użyj tokenu access_token, a jeśli wygasł access_token, skorzystaj z tokenu refresh, aby uzyskać nowy.

Wyobraźmy sobie, że komuś uda się porwać twoją sesję. Jedyne, co jest możliwe, to poprosić o swoje strony.

  1. jeśli nie masz zarządzania sesjami, umieść token dostępu w pliku cookie i użyj go jako sesji. Następnie, ilekroć użytkownik zażąda stron z serwera WWW, wyślij token dostępu. Twój serwer aplikacji może w razie potrzeby odświeżyć token dostępu.

Porównywanie 1 i 2:

W 1, access_token i refresh_token poruszają się po sieci tylko na drodze między serwerem authorzation (Google w twoim przypadku) a serwerem aplikacji. Odbyłoby się to na bezpiecznym kanale. Haker może przejąć sesję, ale będzie mógł wchodzić w interakcje tylko z Twoją aplikacją internetową. W 2 haker może zabrać access_token i utworzyć własne żądania do zasobów, do których użytkownik udzielił dostępu. Nawet jeśli haker przejmie token dostępu, będzie miał tylko krótkie okno, w którym będzie mógł uzyskać dostęp do zasobów.

Tak czy inaczej, refresh_token i clientid / secret są znane tylko serwerowi, co uniemożliwia przeglądarce internetowej uzyskanie długoterminowego dostępu.

Wyobraźmy sobie, że wdrażasz oauth2 i ustaw długi limit czasu na tokenie dostępu:

W 1) Nie ma dużej różnicy między tokenem o krótkim i długim dostępie, ponieważ jest on ukryty na serwerze aplikacji. W 2) ktoś może uzyskać token_dostępu w przeglądarce, a następnie użyć go do bezpośredniego dostępu do zasobów użytkownika przez długi czas.

Scenariusz mobilny

Na telefonie komórkowym jest kilka znanych mi scenariuszy:

  1. Przechowuj clientid / secret na urządzeniu i poproś urządzenie, aby uzyskało dostęp do zasobów użytkownika.

  2. Użyj serwera aplikacji zaplecza, aby przechować identyfikator klienta / klucz tajny i zlecić mu wykonanie operacji. Użyj access_token jako rodzaju klucza sesji i przekaż go między klientem a serwerem aplikacji.

Porównywanie 1 i 2

W 1) Gdy już masz identyfikator klienta / sekret na urządzeniu, nie są one już tajne. Każdy może dekompilować, a następnie zacząć działać tak, jakby to był użytkownik, oczywiście za zgodą użytkownika. Access_token i refresh_token są również w pamięci i można uzyskać do nich dostęp na zaatakowanym urządzeniu, co oznacza, że ​​ktoś może działać jako twoja aplikacja bez podania przez użytkownika ich poświadczeń. W tym scenariuszu długość access_token nie ma znaczenia dla hackability, ponieważ refresh_token znajduje się w tym samym miejscu, co access_token. W 2) klient / klucz tajny lub token odświeżania są zagrożone. Tutaj długość wygaśnięcia access_token określa, jak długo haker może uzyskać dostęp do zasobów użytkowników, jeśli je zdobędzie.

Okresy ważności

Tutaj zależy od tego, co zabezpieczasz w systemie uwierzytelniania, jak długo powinna trwać ważność twojego access_token. Jeśli jest to coś szczególnie cennego dla użytkownika, powinno być krótkie. Coś mniej cennego, może być dłuższe.

Niektóre osoby, takie jak Google, nie wygasają odświeżania. Niektóre takie jak Stackflow. Decyzja o wygaśnięciu jest kompromisem między łatwością obsługi a bezpieczeństwem. Długość tokenu odświeżania jest związana z długością zwracaną przez użytkownika, tj. Ustaw odświeżanie na to, jak często użytkownik powraca do Twojej aplikacji. Jeśli token odświeżania nie wygasa, jedynym sposobem na jego odwołanie jest jawne odwołanie. Zwykle logowanie nie zostanie cofnięte.

Mam nadzieję, że post o długości jest przydatny.


o SCENARIUSZU MOBILNYM nie ma znaczenia, czy przechowujesz identyfikator klienta na swoim serwerze. więc każda inna aplikacja może po prostu wysłać żądanie na Twój serwer i mieć dostęp do zasobów użytkowników przez serwer, więc to samo
Amir Bar

to prawda, ale wtedy mają oni dostęp tylko do udostępnionych przez Ciebie udogodnień, a nie pełny dostęp do bazowego tokena. Czyli mogą podszyć się pod Twoją aplikację. Często tokeny mogą mieć szerokie uprawnienia, podczas gdy wymagany jest tylko podzbiór. Trzymanie tokena w backendzie zapewnia dodatkowe ograniczenie, jeśli będzie to potrzebne.
Ed Sykes,

11

Oprócz innych odpowiedzi:

Po uzyskaniu tokeny dostępu są zazwyczaj wysyłane wraz z każdym żądaniem klientów do chronionych serwerów zasobów. Powoduje to ryzyko kradzieży i ponownego odtworzenia tokenu dostępu (zakładając oczywiście, że tokeny dostępu są typu „Nośnik” (jak zdefiniowano we wstępnej RFC6750).

Przykłady takich zagrożeń w prawdziwym życiu:

  • Serwery zasobów to zazwyczaj rozproszone serwery aplikacji i zazwyczaj mają niższe poziomy bezpieczeństwa w porównaniu do serwerów autoryzacji (niższa konfiguracja SSL / TLS, mniej hartowania itp.). Z drugiej strony serwery autoryzacji są zwykle uważane za krytyczną infrastrukturę bezpieczeństwa i podlegają bardziej surowemu zahartowaniu.

  • Tokeny dostępu mogą pojawiać się w śladach HTTP, dziennikach itp., Które są zbierane zgodnie z prawem do celów diagnostycznych na serwerach zasobów lub klientach. Ślady te można wymieniać w miejscach publicznych lub półpublicznych (narzędzia do śledzenia błędów, dział pomocy technicznej itp.).

  • Aplikacje zaplecza RS mogą być zlecane zewnętrznym stronom mniej lub bardziej godnym zaufania.

Z drugiej strony token odświeżania jest zwykle przesyłany tylko dwa razy przewodami i zawsze między klientem a serwerem autoryzacji: raz, gdy jest uzyskiwany przez klienta i raz, gdy jest używany przez klienta podczas odświeżania (skutecznie „wygasa” poprzednie odświeżenie znak). To drastycznie ograniczona możliwość przechwycenia i odtworzenia.

Ostatnia myśl, Odśwież Tokeny oferują bardzo małą ochronę, jeśli w ogóle, przed zagrożonymi klientami.


W pewnym sensie to poruszyłeś, ale chciałbym podkreślić, że większa powierzchnia ataku w celu uzyskania (lub odwrotnie niechcący ujawnienia) tokenów znajduje się w dziennikach aplikacji lub w nietypowo dodanych usługach zasobów (dziś nie jest to atak MITM). Prawie wszędzie we wspólnym zapleczu API ma dostęp do użytego tokena dostępu (jeśli ma dostęp do obiektu HttpRequest itp.). Tylko DWIE ścieżki kodu w systemie mają dostęp do tokenu odświeżania - tego, który go generuje, i tego, który wymienia go na nowy token dostępu. To znacząca różnica powierzchni ataku.
Tom Dibble,

9

Jest to zasadniczo środek bezpieczeństwa. Jeśli Twoja aplikacja zostanie przejęta, osoba atakująca będzie miała dostęp tylko do krótkotrwałego tokena dostępu i nie będzie możliwości wygenerowania nowego.

Tokeny odświeżania również wygasają, ale mają żyć znacznie dłużej niż token dostępu.


45
Ale czy atakujący nie miałby również dostępu do tokena odświeżania? i czy może to wykorzystać do utworzenia nowego tokena dostępu?
levi

10
@levi, haker nie może użyć tokenu odświeżania, aby utworzyć nowy token dostępu, ponieważ identyfikator klienta i klucz tajny klienta są potrzebne wraz z tokenem odświeżania, aby wygenerować nowy token dostępu.
Spike

9
@Spike Prawda, ale czy aplikacja nie zawiera również identyfikatora klienta i tajnego klucza?
Andy,

9
Więc zapewnia pewną ochronę przed wąchaniem pakietów, o ile przechwytywanie przechwytuje tylko zwykłe żądania danych (Chuck dostaje tylko token dostępu)? To brzmi trochę słabo; czarny kapelusz musi tylko chwilę poczekać, aż użytkownik poprosi o nowy token dostępu, a następnie dostanie identyfikator klienta, klucz tajny i token odświeżania.

3
Może to mnie po prostu opóźnić, ale jeśli zostanie to przesłane przez SSL, nie oznacza to kolejnej możliwej warstwy bezpieczeństwa. Chyba zakładam, że wszyscy wiedzą, czym jest SSL.
Damon Drake
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.