Включение строгой аутентификации с помощью WebAuthn

Проблема

Фишинг является основной проблемой безопасности в Интернете: в прошлом году 81% взломов учетных записей был связан с использованием слабых или украденных паролей. Коллективным ответом отрасли на эту проблему стала многофакторная аутентификация, однако ее реализации фрагментированы и большинство из них до сих пор не обеспечивают адекватной защиты от фишинга. Мы работаем с FIDO Alliance с 2013 года, а в последнее время и с W3C над внедрением стандартизированного протокола, устойчивого к фишингу, который может использоваться любым веб-приложением.

Что такое WebAuthn?

API веб-аутентификации предоставляет веб-приложениям доступ через агента пользователя к аутентификаторам – которые часто представляют собой аппаратные токены, доступ к которым осуществляется через USB/BLE/NFC, или модули, встроенные непосредственно в платформу – для целей создания и проверки на уровне приложения (eTLD+k ) учетные данные с открытым ключом. Это позволяет использовать различные варианты использования, такие как:

  • Двухфакторная аутентификация с низким коэффициентом трения и устойчивостью к фишингу (используется вместе с паролем).
  • Беспарольная повторная авторизация на основе биометрических данных.
  • Двухфакторная аутентификация без пароля (используется для учетных записей без пароля) с низким уровнем трения и устойчивостью к фишингу.

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

WebAuthn расширяет API управления учетными данными и добавляет новый тип учетных данных под названием PublicKeyCredential . WebAuthn абстрагирует связь между браузером и аутентификатором и позволяет пользователю:

  1. Создайте и зарегистрируйте учетные данные открытого ключа для веб-сайта.
  2. Выполните аутентификацию на веб-сайте, доказав наличие соответствующего закрытого ключа.

Аутентификаторы — это устройства, которые могут генерировать пары частного/открытого ключей и собирать согласие. Согласие на подпись может быть предоставлено простым касанием, успешным считыванием отпечатка пальца или другими методами, если они соответствуют требованиям FIDO2 (существует программа сертификации аутентификаторов от FIDO Alliance). Аутентификаторы могут быть либо встроены в платформу (например, сканеры отпечатков пальцев на смартфонах), либо подключены через USB, Bluetooth Low Energy (BLE) или Near-Field Communication (NFC).

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

Создание пары ключей и регистрация пользователя

Когда пользователь хочет зарегистрировать учетные данные на веб-сайте (называемом WebAuthn «проверяющей стороной»):

  1. Доверяющая сторона создает проблему.
  2. Проверяющая сторона запрашивает браузер через API диспетчера учетных данных сгенерировать новые учетные данные для проверяющей стороны, определяя возможности устройства, например, обеспечивает ли устройство собственную аутентификацию пользователя (с помощью биометрии и т. д.).
  3. После того как аутентификатор получает согласие пользователя, он генерирует пару ключей и возвращает открытый ключ и дополнительное подписанное подтверждение на веб-сайт.
  4. Веб-приложение пересылает открытый ключ на сервер.
  5. Сервер хранит открытый ключ вместе с идентификатором пользователя, чтобы запомнить учетные данные для будущих аутентификаций.
let credential = await navigator.credentials.create({ publicKey: {
  challenge: new Uint8Array([117, 61, 252, 231, 191, 241, ...]),
  rp: { id: "acme.com", name: "ACME Corporation" },
  user: {
    id: new Uint8Array([79, 252, 83, 72, 214, 7, 89, 26]),
    name: "jamiedoe",
    displayName: "Jamie Doe"
  },
  pubKeyCredParams: [ {type: "public-key", alg: -7} ]
}});

Аутентификация пользователя

Когда веб-сайту необходимо получить подтверждение того, что он взаимодействует с нужным пользователем:

  1. Проверяющая сторона создает запрос и предоставляет браузеру список учетных данных, зарегистрированных для пользователя. Он также может указывать, где искать учетные данные, например, на локальном встроенном аутентификаторе или на внешнем через USB, BLE и т. д.
  2. Браузер просит аутентификатор подписать запрос.
  3. Если аутентификатор содержит один из заданных учетных данных, аутентификатор возвращает подписанное утверждение в веб-приложение после получения согласия пользователя.
  4. Веб-приложение пересылает подписанное утверждение на сервер для проверки проверяющей стороной.
  5. После проверки сервером поток аутентификации считается успешным.
let credential = await navigator.credentials.get({ publicKey: {
  challenge: new Uint8Array([139, 66, 181, 87, 7, 203, ...]),
  rpId: "acme.com",
  allowCredentials: [{
    type: "public-key",
    id: new Uint8Array([64, 66, 25, 78, 168, 226, 174, ...])
  }],
  userVerification: "required",
}});

Попробуйте WebAuthn самостоятельно на https://webauthndemo.appspot.com/ .

Что впереди?

Бета-версия Chrome 67 поставляется с поддержкой navigator.credentials.get({publicKey: ...}) и navigator.credentials.create({publicKey:... }) и позволяет использовать аутентификаторы U2F/CTAP 1 через USB-транспорт на настольном компьютере.

В предстоящих выпусках будет добавлена ​​поддержка большего количества транспортных средств, таких как BLE и NFC, а также нового проводного протокола CTAP 2. Мы также работаем над более продвинутыми потоками, доступными с помощью CTAP 2 и WebAuthn, такими как аутентификаторы, защищенные PIN-кодом, локальный выбор учетных записей (вместо ввода имени пользователя или пароля) и регистрация по отпечаткам пальцев.

Обратите внимание, что Microsoft Edge также поддерживает API , а Firefox поддерживает WebAuthn, начиная с Firefox 60 .

Ресурсы

Мы работаем над более подробной документацией:

Сессия «Что нового в регистрации и входе в Интернет» на Google I/O 2018 была посвящена WebAuthn.