Autenticación de dos factores con Duo-Security

En mi último artículo sobre la autenticación de dos factores, creé un screencast que describía cómo utilizar el sistema de autenticación de dos factores Authy para mejorar fácilmente la seguridad de inicio de sesión de su sitio web. Esta vez, vamos a ver otro servicio de Duo Security que ofrece una API de seguridad sólida, guías y bibliotecas preconfiguradas que hacen que sea increíblemente fácil ponerse en marcha rápidamente..

Al igual que Authy, necesitará un servidor de aplicaciones para implementar Duo, ya que algunos aspectos de la misma, específicamente las claves secretas, deben definirse en un lugar no accesible. Para este tutorial, estoy usando la biblioteca ColdFusion de Duo, pero también ofrecen librerías para:

  • Pitón
  • Rubí
  • ASP clásico
  • ASP.Net
  • Java
  • PHP
  • Node.js
  • Perl

Desde la perspectiva del servidor, definitivamente tienen una buena cobertura.


Preparando su aplicación en Duo

Lo primero que debe hacer es registrarse para obtener una cuenta. No voy a guiarte por esos pasos ya que debería explicarse por sí mismo, pero diré que fue genial ver una opción gratuita disponible para poder crear este tutorial sin costo alguno. Sí, Duo cobra por su servicio y, honestamente, eso es algo bueno. Desea asegurarse de que un servicio que lo ayude a proteger su sitio tenga fondos para mantenerse en el negocio por un momento.

Una vez que se haya registrado, se le pedirá que configure una nueva integración. Esto solo significa que necesita configurar los detalles de lo que desea asegurar. Y verás por qué digo, "lo que te gustaría asegurar" cuando haces clic en el Tipo de integracion desplegable. Duo le permite configurar una variedad de opciones de seguridad, no solo un sitio web.


Para nuestros propósitos, estaremos usando el SDK web"opción. La Nombre de integracion es cualquier nombre semántico que le gustaría usar para identificar su sitio con.


Después de guardar esa información, aparece una página de configuración para su integración. Aquí es donde podrá ajustar la forma en que se supone que la autenticación debe funcionar y obtener acceso a su integración, claves secretas y nombre de host de API. Estos son críticos para trabajar con éxito con Duo y no deben compartirse.


Además, deberá crear su propia clave de aplicación alfanumérica de 40 caracteres que Duo no conocerá y garantiza un mayor control de su cuenta y aplicación. Por ejemplo, generé la siguiente clave aleatoria para mi aplicación de demostración:

gQNU4CYYu3z5YvVuBamA7ZUvQ2cbe98jjI8G6rkL

Solo tenga en cuenta que debe tener 40 caracteres de longitud. De lo contrario, recibirá un error cuando intente utilizarlo..

A medida que revisa la configuración, la mayoría se explica por sí misma, pero hay una sección llamada Política que le permite definir cuándo se solicitará a un usuario la autenticación de dos factores. Es importante elegir la mejor opción para tu aplicación. Desde mi experiencia, la mayoría de los sitios tienden a preguntar a sus usuarios si les gustaría participar en la seguridad mejorada. La autenticación de dos factores puede ser complicada y algunos usuarios simplemente no quieren usarla. Para este escenario, voy a ir con el Requerir Inscripción política (que garantizará que el proceso de inscripción de Duo no se omita) y establecer una marca en el registro de la base de datos del usuario cuando se haya habilitado. Esto permite a los usuarios iniciar sesión utilizando su esquema de autenticación normal sin ser forzados a autenticarse a través de Duo.

En realidad, eso es todo lo que necesitaba para configurar en el panel de administración de Duo para que el servicio estuviera disponible para mi aplicación. Así que vamos a empezar a añadir algún código..


Agregar dúo a mi aplicación

Quiero reiterar que necesitará crear un código del lado del servidor para que esto realmente funcione y Duo ha proporcionado una amplia gama de librerías para que las use..

El código que estoy escribiendo es CFML y usaré su componente ColdFusion, que administra todas las complejidades de firmar y cifrar mi solicitud, así como verificar el valor de retorno de la API Duo.

Como mencioné anteriormente, la mayoría de las activaciones de dos factores son opcionales, lo que significa que un usuario irá a la configuración de su cuenta, haga clic en un enlace para activar el servicio y pasar por un proceso de llenado de información relevante para que las cosas funcionen. Por lo general, esto implica proporcionar al servicio un número de teléfono celular y validar las configuraciones basadas en un número único que se envía por mensaje de texto o por llamada telefónica. Duo puede ofrecer a los usuarios cualquier opción y también proporciona su propia aplicación móvil que puede generar el código de acceso para los usuarios a través de su teléfono..

Si observa la captura de pantalla a continuación, puede ver cómo he intentado replicar una pantalla de cuenta simple con un botón prominente debajo, como una llamada a la acción para activar la autenticación:


Cuando el usuario hace clic, se realiza una llamada al componente Duo para firmar la solicitud a través del signRequest () método.

 

Para entender lo que hace este método, me gustaría usar una cita del sitio Duo:

sign_request () realiza un HMAC-SHA1 del nombre de usuario, la clave de integración y una marca de tiempo de caducidad, utilizando la clave secreta de la integración como la clave HMAC. Al generar este servidor y después de la autenticación primaria, Duo tiene la seguridad de que el usuario está realmente autorizado para pasar a la etapa secundaria de autenticación.

