Cómo añadir autenticación básica a cualquier servicio con Traefik
- traefik
- autenticacion
- middleware
- seguridad
- docker
- infraestructura
Si tienes servicios web corriendo en tu VPS —ya sean paneles de administración, APIs internas o entornos de staging— y no quieres que estén accesibles para cualquiera, necesitas una capa de seguridad. La autenticación básica es un primer paso efectivo. Con Traefik, puedes implementar esta medida de seguridad de forma sencilla, usando un middleware que se interpone antes de que la petición llegue a tu aplicación.
Este método te permite proteger cualquier servicio Docker sin modificar una sola línea de código en tu aplicación. Es una solución de infraestructura que añado por defecto a todos los entornos que no están pensados para el público general.
Por qué una capa de autenticación básica es necesaria
Exponer servicios a internet sin ningún tipo de protección es un riesgo innecesario. Aunque tu aplicación tenga su propio sistema de login, una autenticación básica a nivel de proxy inverso añade una barrera extra. Esto es especialmente útil para herramientas como Portainer, Uptime Kuma o cualquier API que no debería ser pública.
Mi regla es simple: si un servicio no tiene que ser visto por un cliente final, le pongo autenticación básica. Esto reduce el ruido de bots y escaneos de vulnerabilidades, y te da un control de acceso inmediato.
Configuración del Middleware de Basic Auth en Traefik
Traefik utiliza “middlewares” para interceptar y procesar las peticiones antes de que lleguen a tu servicio. Para la autenticación básica, definimos un middleware basicAuth que requiere un usuario y una contraseña. La contraseña debe estar hasheada por seguridad.
Primero, genera la contraseña hasheada. Puedes usar htpasswd o un generador online. Por ejemplo:
echo $(htpasswd -nb usuario mi_contraseña)
Esto te devolverá una cadena como usuario:$apr1$........ Guarda esta cadena.
Ahora, añade la definición del middleware a tu docker-compose.yml para Traefik, o directamente en el archivo de configuración dinámica. En un setup con Docker, lo más práctico es hacerlo vía etiquetas en el servicio de Traefik:
version: '3.8'
services:
traefik:
image: traefik:v2.10
command:
- --api.dashboard=true
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --certificatesresolvers.myresolver.acme.tlschallenge=true
- [email protected]
- --certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json
ports:
- "80:80"
- "443:443"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "./letsencrypt:/letsencrypt"
labels:
# Dashboard de Traefik protegido con basic auth
- "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.tudominio.com`)"
- "traefik.http.routers.traefik-dashboard.entrypoints=websecure"
- "traefik.http.routers.traefik-dashboard.tls.certresolver=myresolver"
- "traefik.http.routers.traefik-dashboard.service=api@internal"
- "traefik.http.routers.traefik-dashboard.middlewares=auth-middleware@docker" # Aplicamos el middleware
- "traefik.http.middlewares.auth-middleware.basicauth.users=usuario:$$apr1$$....... # La contraseña hasheada aquí"
# ... otros servicios
Usa $$ para escapar el signo $ en la contraseña hasheada si la pones directamente en el docker-compose.yml. Si la tienes en una variable de entorno, solo necesitarás un $. Si quieres profundizar en cómo Traefik gestiona el enrutamiento y los certificados SSL, tengo un artículo sobre cómo configurar SSL con Let’s Encrypt en Traefik.
Aplicando el Middleware a un servicio Docker
Una vez que el middleware está definido, aplicarlo a cualquier servicio es tan sencillo como añadir una etiqueta. Por ejemplo, si tienes un servicio whoami que quieres proteger:
services:
# ... traefik service ...
whoami:
image: traefik/whoami
labels:
- "traefik.enable=true"
- "traefik.http.routers.whoami.rule=Host(`whoami.tudominio.com`)"
- "traefik.http.routers.whoami.entrypoints=websecure"
- "traefik.http.routers.whoami.tls.certresolver=myresolver"
- "traefik.http.routers.whoami.middlewares=auth-middleware@docker" # Aplicamos el middleware aquí
Con traefik.http.routers.whoami.middlewares=auth-middleware@docker, estamos indicando a Traefik que antes de enviar la petición al contenedor whoami, debe pasarla por el middleware auth-middleware que hemos definido. Esto hará que el navegador pida credenciales antes de mostrar el contenido del servicio. Si te interesa entender el porqué de esta arquitectura, explico por qué uso Docker y Traefik en mis proyectos.
Tradeoffs honestos
Lo que ganas:
- Seguridad rápida y efectiva: Una barrera de acceso inmediata para servicios que no deben ser públicos.
- Separación de preocupaciones: No modificas el código de tu aplicación para añadir esta capa de seguridad.
- Flexibilidad: Puedes aplicar el middleware a tantos servicios como necesites sin redefinirlo.
- Simplicidad: Ideal para entornos de desarrollo, staging o herramientas internas donde la seguridad no necesita ser de nivel empresarial.
Lo que complicas:
- Gestión de credenciales: Si tienes muchos usuarios, gestionar las contraseñas hasheadas puede volverse tedioso. No es un sistema de gestión de usuarios completo.
- No es para alta seguridad: La autenticación básica envía las credenciales en cada petición (aunque codificadas en Base64 y encriptadas si usas HTTPS). No es un reemplazo para sistemas de autenticación basados en tokens o SSO para aplicaciones de cara al público.
Esta solución es robusta para su propósito. Si la necesidad va más allá de un simple basic auth, deberías considerar opciones más avanzadas como Cloudflare Access o un sistema OAuth.
Implementar la autenticación básica con Traefik es una configuración que mejora la seguridad de tu infraestructura. Si te estás planteando cómo gestionar tus servicios, quizás te interese una comparativa entre Nginx y Traefik como reverse proxy. Para una seguridad más completa en tu VPS, también necesitas una configuración de iptables segura para controlar el tráfico a nivel de red.
Técnico freelance especializado en desarrollo a medida, automatizaciones con IA y gestión técnica para negocios en España. Más sobre mí →
¿Necesitas que alguien se ocupe de tu web?
Me encargo de que tu web funcione, esté segura y actualizada. Backups, actualizaciones y soporte directo. Planes desde 49 €/mes.