Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Web Development

Autenticación de dos factores con Duo-Security

by
Read Time:9 minsLanguages:

Spanish (Español) translation by steven (you can also view the original English article)

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

Al igual que Authy, necesitarás un servidor de aplicaciones para implementar Duo, ya que algunos aspectos, 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 bibliotecas para:

  • Python
  • Ruby
  • ASP clásico
  • ASP.Net
  • Java
  • PHP
  • Node.js
  • Perl

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


Preparando tu aplicación en Duo

Lo primero que debes hacer es registrarte para obtener una cuenta. No voy a guiarte a través de esos pasos, ya que debería ser autoexplicativo, 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, sinceramente, eso es algo bueno. Deseas asegurarte de que un servicio que te está ayudando a proteger tu sitio tenga fondos para mantenerse en el negocio por un tiempo.

Una vez que estés registrado, se te pedirá que configures una nueva integración. Esto solo significa que debes configurar los detalles de lo que te gustaría proteger. Y verás por qué digo "lo que te gustaría proteger" cuando hagas clic en el menú desplegable Tipo de integración. Duo te permite configurar una variedad de opciones de seguridad, no solo un sitio web.

integration-types

Para nuestros propósitos, usaremos la opción Web SDK. El nombre de integración es cualquier nombre semántico que te gustaría usar para identificar tu sitio.

new-integrationnew-integrationnew-integration

Después de guardar esa información, se te presenta una página de configuración para tu integración. Aquí es donde ajustarás cómo supones que funcione la autenticación y obtendrás acceso a tu integración, claves secretas y nombre de host de la API. Estos son fundamentales para trabajar con éxito con Duo y no deben compartirse.

secret-keyssecret-keyssecret-keys

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

Solo ten en cuenta que debe tener 40 caracteres. De lo contrario, recibirás un error cuando intentes utilizarlo.

A medida que revisas la configuración, la mayoría se explica por sí misma, pero hay una sección llamada Política que te permite definir cuándo se le 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 optar por la seguridad mejorada. La autenticación de dos factores puede ser engorrosa y algunos usuarios simplemente no quieren usarla. Para este escenario, voy a seguir la política de registro requerida (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 hayan optado por participar. Esto permite a los usuarios iniciar sesión utilizando tu esquema de autenticación normal sin verse obligados a autenticarse a través de Duo.

En realidad, eso es todo lo que necesitaba configurar en el panel de administración de Duo para que el servicio estuviera disponible para mi aplicación. Así que comencemos a agregar algo de código.


Agregar Duo a mi aplicación

Quiero reiterar que necesitarás compilar código del lado del servidor para que esto realmente funcione y Duo ha proporcionado una amplia gama de bibliotecas para que las uses.

El código que estoy escribiendo es CFML y usaré su componente ColdFusion que gestiona todas las complejidades de firmar y cifrar mi solicitud, así como verificar el valor de retorno de la API de 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, hará clic en un enlace para activar el servicio y pasará por un proceso para completar la información relevante para que las cosas funcionen. Esto generalmente implica proporcionar al servicio un número de teléfono celular y validar la configuración en función de un número único enviado a través de un mensaje de texto o una llamada telefónica. Duo puede ofrecer a los usuarios cualquiera de las opciones 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 observas la captura de pantalla a continuación, puedes ver cómo intenté replicar una pantalla de cuenta simple con un botón prominente debajo, como una llamada a la acción para activar la autenticación:

turn-onturn-onturn-on

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

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

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

Básicamente, está creando una solicitud encriptada basada en todas las claves para tu integración, la clave de aplicación única de 40 caracteres que creaste y el nombre de usuario único del usuario. El resultado final se parece a esto:

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


El IFRAME de Duo 

La firma se pasa al IFRAME de Duo, que gestiona 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 un IFRAME para proporcionar la interfaz de usuario para configurar los usuarios. Mirando el código a continuación, podemos ver el IFRAME, la referencia a la librería Duo JS y la llamada al método para inicializar todo:

La llamada al método es sencilla, tomando tres opciones:

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

Si estás confundido por esto, <cfoutput>#session.sigReq#</cfoutput>, no lo estés. Es solo la forma en que ColdFusion reemplaza una variable con su valor.

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

first-time-mobile

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 por mensaje de voz o de texto. Probé ambos y funcionaron igual de bien. Duo realiza la verificación por su parte para asegurarse de que el código que se ingresa sea válido.

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

install-duo-mobileinstall-duo-mobileinstall-duo-mobile

En realidad, esto es algo bueno porque tener la aplicación móvil permitirá al usuario obtener un código incluso si no tiene servicio celular.

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

first-time-mobile-successfirst-time-mobile-successfirst-time-mobile-success

A todos los efectos, todo este proceso está en manos de Duo; solo estás esperando la respuesta.

Esa respuesta determinará si el usuario se ha configurado correctamente y deberás usar el método verifyResponse() 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 hecho referencia como form.sig_response ya que así es como ColdFusion permite el acceso a las variables publicadas.

El método verifyResponse() tomará la respuesta firmada enviada por Duo y, si todo está bien, devolverá el nombre de usuario del usuario para que lo valides con tu base de datos. Entonces, en mi caso, esperaría que se devolviera "rogerwilcoroger@fakeemail.com". Una vez que lo he validado, configuro la marca en el registro de la base de datos del usuario que me permitiría saber que han optado por la autenticación de dos factores.

Eso es. Eso es todo lo que necesitas hacer para configurar a los usuarios para que activen la autenticación de dos factores. Ahora pasemos a la experiencia de inicio de sesión.


Iniciando sesión con Duo

Puedes esperar que suceda algo mágico a partir de aquí, pero curiosamente, casi puedes reutilizar el mismo código exacto creado para activar a un usuario para permitirle iniciar sesión. Me adelanté y creé una página de inicio de sesión muy básica:

login-pagelogin-pagelogin-page

La página en sí es solo un marcado HTML. La parte importante es determinar primero si el usuario ha optado por participar y eso sucede cuando valida su información de inicio de sesión normal en el sitio. Sí, aún debes realizar tu 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ías poder determinar si han optado por participar. Si no lo han hecho, entonces solo los autenticarás usando tu combinación normal de nombre de usuario y contraseña. Si es así, entonces vas a llamar al método signRequest(), 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 necesitamos aplicar la autenticación de dos factores si el usuario se ha registrado. Por eso es importante establecer la política adecuada para tu integración. Al establecer el mío en Requerir al registro y usar una marca de registro de base de datos, aún puedo permitir que el usuario acceda a mi sitio incluso si no ha optado por la autenticación de dos factores. Si el usuario ha optado por participar, se le pedirá que ingrese un código Duo para validar su cuenta.


Conclusión

Aumentar la seguridad del sitio web es siempre algo bueno. Deseas asegurarte de proteger a tus usuarios tanto como sea posible y el uso de la autenticación de dos factores es un gran paso en la dirección correcta.

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

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.