Як OAuth 2 захищає від таких речей, як повторна атака, використовуючи маркер безпеки?


564

Як я розумію, наступний ланцюжок подій відбувається в OAuth 2 для того, Site-Aщоб отримати доступ до інформації КористувачаSite-B .

  1. Site-Aреєструється на Site-Bта отримує секрет та ідентифікатор.
  2. Коли Користувач повідомляє Site-Aпро доступ Site-B, Користувача надсилають туди, Site-Bде він каже, Site-Bщо дійсно хотів би дати Site-Aдозволи на конкретну інформацію.
  3. Site-Bперенаправляє Користувача назад Site-A, а також Код авторизації.
  4. Site-Aпотім передає цей Код авторизації разом із його Секретним зворотом Site-Bу відповідь на маркер безпеки.
  5. Site-Aпотім робить запити Site-Bвід імені користувача , зв’язуючи маркер безпеки разом із запитами.

Як все це працює з точки зору безпеки та шифрування на високому рівні? Як OAuth 2 захищає від таких речей, як повторна атака, використовуючи маркер безпеки?


49
oauth2 просто пояснив тут: gist.github.com/mziwisky/10079157
Паоло

4
Прочитайте специфікацію: tools.ietf.org/html/rfc6749 Ви можете здивуватися, наскільки це зрозуміло. Це також правильно, що може бути не надто погано.
Кріс Вандермоттен

1
Це питання та його (поточні) відповіді зосереджуються на одному конкретному "типі гранту" в OAuth 2.0 (тобто code), але є інші типи грантів, визначені в OAuth 2.0, які стосуються різних випадків використання (наприклад, тих, що не стосуються користувачів).
Ганс З.

4
О, чому б не замінити "Сайт B" чимось більш читабельним, як "Сайт IdProvider"?
Юрій

Відповіді:


1378

Як працює OAuth 2.0 в реальному житті:

Я їхав по пекарні Олафа по дорозі на роботу, коли побачив у вікні найсмачніший пончик - я маю на увазі, річ капала шоколадну користь. Тож я зайшов всередину і зажадав "я мушу мати цей пончик!". Він сказав, що "впевнений, що це буде 30 доларів".

Так, я знаю, 30 доларів за один пончик! Це повинно бути смачно! Я потягнувся до свого гаманця, коли раптом почув, як шеф-кухар кричить "НІ! Немає пончика для тебе". Я запитав: чому? Він сказав, що приймає лише банківські перекази.

Серйозно? Так, він був серйозний. Я майже пішов прямо туди, але тоді пончик гукнув мені: "Їжте мене, я смачний ...". Хто я, щоб не виконувати замовлення з пончика? Я сказав добре.

Він передав мені записку із своїм прізвищем на ньому (шеф-кухар, а не пончик): "Скажи їм, що Олаф тебе послав". Його ім'я вже було на замітці, тому я не знаю, в чому сенс сказати, але гаразд.

Я їхав півтори години до свого банку. Я передав записку продавцеві; Я сказав їй, що Олаф прислав мене. Вона наділила мене одним із таких поглядів, таким, який говорить: "Я вмію читати".

Вона взяла мою записку, запитала мій ідентифікатор, запитала, скільки грошей було в порядку, щоб дати йому. Я сказав їй 30 доларів. Вона зробила кілька писанок і подала мені ще одну замітку. У цього була купа цифр, я здогадався, що так вони відстежують ноти.

У цей момент я голодую. Я кинувся звідти, через півтори години я повернувся, стоячи перед Олафом з простягнутою нотою. Він узяв, подивився і сказав: "Я повернусь".

Я думав, що він дістає мені пончик, але через 30 хвилин я почав підозріло. Тож я запитав хлопця за прилавком "Де Олаф?". Він сказав: "Він пішов отримати гроші". "Що ви маєте на увазі?". "Він бере до відома банк".

Так ... Олаф взяв записку, яку мені дали банк, і повернувся до банку, щоб отримати гроші з мого рахунку. Оскільки він мав записку, яку мені подарував банк, банк знав, що він хлопець, про якого я говорив, і тому, що я розмовляв з банком, вони знали, що він дасть йому лише 30 доларів.

