[Из песочницы] FIDO U2F — Универсальная Двухфакторная Аутентификация. Введение

Ни для кого не секрет, что сегодня существует большая проблема с безопасностью в интернете. Пользователи используют легкие пароли и переиспользуют их на других ресурсах. Парольные менеджеры все еще в новинку для обычного пользователя, и вашу бабушку вы вряд ли заставите использовать случайные одноразовые пароли с высокой энтропией. Жизнь тлен и боль…


На заре веб2.0 мы стали понимать, что паролей недостаточно и изобрели двухфакторную аутентификацию или 2FA.


Что из себя представляют 2FA решения сегодня?


  • SMS — одноразовые пароли отправленные с помощью SMS.


  • OTP (TOTP/HOTP) — одноразовые пароли, сгенерированные на основе мастер ключей. Примеры: Google Authenticator, Yubikey, банковские OTP токены.


  • Криптографические Токены — аппаратные средства для многофакторной аутентификации пользователей. Примеры: RSA SecureID, Рутокен.

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



Причин много:


  • Фишинг — практически все перечисленные решения уязвимы к MITM (человек посередине) атакам, и соответственно фишингу. Что остановит пользователя, который уже ввел свой логин и пароль, от введения одноразового пароля?


  • Безопасность — в данном случае я буду говорить именно про SMS. SMS на данный момент самое популярное решение 2FA на рынке. Истории о перевыпуске сим карты случались не только в России, но и в США, ЮАР, Великобритании и других странах. Почти все провайдеры предоставляют возможность восстановления сим-карт, и методы социальной инженерии еще никто не отменял.


  • Стоимость — если вы швейцарский банк, и ваш клиент хранит семизначные суммы иностранной валюты, то RSA токены это мизерная цена для обеспечения безопасности аккаунтов ваших клиентов. А если вы Twitter или Facebook, то выдавать недешевые токены каждому пользователю просто невозможно. SMS тоже стоит денег, и если вы держите любительский аниме форум о дискуссиях про то как пропатчить KDE под FreeBSD, то вы вряд ли сможете позволить себе SMS.


  • Совместимость — никто не любит возиться с драйверами, и это одна из причин того, что RSA и Рутокен все еще не завоевали мир.


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

Этот список можно еще долго продолжать, но я думаю что мысль донесена. Сегодняшние решения не в состоянии надежно защитить пользователя, сложны в применении, дороги и не универсальны.


FIDO U2F — Универсализируем второй фактор


В 2013 году в Кремниевой Долине был организован FIDO (Fast IDentity Online) альянс для того, чтобы адресовать проблемы легкой и безопасной аутентификации в интернете. На данный момент FIDO имеет более трёхсот ассоциативных членов и тридцать членов правления. В список членов правления входят такие компании как Google, Yubico, Microsoft, Visa, Mastercard, American Express, Paypal и другие.


Основные цели, которые FIDO ставит перед собой, это простые в использовании, безопасные, приватные и стандартизированные решения.


На данный момент FIDO представили два стандарта: U2F (Universal Second Factor) — универсальный второй фактор, UAF (Universal Authentication Framework) — универсальный аутентификационный фреймворк для биометрической аутентификации. Сегодня мы поговорим о U2F. Если тема будет интересна, то в будущем я могу написать статью по UAF.


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


Как это работает?

У U2F протокола три уровня абстракции: Пользователь, Браузер (тех. Клиент) и сам Протокол.


Пользователь


847baf02843c4d37a3a2816be840efee.png


Для пользователя все достаточно просто. Пользователь вводит логин и пароль, вставляет U2F устройство, нажимает кнопку и успешно проходит аутентификацию. Собственно об этом ранее уже писали на ХабраХабре.


Браузер


6e34b5121dc741aeb5e6dcca991b0fc4.jpeg


Алгоритм взаимодействия с U2F на стороне браузера такой:


  • Пользователь проходит верификацию логина и пароля


  • Зависимая сторона, Google например, через U2F JS API запрашивает подпись вызова (challenge)


  • Браузер пересылает запрос устройству

Если пользователь подтвердил, например с помощью нажатия кнопки или иным образом, свое желание произвести двухфакторную аутентификацию, то устройство возвращает подпись вызова


  • Браузер передает подпись зависимой стороне


  • Зависимая сторона верифицирует подпись

Протокол — или пять с половиной шагов к безопасной двухфакторной аутентификации

Шаг первый — Вызов-Ответ


59b58eefcf8e49be961cbb24b93c9dff.png


Для начала мы производим простой вызов-ответ. Сервер посылает нам случайный вызов. Наше устройство подписывает вызов и возвращает подпись серверу, после чего сервер сверяет подпись.


Шаг второй — Защита от фишинга


Подписываем оригинальный URL и Channel IDПодписываем оригинальный URL и Channel ID