Básicamente, está creando una solicitud cifrada basada en todas las claves para su integración, la clave de aplicación única de 40 caracteres que creó y el nombre de usuario único del usuario. El resultado final se ve algo como esto:

TX | cmV5YmFuZ29AZ21haWwuY29tfERJVzJNWDNQUDVOV0wxOVk0SVJPfDEzNzE4NDk1MTc = | 2ec4457684ad00419cfa04f833f5e99f29d20935: APP | cmV5YmFuZ29AZ21haWwuY29tfERJVzJNWDNQUDVOV0wxOVk0SVJPfDEzNzE4NTI4MTc = | d53e0565ab8d632ccac40097dfedc4356dd79209

La firma se almacena en la variable. session.sigReq que es una variable basada en sesión persistente que puedo consultar más adelante. Verifico su valor para asegurarme de que una firma válida fue pasada de vuelta y si es así, puedo pasar a la siguiente página en el proceso.


El Duo IFRAME

La firma se transfiere a IFRAME de Duo, que administra tanto la incorporación de nuevos usuarios al servicio como la validación de los usuarios existentes. Duo ofrece una biblioteca de JavaScript que interactúa con IFRAME para proporcionar la IU a los usuarios de configuración. Mirando el código a continuación, podemos ver el IFRAME, la referencia a la biblioteca Duo JS y la llamada al método para inicializar todo:

  

El método de llamada es sencillo, teniendo tres opciones:

  • El nombre de host de la API que se definió para su integración.
  • La solicitud de firma que generamos..
  • La URL a la que Duo publicará los resultados una vez que haya terminado de procesar.

Si estas confundido por esto, # session.sigReq #, no seas Es solo la forma en que ColdFusion reemplaza una variable por su valor..

En este punto, al usuario se le presentará la pantalla de configuración de Duo:


El usuario deberá ingresar un número de teléfono y luego elegir si desea recibir su código de validación de seis dígitos a través de un mensaje de voz o de texto. Probé ambos y funcionaron igual de bien. Duo realiza una verificación en su final para asegurar que el código que se ingresa es válido.

A continuación, se le presentará al usuario una pantalla para descargar la aplicación móvil Duo:


Esto es realmente bueno porque tener la aplicación móvil le permitirá al usuario obtener un código incluso si no tiene servicio celular.

Una vez que se hayan inscrito con éxito, recibirán la página que se muestra a continuación y se les pedirá una vez más que se validen:


Para todos los efectos, todo este proceso está en manos de Duo; sólo estás esperando comentarios.

Esa retroalimentación determinará si el usuario se ha configurado correctamente y tendrá que usar el VerifyResponse () método para eso.

Como antes, toma todas las variables clave y, en este caso, recibe una respuesta de Duo en forma de una variable publicada llamada sig_response. Lo he referido como form.sig_response Así es como ColdFusion permite el acceso a las variables publicadas..

los VerifyResponse () El método tomará la respuesta firmada enviada por Duo y, si todo está bien, devolverá el nombre de usuario del usuario para que lo valide en su base de datos. Así que en mi caso, esperaría que se devolviera "[email protected]". Una vez que lo haya validado, establezco la marca en el registro de la base de datos del usuario que me permitirá saber que han optado por la autenticación de dos factores..

Eso es. Eso es todo lo que necesita hacer para que los usuarios configuren la autenticación de dos factores. Ahora vamos a pasar a la experiencia de inicio de sesión.


Inicia sesión con Duo

Puede esperar que ocurra algo mágico desde aquí, pero, curiosamente, casi puede reutilizar el mismo código exacto creado para activar a un usuario y permitirle iniciar sesión. Seguí adelante y creé una página de inicio de sesión muy básica:


La página en sí es sólo el código HTML. La parte importante es determinar primero si el usuario ha optado y eso sucede cuando usted valida su información de inicio de sesión normal del sitio. Sí, todavía debe hacer su validación de inicio de sesión normal de nombre de usuario y contraseña. El servicio de Duo es complementario a eso, no un reemplazo..

Al verificar el registro de la base de datos, debería poder determinar si se han inscrito. Si no lo han hecho, solo los autentificará utilizando su combinación de nombre de usuario y contraseña normal. Si lo tienen, entonces vas a llamar al signRequest () Método, el mismo que usamos al activar un nuevo usuario:

Nuevamente, estamos creando una firma encriptada para enviar a la API de Duo a través de su biblioteca IFRAME y JavaScript. La clave es que, en este escenario, solo debemos aplicar la autenticación de dos factores si el usuario se ha registrado. Es por esto que es importante establecer la política correcta para su integración. Al establecer el mío en Requerir Inscripción y al usar una marca de registro de la base de datos, todavía puedo permitir que el usuario acceda a mi sitio, incluso si no han optado por la autenticación de dos factores. Si el usuario se ha inscrito, se le pedirá que ingrese un código Duo para validar su cuenta.


Terminando

Aumentar la seguridad de su sitio siempre es algo bueno. Desea asegurarse de proteger a sus usuarios tanto como sea posible y usar la autenticación de dos factores es un gran paso en la dirección correcta.

Duo ofrece un servicio sólido con increíble facilidad y flexibilidad. Si bien solo te mostré su SDK web, también tienen una API mucho más flexible que te da un control muy detallado sobre la mayoría de los aspectos del proceso. Aunque recomiendo usar el SDK web, es genial saber que tiene ese poder a su disposición. Me quito el sombrero ante Duo por crear un gran servicio.