Мабуть, мені знадобилося багато часу, щоб зрозуміти це, тому що, коли я підняв очі, Олаф стояв переді мною, нарешті, вручив мені свій пончик. Перед тим, як я пішов, мені довелося запитати: "Олафе, ти завжди продавав пончики таким чином?". "Ні, я робив це по-іншому".

Ага. Коли я повертався до машини, у мене задзвонив телефон. Я не турбував відповіді, це, мабуть, моя робота, яка закликала звільнити мене, мій начальник такий ***. Крім того, мене наздогнало думка про процес, який я щойно пройшов.

Я маю на увазі подумати над цим: мені вдалося дозволити Олафу забрати 30 доларів з мого банківського рахунку, не даючи йому інформації про мій рахунок. І мені не потрібно було хвилюватися, що він забере занадто багато грошей, бо я вже сказав банку, що йому дозволяють брати лише 30 доларів. І банк знав, що він правильний хлопець, бо мав записку, яку вони мені дали Олафу.

Гаразд, я впевнений, що я віддав би йому 30 доларів з кишені. Але тепер, коли він мав цю записку, я міг просто сказати банку, щоб він давав йому 30 доларів щотижня, тоді я міг просто з’являтися в пекарні, і мені більше не довелося йти до банку. Я навіть міг би замовити пончик по телефону, якби хотів.

Звичайно, я ніколи цього не робив - цей пончик був огидним.

Цікаво, чи має такий підхід більш широке застосування. Він згадав, що це його другий підхід, я міг би назвати це Olaf 2.0. У будь-якому випадку мені краще повернутися додому, я повинен почати шукати нову роботу. Але не до того, як я дістану один із тих полуничних коктейлів з того нового місця по всьому місту, мені потрібно щось змити з смаку цього пончика.


41
Що ж, на практиці Олаф повинен мати можливість забрати 30 доларів з вашого рахунку, коли він захоче, навіть якщо ви не замовляєте жодного пончика. Цікаво, що це головна мета реальних сценаріїв oauth2.0 :) Це, безумовно, чудова відповідь, але хто читає це, будь ласка, зверніться до суті, яка згадується Паоло у своєму коментарі до цього питання ( gist.github.com/mziwisky/ 10079157 ). Гарне доповнення для читання, щоб зробити концепцію кристально зрозумілою.
Самірон

4
Чудова відповідь, але 2 бали, які потрібно підняти: 1. Як зазначив @Samiron, Олаф зможе взяти 30 доларів у будь-який час, коли захоче. 2. За справжнього сценарію OAuth2.0, Олаф не зможе подати пончик до того, як забрати гроші з банку. Перебуваючи в цьому прикладі, він міг утримати чек і просто вручив Луїсу його добре зароблений пончик. Отже, якщо ми змінимо приклад, щоб я дозволив Олафу дістати тісто від якоїсь третьої сторони, про яку я знаю, тоді було б більше сенсу, оскільки Олафу доведеться дістати тісто, перш ніж він почне випікати пончик (припустимо, самотній пончик Олаф була лише з метою показу!).
Ticker23

4
ticker23, історія з пончиками, на жаль, перемагає вашу технічну корекцію. Мені продали цю історію, коли я її читав. Його написав Гомер Сімпсон.
shevy

4
@Prageeth Olaf завжди переносить нотатку до банку та з нього у захищеному ящику, в якому просочується чорнило, якщо воно підроблене, для відновлення нотатки знадобиться багато життя. Банк також приймає відбитки клієнтів під час першого візиту, якщо Олаф втратить пальці при аварії з випічкою, тоді йому доведеться попросити Луїса знову встановити банківський переказ, і банк наступного разу повинен буде визначити Олафа за його татуюванням Breaking Bread. .
Кріс