Сам по себе вызов-ответ не решает проблемы фишинга, так как если вы залогинились на rnail.ru вместо mail.ru, то ваша подпись все еще может быть использована для входа в ваш аккаунт. Для защиты от этого браузер к вызову добавляет URL, с которого был произведен запрос на подпись, и ID канала TLS, после чего зависимая сторона сверяет эти данные.


Шаг третий — Приватность или регистрационно-зависимая пара ключей


Генерируем регистрационно-зависимую паруГенерируем регистрационно-зависимую пару


На данный момент наше устройство подписывает все одной парой ключей. Это создает проблему для приватности, в связи с тем что публичный ключ будет везде одинаковый. Для примера скажем если бы вы были зарегистрированы на печально известном AshleyMadison.com, то атакующий мог бы связать слитый публичный ключ и ваши другие аккаунты и потенциально причинить физический и моральный вред.


Чтобы сохранить приватность при регистрации, зависимая сторона передает ID приложения (AppID) и семя (случайное число). На основе этих данных устройство генерирует уникальную регистрационно-зависимую пару ключей. Как устройство генерирует пару не описано в протоколе, а полностью отдано на усмотрение изготовителя устройства. Например, каждый Yubikey имеет свой мастер ключ, который в связке с HMAC и ГПСЧ (Генератор псевдослучайных чисел) генерирует новую пару.


