Чому термін дії маркерів доступу закінчується?


209

Я тільки починаю працювати з Google API та OAuth2. Коли клієнт авторизує мою програму, мені видають "маркер оновлення" та недовговічний "маркер доступу". Тепер, коли термін доступу закінчується, я можу розмістити свій маркер оновлення в Google, і вони дадуть мені новий маркер доступу.

Моє запитання: яка мета маркера доступу закінчується? Чому просто не може бути маркер тривалого доступу замість маркера оновлення?

Чи закінчується термін оновлення?

Див. Розділ Використання OAuth 2.0 для доступу до API Google для отримання додаткової інформації про робочий процес Google OAuth2.

Відповіді:


226

Це дуже специфічно для впровадження, але загальна ідея полягає в тому, щоб дозволити постачальникам випускати короткотермінові маркери доступу з маркерами довгострокового оновлення. Чому?

  • Багато постачальників підтримують жетони носія, які дуже слабкі для безпеки. Роблячи їх короткочасними та потребуючи оновлення, вони обмежують час, коли зловмисник може зловживати викраденим маркером.
  • Широкомасштабне розгортання не хоче здійснювати пошук у базі даних кожного виклику API, тому натомість вони видають самокодований маркер доступу, який можна перевірити розшифровкою. Однак це також означає, що немає можливості відкликати ці жетони, тому вони видаються на короткий час і повинні бути оновлені.
  • Токен оновлення вимагає аутентифікації клієнта, що робить його сильнішим. На відміну від вищезазначених токенів доступу, він зазвичай реалізується за допомогою пошуку бази даних.

4
Два питання: 1) Чи стосується мобільних додатків вимога до автентифікації клієнтів взагалі посилює її? Оскільки client_secret є частиною вихідного коду програми, то це зовсім не є секретом. Якщо припустити, що маркер доступу також надається лише через TLS (а ваша перша точка відмітки не застосовується), чи є додаткова безпека? 2) Якщо припустити, що все це є в нашому сценарії (лише TLS, жодних самостійно закодованих маркерів), чи правильно видавати маркери доступу, які не закінчуються?
Тіло

4
Що таке маркер носія і що він має відношення до оновлених маркерів та доступу?
allyourcode

7
@Thilo Я думаю, що ідея полягає в тому, що маркери доступу не повинні бути відкликаними. Як зазначає Еран, це дає можливість запитуваній службі вирішити, чи обслуговувати запит <em> без необхідності шукати маркер доступу в якійсь базі даних </em>. AFAICT, це справжня перевага розділення оновлених жетонів та доступних жетонів.
allyourcode

5
Як маркування доступу (носія?) Недовговічне? Якщо я надішлю запит із закінченим маркером носія, термін оновлення поверне новий маркер носія. Так само, якщо я викраю чий-небудь маркер у їхніх файлів cookie та підроблюю власний файл cookie цим маркером, я надішлю його на сервер, він оновиться та надішле мені новий. Що це зупинити? Не кажіть IP-адресу або навіть MAC, оскільки це нерозумно.
Suamere

3
@Suamere, це вже було пояснено. Токени носія перевіряються криптопроцесом, який не торкається бази даних аутентифікації, що робить їх набагато ефективнішими для частого доступу до ресурсів. Токени оновлення перевіряються в процесі, який включає перевірку бази даних, щоб переконатися, що вона все ще діє. Тепер подумайте, як працює gmail. Якщо хтось увійде до вашого облікового запису з несподіваного географічного місцезнаходження, ви можете отримати сповіщення. Ви можете побачити всі локації, які можуть мати поточні маркер оновлення. Ви можете вийти з усіх локацій, вимкнувши всі інші маркери оновлення.
Бон

33

Кілька сценаріїв можуть допомогти проілюструвати мету доступу та оновлення жетонів та інженерних компромісів при розробці системи oauth2 (або будь-якої іншої автентичності):

Сценарій веб-додатків

У сценарії веб-додатків у вас є кілька варіантів:

  1. якщо у вас є власне управління сеансом, збережіть і access_token, і refresh_token проти вашого ідентифікатора сеансу в стані сеансу на службі стану сеансу. Коли користувач запитує сторінку, яка вимагає від вас доступу до ресурсу, використовуйте access_token, а якщо термін доступу_token закінчився, використовуйте refresh_token, щоб отримати новий.

Уявімо, що комусь вдається викрасти ваш сеанс. Єдине, що можливо - це запитувати ваші сторінки.

  1. якщо у вас немає керування сеансом, покладіть access_token у файл cookie та використовуйте його як сеанс. Потім, кожного разу, коли користувач запитує сторінки з вашого веб-сервера, надсилає домен access_token. Ваш сервер додатків може оновити access_token за потреби.

Порівняння 1 і 2:

У 1, access_token і refresh_token проїжджають лише через провід на шляху між сервером авторизації (у вашому випадку Google) та сервером додатків. Це було б зроблено на захищеному каналі. Хакер може викрасти сеанс, але вони зможуть взаємодіяти лише з вашим веб-додатком. У 2 році хакер може забрати access_token і сформувати власні запити до ресурсів, до яких користувач надав доступ. Навіть якщо хакер має доступ до доступу_token, у них буде лише коротке вікно, в якому вони можуть отримати доступ до ресурсів.

Так чи інакше, refresh_token та clientid / secret відомі лише серверу, що робить неможливим у веб-браузері отримати довгостроковий доступ.

Давайте уявимо, що ви реалізуєте oauth2 і встановите тривалий час на маркері доступу:

В 1) Тут немає великої різниці між коротким і довгим маркером доступу, оскільки він прихований на сервері додатків. У 2) хтось може отримати access_token у браузері, а потім використовувати його для прямого доступу до ресурсів користувача протягом тривалого часу.

