Двухфакторная аутентификация

Материал из llmdocs — справочник разработчика
Двухфакторная аутентификация
Факторызнание (пароль), владение (телефон, ключ), неотъемлемость (биометрия)
Одноразовые кодыHOTP (RFC 4226), TOTP (RFC 6238)
Стойкие к фишингуFIDO2/WebAuthn — аппаратные ключи, passkeys
Слабые вариантыSMS, звонок, коды по email
Приложения TOTPGoogle Authenticator, Яндекс Ключ, Aegis, 2FAS, менеджеры паролей

Двухфакторная аутентификация (2FA), или в общем случае многофакторная (MFA), — способ подтверждения личности, при котором пользователь предъявляет два или более доказательства разных типов: что-то, что он знает (пароль), что-то, чем он владеет (телефон, аппаратный ключ), или что-то, чем он является (отпечаток пальца, лицо). Утечка пароля сама по себе тогда не даёт доступа к аккаунту. По оценкам крупных провайдеров, включённая MFA блокирует подавляющее большинство автоматизированных атак на учётные записи, поэтому её требуют для администраторов, разработчиков, банков и всё чаще — для всех пользователей.[7] Общая картина проверки личности и прав — в статье Аутентификация и авторизация.

Факторы

Фактор Примеры Слабости
Знание пароль, PIN, ответ на секретный вопрос фишинг, утечки, повторное использование
Владение телефон с приложением, SIM-карта, аппаратный ключ, смарт-карта потеря, кража, перевыпуск SIM
Неотъемлемость отпечаток, Face ID нельзя сменить; обычно лишь разблокирует локальный ключ

Пароль и секретный вопрос — это два знания, а не два фактора. Биометрия в современных системах почти всегда проверяется локально на устройстве и разблокирует криптографический ключ, а не отправляется на сервер.

Способы второго фактора

От слабых к сильным:

  • SMS и звонок — код приходит на номер телефона. Уязвимы к перевыпуску SIM-карты мошенниками (SIM swap), перехвату через уязвимости сети SS7 и фишингу; NIST относит их к ограниченно допустимым.[5] Тем не менее это намного лучше, чем один пароль.
  • Код по email — безопасность равна безопасности почтового ящика.
  • TOTP — приложение-аутентификатор генерирует шестизначный код, меняющийся каждые 30 секунд.[1]
  • Push-подтверждение — запрос «Это вы входите?» в приложении. Уязвимо к «бомбардировке» запросами (MFA fatigue), пока пользователь не нажмёт «да»; помогает показ числа, которое нужно ввести.
  • Аппаратные ключи и passkeys (FIDO2/WebAuthn) — криптографическая проверка, устойчивая к фишингу.[3]

Как работает TOTP

При включении сервер и приложение получают общий секрет — обычно через QR-код с URI otpauth://totp/…?secret=…. Код вычисляется как HMAC от секрета и номера текущего 30-секундного интервала, усечённый до 6 цифр. Предшественник — HOTP — использует счётчик вместо времени.[2] Серверу нужно принимать коды из соседних интервалов на случай расхождения часов и запрещать повторное использование кода.

import pyotp
secret = pyotp.random_base32()                     # хранить зашифрованным
uri = pyotp.TOTP(secret).provisioning_uri(name="user@example.ru",
                                          issuer_name="llmdocs")   # → QR-код
pyotp.TOTP(secret).verify("492039", valid_window=1)

TOTP не защищает от фишинга: поддельный сайт просит ввести код и тут же использует его на настоящем (атаки типа adversary-in-the-middle с инструментами вроде Evilginx).

FIDO2, WebAuthn и passkeys

Стандарты FIDO Alliance и W3C WebAuthn заменяют общий секрет парой ключей асимметричной криптографии. При регистрации устройство создаёт ключ, привязанный к домену сайта, и отдаёт серверу только открытую часть; при входе подписывает случайный вызов сервера. Браузер сам сообщает устройству домен, поэтому на фишинговом сайте ключ просто не сработает — это главное преимущество.[6]

  • Аппаратные ключи (YubiKey, Рутокен MFA и аналоги) — ключ не покидает устройство.
  • Passkeys — те же ключи FIDO, синхронизируемые через облако Apple, Google, менеджер паролей; могут заменить пароль целиком, объединяя владение (устройство) и биометрию или PIN.[4]

Восстановление доступа

Слабое место любой MFA — сценарий «потерял телефон». Обычные меры: одноразовые резервные коды, несколько зарегистрированных ключей, восстановление через поддержку с проверкой личности. Если восстановление сводится к SMS или email, общая стойкость падает до их уровня. Секреты TOTP и резервные коды на стороне сервера хранятся зашифрованными, как и другие секреты.

Для разработчиков и администраторов

  • Включить MFA на GitHub, у облачного провайдера, регистратора доменов и в почте — компрометация этих аккаунтов ведёт ко всему остальному.
  • Для SSH — ключи вместо паролей, при необходимости ключи на FIDO-токене (ssh-keygen -t ed25519-sk).
  • В своём сервисе — поддержать TOTP и WebAuthn, ограничить число попыток ввода кода, требовать повторную проверку для опасных действий (смена пароля, вывод средств).
  • При входе через внешних провайдеров по OAuth 2.0 и OpenID Connect MFA обеспечивает провайдер.

См. также

Источники

  1. RFC 6238 — TOTP: Time-Based One-Time Password Algorithm
  2. RFC 4226 — HOTP: An HMAC-Based One-Time Password Algorithm
  3. W3C — Web Authentication (WebAuthn) Level 3
  4. FIDO Alliance — Passkeys
  5. NIST SP 800-63B — Digital Identity Guidelines: Authentication
  6. CISA — Implementing Phishing-Resistant MFA
  7. OWASP — Multifactor Authentication Cheat Sheet