Поддержка WebAuthn

RFC WebAuthn

Эта тема призвана документировать цели проекта Discourse в области аутентификации FIDO2 / WebAuthn.

Зачем?

Добавление поддержки WebAuthn в Discourse повысит безопасность учетных записей пользователей, позволяя легко создавать учетные записи без пароля с использованием защищенных функций их устройств, таких как сканер отпечатков пальцев на смартфоне.

Методы аутентификации

  • WebAuthn в качестве второго фактора аутентификации (альтернатива Google Authenticator)
  • WebAuthn в качестве первого фактора аутентификации (альтернатива входу через социальные сети)
  • WebAuthn в качестве многофакторной аутентификации (вход без имени пользователя)

WebAuthn в качестве второго фактора аутентификации

Это позволит пользователю Discourse, у которого уже есть активная учетная запись, использовать WebAuthn в качестве 2FA, тогда как на данный момент мы поддерживаем только TOTP.

Здесь может работать любой метод WebAuthn: биометрия устройства (сканер отпечатков пальцев в Android, Windows Hello на ноутбуке), защищенный чип устройства (TPM, Secure Enclave) или аппаратный ключ (например, Yubikey).

Это будет доступно каждому пользователю, который использует:

  • Microsoft Edge на Windows с Windows Hello (распознавание лица, сканер отпечатков пальцев или PIN-код)
  • Chrome на macOS с Touch ID
  • Android-смартфон
  • Ноутбук/десктоп/телефон + физический ключ (Yubikey, Google Titan)

WebAuthn в качестве первого фактора аутентификации (учетные записи без пароля)

Позволяет пользователю войти в свою учетную запись Discourse, используя аутентификацию WebAuthn вместо пароля. Если настроен аутентификатор первого фактора, пользователю будет предложено использовать его вместо пароля.

Те же методы аутентификации, что и для второго фактора, подойдут и для первого фактора: биометрия, защищенный чип или аппаратный ключ.

Процесс регистрации


Поле пароля отсутствует

Процесс входа

WebAuthn в качестве многофакторной аутентификации (вход без имени пользователя)

Предоставит альтернативный метод входа, который запрашивает только данные WebAuthn. Зарегистрированный ключ безопасности дополнительно передаст серверу Discourse информацию об идентификаторе пользователя.

Этот метод аутентификации в настоящее время требует современного ключа аутентификации (например, Yubikey 5) и Google Chrome 76+, поскольку он использует функцию под названием «Resident Keys» (резидентные ключи). Поскольку данные хранятся на аутентификаторе, могут быть ограничения: например, Yubikey 5C может хранить не более 25 таких ключей.

Процесс регистрации

Эти сценарии являются развитием сценария для входа без пароля, а не отдельным процессом входа. Это позволяет реализовать функциональность поэтапно.


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

Процесс входа


Если имя пользователя оставлено пустым, мы попробуем получить user_id из аутентификатора

Ссылки

Демонстрации

https://webauthndemo.appspot.com/

https://webauthn.io/dashboard

Ресурсы

https://medium.com/@herrjemand/introduction-to-webauthn-api-5fd1fb46c285

22 лайка

Спасибо за этот RFC, он очень подробный! Однако у меня возникла мысль о процессе использования WebAuthn в качестве метода двухфакторной аутентификации при обычном входе с именем пользователя и паролем. Когда у меня включена 2FA с использованием TOTP, при входе появляется это модальное окно:

Если у пользователя включены и коды TOTP, и аутентификаторы WebAuthn, как будет выглядеть процесс? Будет ли пользователь в этом модальном окне выбирать, использовать ли WebAuthn или токен 2FA? Или это может оказаться слишком обременительным? Возможно, Discourse мог бы по умолчанию запрашивать WebAuthn, если у пользователя он настроен и браузер его поддерживает, а затем переходить к 2FA?

Существующие реализации

Twitter:



Github:


Учётная запись Google:



6 лайков

Да, это, похоже, становится стандартным способом реализации WebAuthn, и мне очень нравится этот процесс входа. Я точно считаю, что мы тоже будем двигаться в этом направлении.

7 лайков

Спасибо, Джефф, это логично. Несколько дополнительных мыслей сегодня после более глубокого исследования:

Первый фактор аутентификации

  • Если пользователь регистрирует учётную запись Discourse, используя WebAuthn в качестве метода аутентификации первого фактора, будет ли у него позже возможность переключиться на использование пароля? И если да, то станет ли настроенная им аутентификация WebAuthn обычным методом 2FA до тех пор, пока он сам не решит её удалить?
  • Если WebAuthn использовался как метод первого фактора, будет ли он всё ещё отображаться в интерфейсе в разделе настроек второго фактора, но просто не будет доступным для удаления?
  • Также справедливо ли будет сказать, что пользователю будет запрещено настраивать вход через социальные сети так же, как это происходит при включённой 2FA?
  • Представляю, что раздел настроек пользователя, где отправляется письмо для сброса пароля, также изменится, так как у пользователя не будет пароля при использовании первого фактора:

6 лайков

Что касается формулировок, я не люблю использовать термин «WebAuthn» — считаю, что он может запутать конечных пользователей. Лучше использовать «ключ безопасности» или что-то подобное.