Мобільний сценарій

На мобільному пристрої є кілька сценаріїв, про які я знаю:

  1. Зберігайте клієнт / секрет на пристрої та майте пристрій оркеструвати, отримуючи доступ до ресурсів користувача.

  2. Використовуйте сервер додатків, щоб утримати клієнта / секрет і зробити це оркестрацією. Використовуйте access_token як своєрідний ключ сеансу та передайте його між клієнтом та сервером додатків.

Порівнюючи 1 і 2

У 1) Після того, як у вас є пристрій / секрет на пристрої, вони більше не є секретними. Будь-хто може декомпілювати та потім почати діяти так, ніби це ви, з дозволу користувача, звичайно. Access_token і refresh_token також знаходяться в пам'яті і до них можна отримати доступ на компрометованому пристрої, що означає, що хтось може діяти як ваш додаток, не надаючи користувачеві своїх даних. У цьому сценарії довжина access_token не має жодних значень для хакерства, оскільки refresh_token знаходиться там же, що і access_token. У 2) клієнт / секрет, а також маркер оновлення не порушені. Тут тривалість закінчення терміну access_token визначає, як довго хакер міг би отримати доступ до ресурсів користувачів, якщо вони отримають його.

Довжина терміну дії

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

У деяких людей, як Google, не закінчується термін refresh_token. Деякі, як stackflow. Рішення про закінчення терміну дії є компромісом між легкістю користувача та безпекою. Довжина маркера оновлення пов'язана з довжиною повернення користувача, тобто встановіть оновлення на те, як часто користувач повертається до вашої програми. Якщо маркер оновлення не закінчується, єдиний спосіб їх відкликання - це явне відкликання. Зазвичай реєстрація не скасовується.

Сподіваюсь, що досить довгий пост корисний.


про MOBILE SCENARIO це не має значення, якщо ви зберігаєте ідентифікатор клієнта на своєму сервері. тож будь-хто інший додаток просто може надіслати запит на ваш сервер і може отримати доступ до ресурсів користувачів через ваш сервер, так що це те саме
Amir Bar

правда, але тоді вони мають лише доступ до наданих вами об'єктів, а не повний доступ до базового маркера. Тобто вони можуть представити себе за ваш додаток. Часто маркери можуть мати широкі дозволи, тоді як вам потрібен лише підмножина. Якщо у вас є необхідність, утримуючи маркер на бекенді, ви надаєте подальше обмеження.
Ед Сайкс

11

На додаток до інших відповідей:

Отримавши маркери доступу, зазвичай надсилаються разом із кожним запитом від Клієнтів на захищені сервери ресурсів. Це створює ризик викрадення та повторного відтворення токенів доступу (якщо, звичайно, вважати, що жетони доступу мають тип "Bearer" (як визначено в початковій RFC6750).

Приклади таких ризиків у реальному житті:

  • Сервери ресурсів, як правило, є розповсюдженими серверами прикладних програм і, як правило, мають нижчий рівень безпеки в порівнянні з серверами авторизації (нижчий конфігурація SSL / TLS, менше загартовування тощо). Сервери авторизації, з іншого боку, зазвичай розглядаються як важлива інфраструктура безпеки і піддаються більш жорсткому загартуванню.

  • Токени доступу можуть відображатися у слідах HTTP, журналах тощо, які законно збираються для діагностичних цілей на Серверах ресурсів або клієнтах. Ці сліди можна обміняти на громадських або напівприлюдних місцях (вишукувачі помилок, сервісний стіл тощо).

  • Програми Backend RS можуть бути передані аутсорсингу більш-менш надійним третім сторонам.

З іншого боку, маркер оновлення зазвичай передається лише два рази по дротах і завжди між клієнтом та сервером авторизації: один раз, коли їх отримує клієнт, і один раз при використанні клієнта під час оновлення (фактично "закінчуючи" попереднє оновлення) лексема). Це різко обмежена можливість перехоплення та відтворення.

Останнє думка: Оновити маркери пропонують дуже малий захист від компрометованих клієнтів.


Ви дещо торкнулися цього, але я підкреслив би, що більша поверхня атаки для отримання (або навпаки ненавмисно розкриття) жетонів знаходиться в журналах додатків або з додатково наданими ресурсними службами (не атака MITM сьогодні). Майже скрізь скрізь у загальному інтерфейсі API є доступ до використовуваного маркера доступу (якщо він має доступ до об'єкта HttpRequest тощо). Лише ДВА кодові шляхи в системі мають доступ до маркера оновлення - той, який генерує його в першу чергу, і той, який обмінює його на новий маркер доступу. Це суттєва різниця поверхні атаки.
Том

9

По суті це захід безпеки. Якщо ваш додаток порушено, зловмисник матиме доступ лише до короткочасного маркера доступу і не зможе генерувати новий.

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


45
Але чи не мав би нападник також мати доступ до маркера оновлення? і чим можна використовувати це для створення нового маркера доступу?
levi

10
@levi, хакер не може використовувати маркер оновлення для створення нового маркера доступу, оскільки ідентифікатор клієнта та секрет клієнта необхідні разом з маркером оновлення для створення нового маркера доступу.
Спайк

9
@Spike True, але чи додаток не містить в собі ідентифікатор клієнта та секрет?
Енді,

9
Таким чином, він забезпечує певний захист від нюхання пакетів, якщо перехоплення лише відловлює звичайні запити даних (Чак отримує лише маркер доступу)? Це звучить трохи слабко; чорний капелюх просто повинен трохи почекати, поки користувач запитає новий маркер доступу, і тоді він отримає ідентифікатор клієнта, секрет та оновлений маркер.

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