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