Cómo usar OAuth2 para proteger recursos HTTP

Durante mucho tiempo se ha acostumbrado a utilizar htpasswd para lograr autenticación básica de recursos HTTP, por ejemplo cuando queremos proteger un proyecto que aún se encuentra en etapas de desarrollo.

Esta práctica actualmente se considera insegura por OWASP, quienes indican que debido a sus características, como la incapacidad de Cerrar Sesión, no debe ser utilizada en aplicaciones.

Por tanto, buscando alternativas para resolver este caso de uso, llegamos al proyecto vouch-proxy, que permite implementar un SSO, o Single Sign-on, para Nginx.

Un servicio Single Sign-on, o Inicio de Sesión Única, permite crear un punto de conexión con otros servicios que permiten acceso OAuth2, como por ejemplo Google, Github y OpenID, y así poder permitir acceso a recursos utilizando las credenciales de estos servicios.

En esta guía explicaremos cómo levantar una máquina que servirá de SSO para nuestro dominio, y lo conectaremos a Google for Business para autentificar recursos usando las cuentas existentes que provee el servicio.

En nuestros ejemplos usaremos el dominio example.com, y nuestro SSO estara alojado en login.example.com

Asumiremos que ya posees conocimientos básicos de los siguientes temas:

Empezamos con una instancia de Linux (en nuestro caso Debian), configurada con un dominio para nuestro servidor SSO login.example.com, e instalamos nginx, docker y docker-compose y luego, aseguramos nuestro dominio login.example.com con SSL usando Letencrypt u otro.

Una vez configurada la instancia, necesitamos obtener los Tokens OAuth2 desde la Consola de Desarrolladores de Google. *Importante: es necesario contar con acceso de Super Administrador para crear las llaves en una cuenta Google for Business

Primero, debemos crear un proyecto en la Consola de Google.

Crear proyecto en la consola de Google

Y luego, dentro del proyecto vamos a la sección > API y Servicios > Pantalla de Consentimiento de OAuth donde configuraremos la forma en que los usuarios verán nuestra solicitud de autenticación, junto con otros parámetros clave para nuestro servicio.

Configurar pantalla de consentimiento de Google OAuth
  • Tipo de Aplicación: Publico si queremos acceso a nuestros servicios desde cualquier cuenta, o Privado si es que queremos acceso limitado solo para usuarios de nuestro dominio.
  • Nombre de la aplicación
  • Logotipo de la aplicación
  • Dominios autorizados: dominio donde alojaras tu servicio
  • Vínculo a la página principal de la aplicación
  • Vínculo a la Política de Privacidad de la aplicación

Posterior a esto, entramos a la sección > API y Servicios > Credenciales > Crear Credenciales > ID de Cliente de OAuth

Crear un nuevo ID de Cliente OAuth

Elegimos tipo Aplicación Web, llenamos con el nombre y las direcciones del servidor de autenticación https://login.example.com, y la URL de redirección https://login.example.com/auth

Crear ID de Cliente OAuth

Luego, Google nos entregará la información que necesitamos para continuar, el ID de Cliente y la llave secreta del mismo. Recuerda no compartir esta llave con nadie.

Obtener llaves de cliente

Una vez completada la creación del acceso OAuth es posible continuar con la instalación y configuración de Vouch y Nginx. Para esto, hemos dispuesto un repositorio con los archivos de ejemplo para que puedas levantar el servicio Vouch fácil y rápido!

El repositorio se encuentra disponible en: https://github.com/NIVEL4/voucher-docker-compose

Puedes clonarlo directamente en el directorio de tu preferencia, para este ejemplo usaremos /srv/vouch

Y posterior a esto editamos los dos archivos en la carpeta config/

Primero, el archivo config/config.yml donde especificaremos nuestro client_id y client_secret que obtuvimos en el proceso de creación en Google. Además, debemos ajustar las referencias al dominio example.com con el dominio que ustedes configuraron, estas son domains, callback_urls y preferredDomain.

Y luego, modificamos el archivo config/secret donde debemos llenar con un string largo y aleatorio. Lo podemos hacer automáticamente con el siguiente comando

Realizados estos cambios, nuestro servicio vouch está listo para correr. Lo que podemos hacer con el siguiente comando, desde el directorio /srv/vouch

Si todo salió bien, nuestro servicio estará corriendo en el puerto 9090 de localhost, y solo podrá ser accedido desde la misma máquina.

Y para finalizar la integración, debemos configurar nuestro Nginx, con el dominio login.example.com, y luego proteger los sitios que queramos con nuestra instalación de vouch.

Para esto, hemos puesto algunos ejemplos en la carpeta nginx-config-examples del repositorio en github. Estos son login.example.com.conf y protected.example.com.conf. El primero, expone el dominio que aloja vouch hacia internet, y el segundo es un sitio protegido de ejemplo.

Si hemos configurado correctamente nginx, cuando queramos acceder a protected.example.com, este mostrará nuestra pantalla de Login, y una vez completada la autentificación, tendremos acceso a nuestro sitio protegido.

Login con Google OAuth de ejemplo

De esta manera hemos logrado proteger recursos utilizando autentificación OAuth2 para acceder a ellos. Siguiendo esta guía podrás implementar vouch para cualquier otro proveedor de OAuth2 también, como cualquiera en esta lista.