[https://developers.yubico.com/U2F/Protocol_details/Key_generation.html](https://developers.yubico.com/U2F/Protocol_details/Key_generation.html)https://developers.yubico.com/U2F/Protocol_details/Key_generation.html


За счет того, что пара ключей уникальна для каждой регистрации, становится возможным использовать совместно одно U2F устройство для множества аккаунтов.


Шаг четвертый — Защита от клонирования


2cc2ee41df614611ac9819158d862bb3.png


Так как U2F это только протокол, то он может иметь разные имплементации, в железе и ПО. Некоторые имплементации могут быть не устойчивыми к клонированию. Для защиты от этого U2F устройство имеет встроенный счетчик. Каждая подпись и регистрация увеличивает состояние счетчика на единицу. Состояние счетчика подписывается и возвращается зависимой стороне. Если U2F устройство было склонировано, то состояние счетчика клонированного устройства скорее всего будет меньше чем состояние счетчика оригинального устройства, что вызовет ошибку во время верификации.


Шаг пятый— Аттестация Ключа


f9419d8706964279af86938203bbc249.png


Разные имплементации протокола могут быть быть небезопасны. Чтобы избежать этого, каждое U2F устройство имеет встроенный партийный сертификат, который устанавливается приблизительно на каждые сто тысяч устройств. Каждая подпись и регистрация дополнительно подписывается сертификатом, публичный ключ которого находится в публичной директории.


Зачем это надо? Например, если вы — форум о котятах, то вы возможно не сильно волнуетесь о том, насколько безопасны U2F устройства ваших пользователей, а если вы банк, то возможно вы разрешите только устройства, выполненные в железе, и только если они сертифицированы FIDO альянсом.


Шаг шесть с половиной — Защита от перебора


d8f62ce9fc6a4e7f8f557046414d8bdf.jpeg


В ситуации, когда пользователь находится вдали от своего устройства, вредоносное программное обеспечение может попытаться атаковать устройство методом полного перебора или другими видами атак. Для защиты от этого U2F стандарт требует чтобы все имплементации, в железе и ПО, активировались пользователем. Пользователь обязан подтвердить свое решение на двухфакторную аутентификацию. Этим действием может быть простое нажатие на кнопку, ввод пин-кода, снятие отпечатка пальца или другое.


Сервисы с множественными точками входа


Возьмем для примера Gmail.


98904133745a421f899e203e9036c53c.png


В Gmail можно войти как с веб интерфейса, так и с мобильного. Как можно произвести авторизацию пользователя с андроид приложения, если AppID нашего приложения и AppID сервиса будут различаться?


Для этого есть фасеты (facets).


Фасеты — это JSON файл со списком всех ID, которым разрешается производить аутентификацию для выбранного сервиса. Для примера, вот фасеты Google:


{
  "trustedFacets": [{
    "version": { "major": 1, "minor" : 0 },
    "ids": [
      "https://accounts.google.com",
      "https://myaccount.google.com",
      "https://security.google.com",
      "android:apk-key-hash:FD18FA800DD00C0D9D7724328B6...",
      "android:apk-key-hash:Rj6gA3QDA2ddyQyi21JXly6gw9...",
      "ios:bundle-id:com.google.SecurityKey.dogfood"
    ]
  }]
}

Фасеты должны быть в том же доменном пространстве что и AppID. Например, если наше AppID это https://example.com/facets.json, то https://**security**.example**.com пройдет проверку, а https://security.example.net **нет.


Для мобильных приложений фасеты имеют URI схему вида «OS: TYPE: ID». Для андроида вычисляется SHA-1 сертификата подписи apk. Для IOS это bundle ID.


Фасеты обязаны раздаваться по HTTPS!


Спецификации


30905d03085b4d64a2162de27d782cda.png


На данный момент готовы спецификации для USB, NFC и Bluetooth LE.


Поддержка браузерами


7fc07bfd091c41e584ed82957c8d1bc8.png


Chrome поддерживает U2F из коробки с начала 2015. U2F поддержка в Firefox в данный момент в активной разработке. Microsoft анонсировала поддержку U2F как для Windows 10 так и для Edge как часть FIDO2.0 стека, и она уже доступна в Insider Build.


Кто использует?


981921b02a8d4351b5d779aec9f9b558.png


Google, Github, Wordpress, Dropbox, Evernote. Правительство Великобритании недавно ввело поддержку U2F для своих государственных сайтов, что немало доставляет.


Что нужно учесть при переходе на U2F?


  • HTTPS ОБЯЗАТЕЛЕН —мало того, что если вы не предоставляете HTTPS своим пользователям, то вас не заботит их безопасность, и U2F вам будет мало интересен. Firefox, Chrome, и Edge требуют HTTPS соединения для использования U2F API.


  • Попробуйте TLS SessionID.


  • U2F это второй фактор. Не будьте как банки. Не используйте 2FA как основной фактор.

Подводим итоги


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


U2F всего лишь протокол, что влечет за собой создание огромного рынка решений на основе его. От крипто-ключей с безопасным элементом, JavaCard имплементаций, до мобильных приложений и биометрически-защищенных U2F устройств, U2F дает свободу вашей фантазии втом, где его можно применить.


Примечания


  • https://fidoalliance.org/specifications/download/


  • https://fidoalliance.org/specs/fido-u2f-v1.0-ps-20141009/fido-appid-and-facets-ps-20141009.html


  • https://developers.yubico.com/U2F/

Если вы хотели бы больше узнать о U2F и его внедрении, а так же о других решениях FIDO альянса, пишите в комментариях.

Комментарии (6)

  • 12 июля 2016 в 17:49

    0

    Не повторит ли эта штука судьбу OpenID? Тоже, вроде, все было здорово… И поддерживали прям все-все… И как все бесславно закончилось…
    Кроме самой технологии, надо чтобы пользователь ее еще захотел использовать, а пока что я вижу только потенциальные проблемы от ее использования.
    Что будет если пользователь потеряет свой токен? Надо восстанавливать доступ — привет социальная инженерия!
    А как авторизоваться с чужого устройства? А если нет USB порта?
    • 12 июля 2016 в 18:08 (комментарий был изменён)

      0

      FIDO U2F не предназначен для универсальной аутентификации, а только протокол для универсального второго фактора. В связи с тем что для каждой регистрации генерируется уникальная пара ключей, связать разные аккаунты с помощью регистрационных дынных токена, не представляется возможным.

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

      На данный момент готовы спецификации для USB, NFC и Bluetooth LE. Готовые решения вы можете видеть на картинке выше в секции спецификации.

  • 12 июля 2016 в 19:20

    0

    Повёлся на аббревиатуру FIDO. Оказалось, что это совсем другое FIDO. :)
  • 12 июля 2016 в 22:52

    0

    Баг в котором можно отслеживать разработку FIDO u2f api в Firefox
  • 12 июля 2016 в 23:05

    0

    На брелке не хватает мониторчика, который бы отображал информацию, которую его просят подписать.
  • 12 июля 2016 в 23:39

    0

    Не взлетит.

    Основная проблема — материальность ключей и их слишком высокая (на мой взгляд) стоимость. Ключ от Yubico стоит $18, примерно как неплохая флешка на 32Гб, и покупать его простой человек не будет. Нужно, чтобы эти ключи заставляли покупать, или чтобы хотя бы смысл покупки был заметен. Или опустить цену до пары долларов.
    Вообще, на мой дилетантский взгляд, заинтересовать 2FA-токенами людей, не причастных к IT-безопасности, вышло разве что у Близзарда.

    Теперь сравним с xOTP. C _софтовыми_ реализациями OTP. Телефоны у всех есть, Google Authenticator или аналог на них прекрасно ставится. Затрат — ноль. Проблем при потере ключа, скажем, при перепрошивке — минимум. А ведь есть реализации OTP и на других девайсах…

    И нет, то, что Гугл, Дропбокс и прочие поддерживают U2F — ни о чём не говорит. Подключить _ещё один_ модуль аутентификации не настолько уж сложно и затратно.

    Так что, на мой взгляд, это очередной «пятнадцатый стандарт».

© Habrahabr.ru