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 […]
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.
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.
Posterior a esto, entramos a la sección > API y Servicios > Credenciales > Crear Credenciales > ID de Cliente de 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
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.
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
$ git clone https://github.com/NIVEL4/voucher-docker-compose /srv/vouch
Cloning into '/srv/vouch'...
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 7 (delta 0), reused 7 (delta 0), pack-reused 0
Unpacking objects: 100% (7/7), done.
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
$ base64 -w 128 /dev/urandom | tr -d /+ | head -n 1 | tee /srv/vouch/config/secret
ffMIEHSJZ8rLzkt0fawNhzWMPoR43FKtPpUNee7M13zJvFrUy8GmpTKlHjZ00J3KOndS3YILDMzl8f12A9igGeAwXd43yUPHnsUZCZOw7wKlwgjZmLylGoJj5zKU
Realizados estos cambios, nuestro servicio vouch está listo para correr. Lo que podemos hacer con el siguiente comando, desde el directorio /srv/vouch
$:/srv/vouch# docker-compose up -d
Creating network "vouch_default" with the default driver
Creating vouch_vouch-proxy_1 ... done
$:/srv/vouch# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0d354132f51e voucher/vouch-proxy "/vouch-proxy" 40 seconds ago Up 40 seconds (health: starting) 127.0.0.1:9090->9090/tcp vouch_vouch-proxy_1
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.
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.
Una vulnerabilidad crítica en el Cisco Firepower Management Center (FMC) podría permitir que un atacante remoto omita la autenticación y ejecute acciones arbitrarias en los dispositivos afectados como administrador.
Hoy, 28 de enero, se celebra el día Internacional de la Protección de Datos Personales, tema que adquiere una gran relevancia dado el contexto global y la exposición en aumento que tenemos de nuestra información en Internet.