Перейти к основному содержимому

Аутентификация и авторизация

Две разные задачи, о которых говорят как об одной. Аутентификация устанавливает, кто именно обращается. Авторизация решает, что этому обратившемуся позволено. Именно из-за путаницы между ними приложение прячет кнопку, оставляя endpoint открытым.

Почему это важно. Здесь ошибка — не баг, а инцидент. И происходит она тихо: ничего не падает, когда один пользователь читает данные другого, поэтому никто не замечает, пока кто-нибудь не воспользуется.

Что нужно понимать

  • От кого пришёл запрос и насколько сервер в этом уверен
  • Где принимается решение — и что принимать его должен сервер
  • Что доказывает токен, как долго и что на самом деле даёт его отзыв
  • Какие ресурсы кому принадлежат и где эта принадлежность проверяется
  • Что происходит, когда сессия заканчивается при открытом приложении

Основные темы

Аутентификация

  • Пароли и их хеширование алгоритмом, который для этого предназначен
  • Вход без пароля: одноразовые коды по телефону или почте
  • Социальные и OAuth-провайдеры — и чему вы при этом доверяете
  • Сессии против токенов и где на устройстве хранится то и другое
  • Обновление, истечение срока и отзыв, который срабатывает немедленно

Авторизация

  • Роли, права и место, где они проверяются
  • Владение: эта запись принадлежит этому пользователю — проверяется при каждом обращении
  • Ограничение области видимости не только на запись, но и на чтение — фильтрация списков по тому, что вызывающему можно видеть
  • Правила на уровне полей, когда часть вызывающих видит меньше колонок
  • Запрет по умолчанию, чтобы новый endpoint был закрыт, пока его не откроют

Как это ломается

  • Проверка в интерфейсе вместо проверки на сервере
  • Идентификатор в запросе, принадлежность которого вызывающему никто не проверил
  • Токены в логах, в аналитике, в отчётах о падениях
  • Правила, продублированные в трёх местах и разошедшиеся после первого же изменения

Вокруг темы

  • Ограничение частоты запросов и блокировка на endpoint'ах аутентификации
  • Многофакторная аутентификация и её место в сценарии входа
  • Удаление аккаунта и экспорт данных как требования, а не как возможности

Уровни

УровеньКак это выглядит
JuniorРеализует вход и сохраняет токен. Следует принятому в проекте способу делать защищённые вызовы.
MiddleРазделяет аутентификацию и авторизацию, проверяет владение на сервере, аккуратно обрабатывает истечение срока и обновление токена.
SeniorПроектирует правила так, чтобы они существовали в одном месте и применялись по умолчанию. Продумывает отзыв прав, повышение привилегий и то, что стал бы пробовать атакующий.

Практика

Для начала

  • Атакуйте собственный endpoint Вызовите защищённый endpoint с чужим идентификатором и посмотрите, что будет.

  • Обработайте истечение срока Добейтесь, чтобы приложение вело себя корректно, когда токен истекает посреди сессии, — без падения и без бесконечного цикла.

  • Найдите утечки Поищите токены в своих логах и аналитике и уберите их оттуда.

Дальше

  • Соберите правила в одном месте Возьмите проверку владения, продублированную в нескольких endpoint'ах, и вынесите её в единственное место.

  • Фильтруйте чтение по правам Сделайте так, чтобы список возвращал только то, что вызывающему можно видеть, — на уровне запроса к базе.

  • Отзывайте немедленно Сделайте так, чтобы выход на одном устройстве сразу же завершал сессию везде, где это нужно.

Проверьте себя

  • Какие из ваших endpoint'ов вернут данные, если вызвать их с чужим идентификатором?
  • Где применяется каждое правило авторизации и не больше ли это одного места?
  • Что произойдёт с открытым приложением в момент, когда его аккаунт отключат?
  • Как хешируются ваши пароли и с какими параметрами?
  • Какие правила существуют только в интерфейсе?
  • Что атакующий смог бы прочитать в ваших логах?

Материалы

  • OWASP Authentication Cheat Sheet — практический чек-лист. Конкретные требования вместо принципов; именно с ним стоит сверять свою реализацию.
  • OWASP Password Storage Cheat Sheet — какой алгоритм, какие параметры; обновляется по мере того, как это меняется. Не полагайтесь здесь на память.
  • OAuth 2.0 — спецификации и, что полезнее, актуальные документы о лучших практиках: какие сценарии использовать, а какие уже устарели.
  • Introduction to JSON Web Tokens — что такое JWT и чем он не является. Особенно та часть, где объясняется, почему из-за «отсутствия состояния» так тяжело даётся отзыв.
  • Serverpod: authentication — как устроены сессии, области доступа и отзыв в backend'е на Dart.