Soporte WebAuthn

RFC Webauthn

Este tema tiene como objetivo documentar los objetivos del proyecto Discourse en torno a la autenticación FIDO2 / Webauthn.

¿Por qué?

Agregar soporte para Webauthn en Discourse aumentará la seguridad de las cuentas de usuario, permitiendo cuentas sin contraseña fácilmente accesibles mediante las funciones seguras de sus dispositivos, como un lector de huellas dactilares de smartphone.

Métodos de autenticación

  • Webauthn como autenticador de segundo factor (actúa como una alternativa a Google Authenticator)
  • Webauthn como autenticador de primer factor (actúa como una alternativa al inicio de sesión con redes sociales)
  • Webauthn como autenticador multifactor (inicio de sesión sin nombre de usuario)

Webauthn como autenticador de segundo factor

Esto permitirá que un usuario de Discourse, que ya tenga una cuenta activa, utilice Webauthn como 2FA, donde actualmente solo soportamos TOTP.

Cualquier método Webauthn puede funcionar aquí, ya sea biométricos del dispositivo (sensor de huellas dactilares en Android, Windows Hello en portátiles), un chip seguro del dispositivo (TPM, enclave seguro) o una clave de hardware (como una Yubikey).

Esto estaría disponible para cada usuario que navegue con:

  • Microsoft Edge en Windows, usando Windows Hello (con reconocimiento facial, lector de huellas dactilares o PIN)
  • Chrome en macOS, usando Touch ID
  • Teléfono Android
  • Portátil/Escritorio/Teléfono + Clave física (Yubikey, Google Titan)

Webauthn como autenticador de primer factor (cuentas sin contraseña)

Permite que un usuario inicie sesión en su cuenta de Discourse utilizando la autenticación Webauthn como alternativa a una contraseña. Si se configura un autenticador de primer factor, se le pedirá al usuario que utilice el autenticador en lugar de una contraseña.

Los mismos métodos de autenticación para la autenticación de segundo factor funcionarán para la autenticación de primer factor: biométricos, chip seguro o clave de hardware.

Flujo de registro


Sin campo de contraseña

Flujo de inicio de sesión

Webauthn como autenticador multifactor (inicios de sesión sin nombre de usuario)

Expondrá un método de inicio de sesión alternativo que solo solicita entrada Webauthn. La clave de seguridad registrada transmitirá adicionalmente información del ID de usuario al servidor de Discourse.

Este método de autenticación requiere actualmente una clave de autenticación moderna (por ejemplo, una Yubikey 5) más Google Chrome 76+, ya que depende de una función llamada “Claves residentes”. Dado que esto almacena datos en el autenticador, puede haber limitaciones; por ejemplo, una Yubikey 5C solo puede almacenar hasta 25 de ellas.

Flujo de registro

Estos flujos son una evolución del de inicios de sesión sin contraseña, no un flujo de inicio de sesión separado. Esto permite una implementación iterativa.


Sin campo de contraseña, añade una casilla adicional para el uso de claves residentes

Flujo de inicio de sesión


Si el nombre de usuario se deja en blanco, intentaremos obtener un user_id del autenticador

Referencias

Demostraciones

https://webauthndemo.appspot.com/

https://webauthn.io/dashboard

Recursos

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

22 Me gusta

¡Gracias por esta RFC, es bastante exhaustiva! Sin embargo, tuve una reflexión sobre el flujo para usar WebAuthn como método de autenticación de dos factores junto con un inicio de sesión normal con nombre de usuario y contraseña. Cuando tengo 2FA usando TOTP, aparece este modal al iniciar sesión:

Si un usuario tiene habilitados tanto los códigos TOTP como los autenticadores WebAuthn, ¿cuál sería el flujo? ¿El usuario decidiría en este modal si quiere usar WebAuthn o su token 2FA? ¿O esto sería demasiado engorroso? Quizás Discourse podría optar por preguntar primero por WebAuthn si el usuario lo tiene configurado y el navegador lo soporta, y luego recurrir a 2FA como alternativa.

Implementaciones existentes

Twitter:



Github:


Cuenta de Google:



6 Me gusta

Sí, parece que se está convirtiendo en la forma estándar de implementar WebAuthn, y me gusta bastante el flujo de inicio de sesión. Definitivamente creo que también iremos en esa dirección aquí.

7 Me gusta

Gracias, Jeff, eso tiene sentido. Unas cuantas otras reflexiones hoy tras más investigación:

Autenticación de primer factor

  • Si un usuario se registra en una cuenta de Discourse usando WebAuthn como método de autenticación de primer factor, ¿habrá alguna forma más adelante de cambiar a usar una contraseña? Y de ser así, ¿la autenticación WebAuthn que hayan configurado pasaría entonces a ser un método de 2FA regular, hasta que decidan eliminarla?
  • Si WebAuthn se utilizó como método de primer factor, ¿aparecería aún en la interfaz bajo las preferencias de segundo factor, pero simplemente no sería eliminable?
  • ¿Sería también justo decir que el usuario no puede configurar inicios de sesión con redes sociales de la misma manera en que se le impide hacerlo si tiene 2FA habilitado?
  • Imagino que la sección de las preferencias del usuario donde se envía el correo electrónico de restablecimiento de contraseña también cambiaría, ya que no tendrían una contraseña al usar el primer factor:

6 Me gusta