Мне бы очень не хотелось даже задумываться о «первом факторе» или «безпарольной» аутентификации в данном контексте. На мой взгляд, нам нужно выпустить эту функцию и работать с ней в течение 3–4 месяцев, прежде чем рассматривать подобные вопросы.

Особенно учитывая, что у нас уже есть вход через электронную почту, поэтому технически пользователь может забыть свой пароль.

Я согласен, что логика процесса должна быть следующей: если у пользователя есть соответствующие API и ключ WebAuthn, следует сначала попытаться использовать WebAuthn, но при этом предоставить пользователю возможность выхода из ситуации. Также имейте в виду, что у пользователя может быть несколько устройств WebAuthn; в этом случае я бы последовал подходу Google по решению подобных вопросов (например, ссылка «Выбрать другой вариант» или что-то подобное).

Одна вещь, о которой я думаю в долгосрочной перспективе и которую стоит вынести в отдельный пункт: мы могли бы использовать «приложение Discourse» для двухфакторной аутентификации (2FA), что было бы довольно круто, @pmusaraj. Это сделало бы использование 2FA гораздо более распространённым.

14 лайков

Да, я согласен. Надпись «webauthn» на макетах — это просто временный вариант.

Тем не менее, термин «Security Key» не передаёт того факта, что пользователь может использовать отпечаток пальца или камеру своего ноутбука или телефона.

Да, три представленных метода должны быть реализованы в указанном порядке, так как первый немного проще, но закладывает основу для второго и третьего.

6 лайков

GitHub придерживается той же позиции:

8 лайков

Касательно «WebAuthn как средства аутентификации первого фактора»: ведутся обсуждения о том, чтобы во второй версии стандарта упомянуть связанные с этим вопросы конфиденциальности: https://github.com/w3c/webauthn/pull/1250/

Касательно именования ключей безопасности, я согласен по причинам, изложенным в PR на RubyGems.org.

Там же я предложил добавлять временную метку «последнее использование для входа» в дополнение к псевдониму ключа безопасности, чтобы помочь их различать и выявлять потенциально вредоносную активность.

8 лайков

На работе (где действуют строгие требования безопасности) у нас также есть уведомление по электронной почте, которое приходит после того, как ключ безопасности не использовался в течение 90 дней, предлагая либо использовать его, либо удалить из аккаунта.

Как вам идея реализовать это через 360 дней?

7 лайков

Отличная идея. Более короткий интервал был бы неудобным, так как мы используем «бессрочные» сессии, и, думаю, у большинства людей будет ежедневный ключ плюс резервный в ящике. Не считая встроенных ключей безопасности на нескольких устройствах.

6 лайков

Я рад сообщить, что я только что объединил PR для этой функции, поэтому мы сможем протестировать WebAuthn очень, очень скоро! :tada:

8 лайков

Только что добавил свой Android-отпечаток, Yubikey через NFC и Yubikey через USB-C, используя Chrome на Android и Firefox на рабочем столе, и пока всё выглядит хорошо.

Критическая ошибка @Martin_Brennan @featheredtoast: невозможно войти в систему в мобильном виде:

На рабочем столе всё работает отлично:

10 лайков

Некоторые случайные отзывы :slight_smile:

Это выглядит неправильно:

Здесь нужно следовать стилю композитора в отношении отступа и цвета кнопки «Отмена».


Вместо «Password reset email» фраза кажется немного неуместной.

Может быть, так?

Продолжить Отмена

Забыли пароль? ← светло-серым цветом


Поле ввода пароля выглядит слишком большим, его стоит сделать немного меньше.


Здесь, думаю, должно быть написано «Удалить» или «Убрать»


Если вы попытаетесь добавить YubiKey, который уже добавлен, появится непонятное сообщение об ошибке.


В целом :+1: :+1: :+1: :confetti_ball:

9 лайков

Ах, я знал, что в обзоре чего-то не хватает. Хорошее замечание :heart:

Думаю, так было уже давно, но да, это хорошие изменения.

Согласен, хорошее изменение.

Возможно, мы можем использовать здесь встроенную подсказку Chrome? «Вы уже зарегистрировали этот ключ безопасности. Вам не нужно регистрировать его снова» — это ясное и понятное сообщение.

9 лайков

Спасибо @Falco и @sam за ваши отзывы. Я тоже не знал, что для входа с мобильных устройств предусмотрен отдельный путь! Сегодня вечером я приступлю к исправлениям, включая изменение подписей к паролям и кнопок, и, надеюсь, даже открою новый PR для исправления!

7 лайков

Я очень рад, что это также сработало на вашем Android (хотя мобильный вид работает некорректно) — у меня не было устройства на Android для тестирования.

6 лайков

Могу я порекомендовать Xiaomi Mi 9?

3 лайка

Я не уверен, что готов вернуться на Android — я слишком люблю свой iPhone 8 :sweat_smile:

5 лайков

Вот PR для исправления вышеуказанного :rocket:

6 лайков

Кто сказал «возврат»? Это мышление старого мира! Современные люди владеют несколькими устройствами :wink:

8 лайков