11
Я люблю милі відповіді настільки ж, як і наступна людина, і коли їх милість допомагає зробити відповідь доступнішою, що приголомшливо ... але наприкінці дня Stack Overflow - це освіта людей, і ця мила історія цього не робить. Щоб навіть зрозуміти аналогію пончика, ви вже повинні зрозуміти, як працює OAuth2, але вся суть відповіді повинна полягати саме в тому, щоб пояснити це. Будь ласка, подумайте про редагування цієї (верхньої) відповіді, щоб насправді пояснити поняття, а не просто посилатися на них у кінці кінця ... навіть якщо це доходить ціною жарту чи двох.
machineghost

133

На основі того, що я прочитав, ось як це працює:

Загальний потік, викладений у питанні, є правильним. На кроці 2 Користувач X має автентифікацію, а також авторизує доступ сайту A до інформації користувача User X про сайт B. На кроці 4 сайт передає свою таємницю назад на сайт B, автентифікуючи себе, а також код авторизації із зазначенням того, що запитує (маркер доступу користувача X).

Загалом, OAuth 2 насправді є дуже простою моделлю безпеки, і шифрування ніколи не потрапляє безпосередньо в гру. Натомість і Secret, і Token Security - це фактично паролі, і вся справа захищена лише безпекою з'єднання https.

OAuth 2 не захищає від повторних атак Token Security або Secret. Натомість він повністю покладається на те, що Сайт B несе відповідальність за ці елементи та не дає їм виходити, а також надсилає їх через https під час транзиту (https захищатиме параметри URL-адреси).

Метою кроку авторизаційного коду є просто зручність, а Кодекс авторизації самостійно не особливо чутливий. Він надає загальний ідентифікатор для маркера доступу користувача X для сайту A, коли запитує сайт B для маркера доступу користувача X. Ідентифікатор користувача Just User X на сайті B не працював, оскільки може бути багато видатних жетонів доступу, які чекають, щоб їх одночасно було роздано на різні сайти.


28
Ви пропустили важливу функцію коду авторизації. Чому б просто не повернути маркер оновлення (те, що ви називаєте маркер безпеки), а не зробити додатковий крок заміни авторизаційного коду на нього? Оскільки захоплення маркера оновлення дозволить повторити атаки, тоді як код авторизації може бути використаний лише один раз.
Моріс Нафталін

3
Гаразд, @mauricen, це має сенс .... Але хіба не вдалося повторити атаку повторення так само добре, як і маркер оновлення, оскільки саме так і передається кожен запит?
Містер Міккел

15
Код авторизації передається користувачем, тому (наприклад) він може зберігатися як файл cookie (див. Stackoverflow.com/questions/4065657/… ). Маркер оновлення проходить безпосередньо між двома сайтами, тому набагато менш вразливий.
Моріс Нафталін

Чи повертається OAuth з цікавості, якісь унікальні ідентифікатори для програми? Наприклад, я в даний час покладаюся на MAC-адресу для ідентифікації користувача, але, маючи на увазі, MAC-адреси ненадійні / легкоSoofed / тощо. Я можу просто зламати механізм ідентифікації MAC-адреси та перейти до OAuth, якщо це дозволить мені однозначно ідентифікувати користувачів.
theGreenCabbage

1
Зауважте на цій схемі: tools.ietf.org/html/rfc6749#section-4.1, що "Секрет" не відображається, лише ідентифікатор клієнта (ідентифікатор у запитанні). Чому секрет важливий і чому він не входить до RFC? Також у питанні є також локальний стан, який рекомендується передавати при первинній передачі ідентифікатора клієнта (A), і перенаправлення назад до клієнта разом з кодом авторизації для захисту від XSSF.
Девід Уїльямс

104

OAuth - це протокол, за допомогою якого стороннє додаток може отримати доступ до ваших даних, що зберігаються на іншому веб-сайті, без вашого акаунта та пароля. Для більш офіційного визначення зверніться до Wiki або специфікації.

