Аутентификация и контроль доступа
Идентификация, аутентификация и авторизация, структура и уязвимости JWT, защита процессов входа, восстановление аккаунта и злоупотребление OTP.
20 вопросов
JuniorТеорияОчень частоВ чём разница между идентификацией, аутентификацией и авторизацией?
В чём разница между идентификацией, аутентификацией и авторизацией?
Идентификация — заявление, кто вы (логин). Аутентификация — доказательство заявления (пароль, токен, биометрия). Авторизация — что личности разрешено (роли, права). Порядок: идентификация, аутентификация, авторизация действия.
Типичные ошибки
- ✗Путать аутентификацию (доказательство личности) с авторизацией (права доступа)
- ✗Считать идентификацию и аутентификацию одним шагом
- ✗Думать, что авторизация может предшествовать аутентификации
Уточняющие вопросы
- →К какому из трёх шагов относится многофакторная аутентификация (MFA)?
- →Почему авторизацию проверяют на каждый запрос, а не один раз при входе?
JuniorТеорияОчень частоИз каких трёх частей состоит JWT и как он защищён?
Из каких трёх частей состоит JWT и как он защищён?
JWT состоит из трёх частей в base64url через точку — header.payload.signature. Header задаёт алгоритм, payload хранит claims, signature вычисляется по первым двум. Обычный JWT подписан, но не зашифрован: payload читаем, обнаруживается лишь подмена.
Типичные ошибки
- ✗Считать, что JWT зашифрован и payload скрыт от клиента
- ✗Класть чувствительные данные в payload, считая его приватным
- ✗Путать подпись (целостность) с шифрованием (конфиденциальность)
Уточняющие вопросы
- →Почему нельзя хранить секреты в payload обычного JWT?
- →Чем отличается подписанный JWT от зашифрованного (JWE)?
JuniorТеорияОчень частоКакие существуют факторы многофакторной аутентификации и почему SMS слабее всех?
Какие существуют факторы многофакторной аутентификации и почему SMS слабее всех?
Факторы — то, что вы знаете, чем владеете и чем являетесь. SMS слабее всех — код идёт через неподконтрольную сеть оператора и уязвим к подмене SIM. Одноразовый код выманивают в реальном времени; только WebAuthn привязан к origin сайта.
Типичные ошибки
- ✗Считать любой второй фактор одинаково стойким
- ✗Верить, что длинный SMS-код решает подмену SIM и перехват
- ✗Упускать, что фактор устойчив к фишингу только за счёт привязки к origin
Уточняющие вопросы
- →Как фишинг-прокси в реальном времени обходит одноразовый код по времени?
- →К чему стандарт аутентификации
WebAuthnпривязывает учётные данные?
MiddleДизайнОчень частоСпроектируйте защиту системы входа от подбора учётных данных. Какие механизмы детекта и предотвращения нужны против credential stuffing (перебор утёкших пар логин-пароль), password spraying (один пароль по многим логинам), brute-force, перечисления пользователей (login enumeration), фиксации и угона сессии? Опишите, что детектировать, чем реагировать и что предотвращать на уровне дизайна.
Спроектируйте защиту системы входа от подбора учётных данных. Какие механизмы детекта и предотвращения нужны против credential stuffing (перебор утёкших пар логин-пароль), password spraying (один пароль по многим логинам), brute-force, перечисления пользователей (login enumeration), фиксации и угона сессии? Опишите, что детектировать, чем реагировать и что предотвращать на уровне дизайна.
Детект: всплески неудачных входов по аккаунту (brute-force) или по многим (stuffing/spraying). Защита: throttling, CAPTCHA, запрет словарных паролей, MFA. Против enumeration — одинаковые ответы; новый сессионный токен при входе; cookie с SameSite и httpOnly.
Типичные ошибки
- ✗Детектировать только по объёму, упуская метрики по аккаунту и по паролю
- ✗Выдавать разные ответы на «нет пользователя» и «неверный пароль» (enumeration)
- ✗Переиспользовать до-логинный сессионный токен после входа (фиксация сессии)
Уточняющие вопросы
- →Чем сигнатура password spraying отличается от brute-force в логах входа?
- →Почему смена сессионного токена при входе закрывает фиксацию сессии?
JuniorТеорияЧастоЧто такое passkey и какие парольные риски он убирает полностью?
Что такое passkey и какие парольные риски он убирает полностью?
Passkey — учётные данные на открытом ключе стандарта WebAuthn. Закрытый ключ не покидает устройство, на сервер идёт только открытый, поэтому нет общего секрета для утечки или воспроизведения. Браузер подписывает только для зарегистрированного origin.
Типичные ошибки
- ✗Считать passkey паролем, который браузер хранит и отправляет
- ✗Считать, что сервер хранит секрет, который раскроет дамп утечки
- ✗Упускать, что подпись привязана к зарегистрированному origin
Уточняющие вопросы
- →Чем привязанный к устройству passkey отличается от синхронизируемого по риску восстановления?
- →Почему утечка на сервере не компрометирует аккаунты, защищённые passkey?
JuniorТеорияЧастоКакая парольная политика реально помогает: длина, проверка утечек или ротация?
Какая парольная политика реально помогает: длина, проверка утечек или ротация?
Институт стандартов NIST требует длинного минимума, щедрого максимума и проверки пароля по спискам утечек. Правила состава символов и ротация по календарю не рекомендуются — они ведут к предсказуемым мутациям. Меняйте пароль по признаку компрометации.
Типичные ошибки
- ✗Принудительно менять пароль каждые девяносто дней без признаков компрометации
- ✗Требовать классы символов вместо длины и проверки по утечкам
- ✗Ограничивать длину пароля так, что фразы и менеджеры перестают помещаться
Уточняющие вопросы
- →Почему ротация по календарю порождает предсказуемые мутации пароля?
- →Какие признаки на деле должны запускать принудительный сброс пароля?
JuniorТеорияЧастоЧем различаются модели контроля доступа RBAC и ABAC и когда уместна каждая?
Чем различаются модели контроля доступа RBAC и ABAC и когда уместна каждая?
Ролевая модель RBAC выдаёт права через именованные роли — их легко аудитировать, но роли множатся с каждым исключением. Атрибутная модель ABAC решает на каждый запрос по атрибутам пользователя, ресурса, действия и контекста. Обе по умолчанию запрещают.
Типичные ошибки
- ✗Считать ABAC строго лучшей, а не более сложной для рассуждения моделью
- ✗Считать политику «по умолчанию разрешить» приемлемой при верных ролях
- ✗Заводить новую роль на каждое исключение, пока ролей не станет больше, чем пользователей
Уточняющие вопросы
- →Что такое взрыв ролей и какой признак показывает, что он уже идёт?
- →Почему решение о доступе должно по умолчанию запрещать, если политика не найдена?
JuniorТеорияЧастоЧем соль отличается от перца при хэшировании паролей?
Чем соль отличается от перца при хэшировании паролей?
Соль — уникальное случайное значение рядом с хэшем: одинаковые пароли дают разные хэши, и радужные таблицы бесполезны. Перец — секрет вне базы, поэтому украденный дамп плохо поддаётся перебору. Оба дополняют медленную KDF вроде Argon2id.
Типичные ошибки
- ✗Считать соль секретом, который надо прятать от базы данных
- ✗Считать, что соль или перец делают быстрый SHA-256 приемлемым
- ✗Использовать одну общую соль для всех пользователей таблицы
Уточняющие вопросы
- →Почему соль должна быть уникальной на пользователя, а не на приложение?
- →Где хранить перец, чтобы дамп базы данных его не раскрывал?
JuniorТеорияЧастоЧто делает идентификатор сессии безопасным и какие атрибуты cookie его защищают?
Что делает идентификатор сессии безопасным и какие атрибуты cookie его защищают?
Идентификатор сессии должен быть длинным, из криптографического источника случайности, а не выведенным из логина, и выдаваться заново при входе. Отдавайте его в cookie с Secure, HttpOnly и SameSite, недоступной скриптам и чужим сайтам.
Типичные ошибки
- ✗Выводить идентификатор сессии из id пользователя, email или счётчика
- ✗Сохранять до-логинный идентификатор сессии после успешного входа
- ✗Не выставлять
HttpOnlyилиSameSiteна сессионной cookie
Уточняющие вопросы
- →Почему идентификатор сессии надо выдавать заново при входе?
- →Что предотвращает атрибут cookie
SameSite, чего не делаетHttpOnly?
MiddleТеорияЧастоКакие типичные уязвимости возникают при аутентификации через JWT?
Какие типичные уязвимости возникают при аутентификации через JWT?
Главные риски — alg=none (неподписанный токен), путаница HS/RS, слабый HMAC-секрет, отсутствующий или безграничный exp, чувствительные данные в payload и доверие непроверенному kid. Защита: фиксировать алгоритм и exp, брать стойкие ключи.
Типичные ошибки
- ✗Не отклонять токены с
alg=noneна стороне сервера - ✗Хранить чувствительные данные в payload, считая его скрытым
- ✗Выдавать токены без ограничения срока действия (
exp)
Уточняющие вопросы
- →Как работает атака путаницы алгоритмов HS256 и RS256?
- →Зачем валидировать заголовок
kidперед загрузкой ключа?
MiddleТеорияЧастоГде на клиенте хранить JWT и какие риски у каждого варианта?
Где на клиенте хранить JWT и какие риски у каждого варианта?
Хранить JWT в cookie с httpOnly + secure или в памяти — не в localStorage, который читается любым JS, поэтому один XSS крадёт токен. Cookie с httpOnly недоступна JS, но шлётся автоматически, поэтому нужна защита от CSRF (SameSite). Важно: httpOnly/secure — атрибуты cookie, не localStorage.
Типичные ошибки
- ✗Считать httpOnly/secure применимыми к localStorage
- ✗Хранить JWT в localStorage, недооценивая риск кражи через XSS
- ✗Путать подписанный JWT с зашифрованным (payload читается)
Уточняющие вопросы
- →Почему хранение JWT в httpOnly cookie требует ещё и защиты от CSRF?
- →Чем хранение токена в памяти безопаснее localStorage и какой у него минус?
MiddleДизайнЧастоАудитируете восстановление пароля: ввод email → ссылка /restore/<id> → ввод OTP → новый пароль. Что проверять? Ссылка вида /restore/1678371465 содержит timestamp. Перечислите изъяны и контроли на каждом шаге — от обработки email до проверки OTP и смены пароля.
Аудитируете восстановление пароля: ввод email → ссылка /restore/<id> → ввод OTP → новый пароль. Что проверять? Ссылка вида /restore/1678371465 содержит timestamp. Перечислите изъяны и контроли на каждом шаге — от обработки email до проверки OTP и смены пароля.
Ссылка /restore/<id> с timestamp предсказуема — нужен случайный токен, одноразовый, с коротким TTL. Одинаковые ответы против перечисления; URL строить из конфигурации, а не из заголовка Host. Для OTP: лимиты отправок и вводов, TTL, лимит попыток.
Типичные ошибки
- ✗Использовать предсказуемый идентификатор ссылки (timestamp/счётчик)
- ✗Строить URL восстановления из заголовка Host (host header injection)
- ✗Не ограничивать число попыток ввода OTP и не задавать ему TTL
Уточняющие вопросы
- →Почему ссылку восстановления нельзя строить из заголовка Host?
- →Какой состояние гонки возможен на шаге проверки OTP?
MiddleТеорияЧастоПочему блокировка аккаунта — плохой ответ на credential stuffing и чем её заменить?
Почему блокировка аккаунта — плохой ответ на credential stuffing и чем её заменить?
Credential stuffing воспроизводит утёкшие пары по попытке на аккаунт, поэтому счётчики на аккаунт не срабатывают. Блокировка становится оружием: атакующий намеренно блокирует людей. Лучше плавное замедление, сигналы устройства и сети и MFA по риску.
Типичные ошибки
- ✗Детектировать только неудачи по аккаунту, чего stuffing намеренно избегает
- ✗Считать блокировку бесплатной, игнорируя отказ в обслуживании, который она дарит атакующему
- ✗Блокировать одиночные адреса против кампании, размазанной по множеству хостов
Уточняющие вопросы
- →Какая метрика отличает credential stuffing от brute-force по одному аккаунту?
- →Как плавное замедление остаётся удобным для легитимного пользователя с опечаткой?
JuniorДизайнИногдаКак снизить ущерб от спам-атаки на отправку SMS-кодов (SMS-бомбинг)?
Как снизить ущерб от спам-атаки на отправку SMS-кодов (SMS-бомбинг)?
Каждая SMS стоит денег, поэтому флуд запросов кода жжёт бюджет. Уберите SMS за первый фактор, чтобы анонимы её не вызывали; лучше push; лимитируйте запросы на пользователя/IP/устройство (особенно не введённые коды); выявляйте аномалии; ставьте WAF.
Типичные ошибки
- ✗Считать проблемой угадывание кода, а не стоимость отправки
- ✗Оставлять эндпоинт отправки SMS доступным анонимным пользователям
- ✗Не ограничивать частоту запросов, когда код запрашивают, но не вводят
Уточняющие вопросы
- →Почему перенос SMS за первый фактор особенно эффективен против бомбинга?
- →Какие метрики помогут отличить атаку от всплеска легитимного трафика?
MiddleТеорияИногдаПочему восстановление доступа так часто становится обходом сильной аутентификации?
Почему восстановление доступа так часто становится обходом сильной аутентификации?
Восстановление — вторая дверь в аккаунт, поэтому система крепка ровно как её слабейший путь: сброс через почту отменяет ключ безопасности. Держите его на уровне основного входа: проверенные каналы, отложка с уведомлением перед сбросом MFA и аудит.
Типичные ошибки
- ✗Позволять сбросу через почту перебивать устойчивый к фишингу основной фактор
- ✗Разрешать поддержке снимать MFA без отложки и уведомления
- ✗Использовать контрольные вопросы, ответы на которые находятся в открытых источниках
Уточняющие вопросы
- →Почему отложка с уведомлением ослабляет сброс MFA через социальную инженерию?
- →Как резервные коды меняют риск восстановления по сравнению со сбросом через поддержку?
MiddleДебаггингИногдаОбработчик входа сохраняет до-логинную сессию — найдите и исправьте изъян.
Обработчик входа сохраняет до-логинную сессию — найдите и исправьте изъян.
Обработчик оставляет идентификатор, с которым пришёл посетитель, поэтому подсунувший его владеет сессией — классическая фиксация, а выход лишь обнуляет поле. Перевыдавайте сессию при входе и смене прав, уничтожайте при выходе, укрепите cookie.
Открыть задачу →Типичные ошибки
- ✗Считать, что хранилище сессий само меняет идентификатор при входе
- ✗Считать обнулённое поле пользователя при выходе уничтоженной сессией
- ✗Отдавать сессионную cookie без
HttpOnly,SecureиSameSite
Уточняющие вопросы
- →Какое ещё событие, кроме входа, обязано вызывать перевыдачу сессии?
- →Почему выход обязан удалять серверную запись, а не только cookie?
SeniorТеорияИногдаКак сервисы должны аутентифицировать друг друга вместо общих статичных секретов?
Как сервисы должны аутентифицировать друг друга вместо общих статичных секретов?
Дайте каждой нагрузке собственную проверяемую личность — сертификаты mTLS или короткоживущие токены от платформенного сервиса идентичности — вместо общего ключа API в конфиге. Учётные данные ротируются сами, узко ограничены и отзываются без передеплоя.
Типичные ошибки
- ✗Использовать один долгоживущий ключ API на все внутренние сервисы
- ✗Доверять заголовку с личностью вызывающего вместо криптографического доказательства
- ✗Считать сетевое расположение аутентификацией внутренних вызовов
Уточняющие вопросы
- →Что доказывает взаимный TLS, чего не доказывает секрет-предъявитель в заголовке?
- →Как управлять аварийной учётной записью break-glass с повышенными правами?
SeniorТеорияИногдаКак выбирать таймауты бездействия и абсолютный и как инвалидировать сессии?
Как выбирать таймауты бездействия и абсолютный и как инвалидировать сессии?
Нужны оба: таймаут бездействия закрывает забытую сессию, а абсолютный ограничивает срок жизни украденного токена. Инвалидируйте на сервере при выходе, сбросе пароля и смене прав, плюс выход со всех устройств. Токен без состояния живёт недолго.
Типичные ошибки
- ✗Ставить таймаут бездействия без абсолютного предела возраста сессии
- ✗Считать, что сброс пароля сам по себе отзывает выданные токены без состояния
- ✗Оставлять сессию действительной при смене роли или привилегий
Уточняющие вопросы
- →Зачем нужен абсолютный таймаут, если таймаут бездействия уже задан?
- →Как реализовать выход со всех устройств для токенов без состояния?
SeniorТеорияИногдаКаков радиус поражения при едином входе SSO и как его ограничить?
Каков радиус поражения при едином входе SSO и как его ограничить?
Один провайдер идентичности стоит перед всеми, поэтому подделанное утверждение или взломанный админ достаёт до всех сразу. Ограничивают это MFA против фишинга у провайдера, короткие сроки утверждений, свои audience и scope на приложение и центральный отзыв.
Типичные ошибки
- ✗Считать, что одно хранилище учётных данных означает малый радиус поражения
- ✗Выдавать утверждения без отдельных audience и scope на приложение
- ✗Защищать администраторов провайдера не лучше обычных пользователей
Уточняющие вопросы
- →Зачем утверждению нужно значение audience, специфичное для приложения?
- →Какие приложения оправдывают повышение фактора даже после единого входа?
SeniorДизайнРедкоПлатёжная панель аутентифицирует сотрудников паролем и одноразовым кодом по времени и выдаёт веб-сессию сроком до двенадцати часов. Чувствительных операций четыре: добавление банковского счёта для выплат, повышение лимита перевода, отключение второго фактора и выгрузка списка клиентов. Ограничения — примерно у трети сотрудников зарегистрированы аппаратные ключи безопасности, у остальных нет; продуктовая команда отвергает любое решение, требующее полного повторного входа перед каждой чувствительной операцией; мобильное приложение и веб используют один бэкенд сессий; регулятор требует аудируемую запись о том, кто одобрил каждое чувствительное изменение. Спроектируйте повышение фактора для этой системы: какие операции его запускают, какой фактор обязателен, что даёт успешное повышение и на какой срок, как результат привязан к сессии и к конкретной операции и что попадает в журнал аудита.
Платёжная панель аутентифицирует сотрудников паролем и одноразовым кодом по времени и выдаёт веб-сессию сроком до двенадцати часов. Чувствительных операций четыре: добавление банковского счёта для выплат, повышение лимита перевода, отключение второго фактора и выгрузка списка клиентов. Ограничения — примерно у трети сотрудников зарегистрированы аппаратные ключи безопасности, у остальных нет; продуктовая команда отвергает любое решение, требующее полного повторного входа перед каждой чувствительной операцией; мобильное приложение и веб используют один бэкенд сессий; регулятор требует аудируемую запись о том, кто одобрил каждое чувствительное изменение. Спроектируйте повышение фактора для этой системы: какие операции его запускают, какой фактор обязателен, что даёт успешное повышение и на какой срок, как результат привязан к сессии и к конкретной операции и что попадает в журнал аудита.
Запускайте повышение фактора только на наборе чувствительных операций. Требуйте устойчивый к фишингу фактор там, где он зарегистрирован, иначе одноразовый код. Привязывайте результат к сессии и к этой конкретной операции на короткое окно, а не к глобальному флагу, и пишите в аудит субъекта, фактор и исход.
Типичные ошибки
- ✗Выдавать глобальный флаг повышенных прав вместо привязки к одной операции
- ✗Переиспользовать факторы входа вместо требования свежего доказательства
- ✗Аудитировать только неудачи, оставляя одобренные чувствительные изменения незаписанными
Уточняющие вопросы
- →Почему результат повышения надо привязывать к параметрам операции, а не только к сессии?
- →Как обслужить сотрудников без аппаратного ключа, не ослабляя весь контроль?