En cuanto al texto, no me gusta usar el término «WebAuthn», creo que resulta confuso para los usuarios finales; mejor usa «llave de seguridad» o algo similar.

Me gustaría mucho evitar pensar en la autenticación de «primer factor» o «sin contraseña» en este momento; para mí, primero debemos lanzar esta función y trabajar con ella durante 3 o 4 meses antes de siquiera considerarlo.

Especialmente porque ya admitimos el inicio de sesión mediante correo electrónico, por lo que técnicamente el usuario puede olvidar su contraseña.

Estoy de acuerdo en que el flujo debería ser: si puedes y tienes las APIs y una llave WebAuthn, intenta WebAuthn primero, pero ofrece al usuario una opción de salida. Además, ten en cuenta que el usuario puede tener varios dispositivos WebAuthn; seguiría lo que hace Google al respecto (un enlace «Elegir otra opción» o algo similar).

Una cosa que considero a más largo plazo, en un ítem separado, sería poder usar la «aplicación de Discourse» para la autenticación de dos factores (2FA), lo cual sería bastante genial, @pmusaraj. Eso podría hacer que el uso de la 2FA sea mucho más ubicuo.

14 Me gusta

Sí, estoy de acuerdo. El “webauthn” en los bocetos es solo un marcador de posición.

Dicho esto, “clave de seguridad” no transmite el hecho de que un usuario pueda utilizar la huella dactilar o la cámara de su portátil o teléfono.

Sí, los 3 métodos presentados deberían implementarse en ese orden, ya que el 1 es un poco más sencillo pero sienta las bases para el 2 y el 3.

6 Me gusta

GitHub también está en la misma línea:

8 Me gusta

Respecto a “WebAuthn como autenticador de primer factor”, se está debatiendo que el nivel 2 del estándar mencione las implicaciones para la privacidad que esto puede tener: https://github.com/w3c/webauthn/pull/1250/

En cuanto a la nomenclatura de las claves de seguridad, estoy de acuerdo por las razones expuestas en la PR de RubyGems.org.

También sugerí allí agregar una marca de tiempo de “último uso para inicio de sesión” además del apodo de la clave de seguridad para ayudar a desambiguarlas y detectar posibles actividades maliciosas.

8 Me gusta

En el trabajo (que es un contexto de alta seguridad), también tenemos una alerta que te envía un correo electrónico después de que una clave de seguridad no se haya utilizado durante 90 días, invitándote a usarla o eliminarla de tu cuenta.

¿Crees que implementar esto a los 360 días podría ser una buena idea?

7 Me gusta

Gran idea. Tener un intervalo más bajo sería molesto, ya que usamos sesiones “infinitas” y creo que la mayoría de las personas tendrá una clave diaria más una de respaldo guardada en un cajón. Sin contar las claves de seguridad nativas de múltiples dispositivos.

6 Me gusta

Me complace anunciar que acabo de fusionar la PR para esta función, ¡así que muy pronto podremos probar los neumáticos de WebAuthn! :tada:

8 Me gusta

Acabo de agregar mi huella dactilar de Android, Yubikey vía NFC y Yubikey vía USB-C, usando Chrome en Android y Firefox en escritorio, y todo parece estar bien hasta ahora.

Grave error @Martin_Brennan @featheredtoast, no hay forma de iniciar sesión en la vista móvil:

Funciona perfectamente en la vista de escritorio:

10 Me gusta

Algunos comentarios aleatorios :slight_smile:

Esto no se ve bien:

Deberíamos seguir al compositor aquí en cuanto al margen y el color de cancelar.


En lugar de Correo electrónico de restablecimiento de contraseña parece un poco que no pertenece aquí.

¿Quizás mejor?

Continuar cancelar

¿Olvidaste tu contraseña? ← en gris claro


La entrada de contraseña se ve demasiado grande, debería ser un poco más pequeña.


Creo que esto debería decir “Eliminar” o “Borrar”


Si intentas agregar una YubiKey que ya habías agregado, aparece un error críptico.


En general :+1: :+1: :+1: :confetti_ball:

9 Me gusta

¡Argh, sabía que me faltaba una ruta en la revisión. Buen hallazgo :heart:

Creo que ha sido así durante un tiempo, pero sí, son buenos cambios.

De acuerdo, buen cambio.

Quizás podamos reutilizar el texto integrado de Chrome aquí: “Ya has registrado esta clave de seguridad. No necesitas volver a registrarla.” es un texto claro y conciso.

9 Me gusta

Gracias @Falco y @sam por sus comentarios. ¡No me había dado cuenta de que también había una ruta diferente para el inicio de sesión móvil! Empezaré a trabajar en estas correcciones, incluyendo los cambios en las etiquetas de la contraseña y los botones, esta noche, y con suerte incluso abriré un nuevo PR para solucionarlo.

7 Me gusta

Me alegra mucho que esto también haya funcionado en tu Android (aunque la vista móvil no esté funcionando correctamente), ya que no tenía un dispositivo Android para probarlo.

6 Me gusta

¿Puedo recomendar el Xiaomi Mi 9?

3 Me gusta

No estoy seguro de estar listo para volver a Android; me encanta demasiado mi iPhone 8 :sweat_smile:

5 Me gusta

Aquí está el PR para corregir lo anterior :rocket:

6 Me gusta

¿Quién dijo volver? ¡Ese es un pensamiento del viejo mundo! La gente moderna posee varios dispositivos :wink:

8 Me gusta