Ось демонстраційний випадок використання:

  1. Я входжу в LinkedIn і хочу зв’язати деяких друзів, які перебувають у моїх контактах Gmail. LinkedIn підтримує це. Він попросить захищений ресурс (мій список контактів gmail) від gmail. Тому я натискаю цю кнопку:
    Додати з'єднання

  2. З'являється веб-сторінка, на якій відображається сторінка входу в Gmail, коли я ввожу свій обліковий запис і пароль:
    Додати з'єднання

  3. Потім Gmail показує сторінку згоди, де я натискаю "Прийняти": Додати з'єднання

  4. Тепер LinkedIn може отримати доступ до моїх контактів у Gmail: Додати з'єднання

Нижче наведена блок-схема наведеного вище прикладу:

Додати з'єднання

Крок 1. LinkedIn запитує маркер з сервера авторизації Gmail.

Крок 2. Сервер авторизації Gmail автентифікує власника ресурсу та показує користувачеві сторінку згоди. (користувачеві потрібно увійти в Gmail, якщо він ще не ввійшов)

Крок 3: Користувач надає запит на LinkedIn для доступу до даних Gmail.

Крок 4: сервер авторизації Gmail відповідає за допомогою маркера доступу.

Крок 5: LinkedIn викликає API Gmail за допомогою цього маркера доступу.

Крок 6: Сервер ресурсів Gmail повертає ваші контакти, якщо маркер доступу дійсний. (Маркер буде підтверджений сервером ресурсів Gmail)

Більш детальну інформацію про OAuth ви можете отримати тут .


Усі ваші образи пропали безвісти. Будь-який шанс ви можете завантажити їх на stack.imgur?
ChrisF

1
Як це може бути правильним? Чи не цей процес ініціює користувач, що сидить перед броузером, а не LinkedIn. Але у вас це є як крок 3. Це те, чого я не розумію.
Метт

17
Найпростіше пояснення. Спасибі, я ніколи більше не купуватиму пончики
OverCoder

Четверта ступінь linkedin повертається з маркером авторизації. Це має бути надано на 5-му кроці, де ми отримаємо маркер доступу та маркер оновлення, який можна було б використовувати далі для захищених ресурсів.
amesh

@amesh Спасибі, ти маєш рацію, ось це тест коду авторизації, тут я просто спрощено виклав основні ідеї OAuth 2.
Owen Cao

24

Фігура 1, знята з 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 ---|               |
     +--------+                               +---------------+

13

Ось як працює Oauth 2.0, добре пояснено в цій статті

введіть тут опис зображення


Чи можете ви описати OAUTH2 з точки зору не використання facebook чи інших сторонніх сторін, але якщо ви використовуєте секретний ключ та TOTP жетони з додатком телефону для захисту веб-сайту?
Аль-Грант

Facebook - це сервер авторизації в цьому прикладі, який видає маркер доступу будь-якому клієнту, щоб він мав доступ до API-файлів Facebook. Якщо ви хочете захистити свої API, вам потрібно впровадити власний сервер авторизації. Потім ви вирішите, який тип гранту ви хочете використовувати, щоб отримати маркер доступу. скажи мені, що саме ти хочеш? поясню.
Сурай

Я дивлюсь на налаштування з захистом Springboot. Клієнт (телефон) та веб-секрет обміняються таємницею при реєстрації - тоді використовуйте автентифікатор google для створення коду, заснованого на таймі / тайні, для введення під час входу в систему, крім пароля.
Аль-Грант

мій останній коментар просвічує тебе більше? Дивіться мій профіль для інформації про щебет
Al Grant

ви можете отримати посвідчення клієнта та секрет при реєстрації. Потім телефон зробить запит на вхід з ідентифікатором клієнта на ваш веб-сервер (сервер авторизації). веб-додаток підтверджує ідентифікатор клієнта та надсилає OTP на телефон. Телефон робить ще один запит із клієнтською таємницею в webapp для обміну OTP з маркером доступу. телефон використовує цей маркер acss для доступу до захищених ресурсів на webapp. Я думаю, це був би потік Oauth2 для даного сценарію. дайте мені знати, якщо це вам допоможе.
Сурай

10

Це дорогоцінний камінь:

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

Дуже короткий підсумок:

OAuth визначає чотири ролі:

  1. Власник ресурсу
  2. Клієнт
  3. Сервер ресурсів
  4. Сервер авторизації

Ви (власник ресурсу) маєте мобільний телефон. У вас є кілька різних облікових записів електронної пошти, але ви хочете, щоб усі ваші облікові записи електронної пошти були в одному додатку, тому вам не потрібно продовжувати перемикатися. Таким чином, ваш GMail (Клієнт) просить отримати доступ (через сервер авторизації Yahoo) до ваших електронних листів Yahoo (сервер ресурсів), щоб ви могли прочитати обидва листи у вашій заявці GMail.

Причина OAuth існує в тому, що GMail не може захищати ваше ім'я користувача та пароль Yahoo.

введіть тут опис зображення


8

Інша відповідь дуже детальна і стосується більшості питань, порушених ОП.

Щоб розробити та конкретно вирішити питання ОП "Як захищає OAuth 2 від таких речей, як повторна атака за допомогою маркера безпеки?", В офіційних рекомендаціях щодо впровадження OAuth 2 є два додаткові засоби захисту :

1) Зазвичай маркери мають короткий термін придатності ( http://tools.ietf.org/html/rfc6819#section-5.1.5.3 ):

Короткий термін придатності для жетонів є засобом захисту від наступних загроз:

  • повторити ...

2) Коли маркер використовується A сайту, рекомендується, щоб він був представлений не як параметри URL, а в полі заголовка запиту на авторизацію ( http://tools.ietf.org/html/rfc6750 ):

Клієнти ПОТРІБНО робити аутентифіковані запити з маркером носія, використовуючи поле заголовка запиту "Авторизація" зі схемою авторизації HTTP "Носій". ...

Метод "application / x-www-form-urlencoded" НЕ БУДЕ використовуватися, за винятком контекстів додатків, де браузери-учасники не мають доступу до заголовка поля "Авторизація". ...

Параметр запиту URI ... включений для документування поточного використання; його використання не рекомендується через недоліки безпеки


3

Ось, мабуть, найпростіше пояснення того, як OAuth2 працює для всіх 4 типів грантів, тобто 4 різних потоків, де додаток може отримати маркер доступу.

Схожість

Усі потоки типів грантів мають 2 частини:

  • Отримайте маркер доступу
  • Використовуйте маркер доступу

2-а частина "використовувати маркер доступу" однакова для всіх потоків

Різниця

Перша частина потоку "отримати маркер доступу" для кожного типу грантів змінюється.

Однак, загалом, частина "доступу до маркера доступу" може бути зведена як така, що складається з 5 етапів:

  1. Попередньо зареєструйте додаток (клієнт) у постачальника послуг OAuth, наприклад, Twitter тощо, щоб отримати ідентифікатор / секрет клієнта
  2. Створіть кнопку соціального входу з ідентифікатором клієнта та необхідними областями / дозволами на своїй сторінці, щоб при натисканні користувач перенаправлявся на постачальника послуг OAuth для автентифікації
  3. Провайдер OAuth просить користувача надати дозвіл на ваш додаток (клієнт)
  4. Провайдер OAuth видає код
  5. Додаток (клієнт) отримує маркер доступу

Ось бічна схема, яка порівнює, як відрізняється потік кожного типу грантів на основі 5 кроків.

Ця діаграма з https://blog.oauth.io/introduction-oauth2-flow-diagrams/

введіть тут опис зображення

Кожен має різні рівні складності в реалізації, безпеки та використання випадків. Залежно від ваших потреб і ситуації, вам доведеться використовувати один з них. Який використовувати?

Клієнтські дані : якщо ваш додаток обслуговує лише одного користувача

Творчий пароль пароля власника ресурсу : його слід використовувати лише в крайньому випадку, оскільки користувач повинен здати свої дані на додаток, а це означає, що програма може робити все, що може користувач

Код авторизації : найкращий спосіб отримати авторизацію користувача

Неявне : якщо ви додаток мобільний або односторінковий

Більше пояснення вибору тут: https://blog.oauth.io/choose-oauth2-flow-grant-types-for-app/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.