Authelia Docker Compose: Protege tus Aplicaciones con 2FA y SSO 2025

Authelia Docker Compose: Sistema de autenticación 2FA y SSO para aplicaciones self-hosted

Authelia Docker Compose es la solución definitiva para añadir autenticación de dos factores (2FA) y inicio de sesión único (SSO) a todas tus aplicaciones self-hosted. Si gestionas múltiples servicios con Docker y necesitas una capa de seguridad profesional sin complicaciones, este sistema de autenticación open-source te permite proteger Nextcloud, Grafana, Portainer y cualquier aplicación web en minutos.

¿Qué es Authelia Docker Compose y por qué lo necesitas?

Authelia es un servidor de autenticación y autorización de código abierto que actúa como portal de seguridad frente a tus aplicaciones. Con más de 26,000 estrellas en GitHub, esta solución ligera (menos de 20MB comprimida) escrita en Go ofrece autenticación multifactor, control de acceso granular y compatibilidad con los principales proxies inversos como Traefik, Nginx y Caddy.

La principal ventaja de implementar Authelia Docker Compose es que centraliza la seguridad de todas tus aplicaciones en un único punto de control. En lugar de configurar autenticación individual para cada servicio, tus usuarios se autentican una vez y acceden a todos los recursos autorizados mediante sesiones cifradas.

Características principales de Authelia

Este sistema de gestión de identidad y acceso (IAM) destaca por su equilibrio entre seguridad robusta y bajo consumo de recursos:

  • Múltiples métodos de autenticación: Passkeys sin contraseña, códigos OTP basados en tiempo (TOTP), notificaciones push móviles, claves de seguridad WebAuthn (YubiKey, Google Titan) y autenticación tradicional
  • OpenID Connect 1.0 certificado: Integración nativa con aplicaciones modernas mediante OAuth 2.0, compatible con protocolos estándar
  • Políticas de acceso granulares: Define reglas específicas por subdominio, usuario, grupo, URI, método HTTP y red de origen
  • Alta disponibilidad: Arquitectura escalable con soporte para PostgreSQL/MySQL y Redis, preparada para entornos Kubernetes
  • Prevención de fuerza bruta: Límites configurables de intentos fallidos con bloqueo temporal automático
  • Reset de contraseñas seguro: Sistema de verificación por email con tokens JWT firmados

El rendimiento es excepcional: las políticas de autorización se procesan en milisegundos, mientras el consumo de memoria ronda los 30MB en ejecución normal. Consulta la documentación oficial para casos de uso avanzados.

Requisitos previos para Authelia Docker Compose

Antes de comenzar la instalación, asegúrate de cumplir estos requisitos técnicos imprescindibles:

  • Docker y Docker Compose instalados (versión 20.10 o superior recomendada)
  • Proxy inverso configurado con certificados SSL válidos (Traefik, Nginx Proxy Manager o Caddy)
  • Dominio propio con DNS configurado apuntando a tu servidor
  • HTTPS obligatorio: La aplicación rechaza conexiones HTTP por diseño de seguridad
  • Servidor SMTP para notificaciones por email (Gmail, SendGrid, Mailgun o servidor propio)
  • Base de datos (opcional pero recomendado): PostgreSQL o MySQL para entornos de producción

Para entornos de prueba puedes usar SQLite3 y certificados autofirmados, pero la producción exige HTTPS real con certificados de Let’s Encrypt.

Configuración completa de Authelia Docker Compose

A continuación encontrarás una configuración funcional lista para producción. Este stack de Authelia Docker Compose incluye el servicio principal con Redis para sesiones y un volumen persistente para la base de datos SQLite:

version: '3.8'

services:
  authelia:
    image: authelia/authelia:latest
    container_name: authelia
    volumes:
      - ./authelia:/config
    environment:
      - TZ=Europe/Madrid
      - AUTHELIA_JWT_SECRET_FILE=/config/secrets/jwt_secret
      - AUTHELIA_SESSION_SECRET_FILE=/config/secrets/session_secret
      - AUTHELIA_STORAGE_ENCRYPTION_KEY_FILE=/config/secrets/storage_encryption_key
    ports:
      - '9091:9091'
    restart: unless-stopped
    networks:
      - proxy
    depends_on:
      - redis
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.authelia.rule=Host(`auth.tudominio.com`)"
      - "traefik.http.routers.authelia.entrypoints=websecure"
      - "traefik.http.routers.authelia.tls.certresolver=letsencrypt"
      - "traefik.http.services.authelia.loadbalancer.server.port=9091"

  redis:
    image: redis:alpine
    container_name: authelia-redis
    volumes:
      - ./redis:/data
    restart: unless-stopped
    networks:
      - proxy
    command: redis-server --save 60 1 --loglevel warning

networks:
  proxy:
    external: true

Este docker-compose.yml asume que tienes Traefik funcionando en la red proxy. Si usas Nginx Proxy Manager o Caddy, elimina las labels de Traefik y configura el proxy manualmente apuntando a authelia:9091.

Archivo de configuración esencial para Authelia Docker Compose

Crea el directorio de configuración y los secretos necesarios:

mkdir -p authelia/secrets
openssl rand -hex 32 > authelia/secrets/jwt_secret
openssl rand -hex 32 > authelia/secrets/session_secret
openssl rand -hex 32 > authelia/secrets/storage_encryption_key
chmod 600 authelia/secrets/*

Ahora crea authelia/configuration.yml con esta estructura base:

---
server:
  address: 'tcp://0.0.0.0:9091'
  buffers:
    read: 4096
    write: 4096

log:
  level: info
  format: text

theme: dark

authentication_backend:
  file:
    path: /config/users_database.yml
    password:
      algorithm: argon2
      argon2:
        variant: argon2id
        iterations: 3
        memory: 65536
        parallelism: 4
        key_length: 32
        salt_length: 16

access_control:
  default_policy: deny
  rules:
    - domain: "*.tudominio.com"
      policy: one_factor
    - domain: "admin.tudominio.com"
      policy: two_factor

session:
  secret: !secret
  cookies:
    - domain: 'tudominio.com'
      authelia_url: 'https://auth.tudominio.com'
      default_redirection_url: 'https://tudominio.com'
  redis:
    host: redis
    port: 6379

regulation:
  max_retries: 5
  find_time: '2m'
  ban_time: '10m'

storage:
  encryption_key: !secret
  local:
    path: /config/db.sqlite3

notifier:
  smtp:
    address: 'smtp.gmail.com:587'
    username: '[email protected]'
    password: 'tu-app-password'
    sender: 'Authelia <[email protected]>'
    subject: '[Authelia] {title}'

Reemplaza tudominio.com con tu dominio real y configura las credenciales SMTP. Para Gmail, necesitas una contraseña de aplicación específica.

Crear usuarios y gestionar credenciales

Para el backend de archivos, crea authelia/users_database.yml con tus usuarios iniciales:

users:
  admin:
    disabled: false
    displayname: "Administrador"
    password: "$argon2id$v=19$m=65536,t=3,p=4$..."
    email: [email protected]
    groups:
      - admins
      - developers

  usuario:
    disabled: false
    displayname: "Usuario Normal"
    password: "$argon2id$v=19$m=65536,t=3,p=4$..."
    email: [email protected]
    groups:
      - users

Para generar el hash de contraseña seguro con Authelia Docker Compose, ejecuta dentro del contenedor:

docker exec -it authelia authelia crypto hash generate argon2 --password 'TuContraseñaSegura'

Copia el hash generado y pégalo en el campo password de cada usuario. Este método garantiza que las contraseñas nunca se almacenan en texto plano.

Integración de Authelia Docker Compose con proxies inversos

La potencia del sistema radica en su integración transparente con tu proxy. Aquí ejemplos para los tres más usados con Authelia Docker Compose:

Traefik

Añade estos middlewares en tu archivo de configuración dinámica de Traefik:

http:
  middlewares:
    authelia:
      forwardAuth:
        address: "http://authelia:9091/api/authz/forward-auth"
        trustForwardHeader: true
        authResponseHeaders:
          - "Remote-User"
          - "Remote-Groups"
          - "Remote-Name"
          - "Remote-Email"

Luego aplica el middleware a cualquier servicio añadiendo el label:
traefik.http.routers.tu-servicio.middlewares=authelia@file

Nginx Proxy Manager

En la pestaña «Advanced» de cada proxy host, añade:

location /authelia {
    internal;
    set $upstream_authelia http://authelia:9091/api/authz/forward-auth;
    proxy_pass $upstream_authelia;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;
    proxy_pass_request_body off;
    proxy_set_header Content-Length "";
}

auth_request /authelia;
auth_request_set $user $upstream_http_remote_user;
auth_request_set $groups $upstream_http_remote_groups;
proxy_set_header Remote-User $user;
proxy_set_header Remote-Groups $groups;

Caddy

Instala el módulo forward_auth y añade en tu Caddyfile:

app.tudominio.com {
    forward_auth authelia:9091 {
        uri /api/authz/forward-auth
        copy_headers Remote-User Remote-Groups Remote-Name Remote-Email
    }
    reverse_proxy tu-aplicacion:puerto
}

Configurar autenticación de dos factores (2FA)

Una vez desplegado Authelia Docker Compose, accede a https://auth.tudominio.com e inicia sesión con tus credenciales. El portal te guiará para configurar tu segundo factor:

  1. TOTP (Time-based One-Time Password): Escanea el código QR con Google Authenticator, Authy o 1Password. Introduce el código de 6 dígitos para confirmar
  2. WebAuthn (claves de seguridad): Conecta tu YubiKey, Google Titan o usa el Face ID/Touch ID de tu dispositivo como passkey sin contraseña
  3. Notificaciones push: Configura Duo Mobile (requiere cuenta en Duo Security) para aprobaciones con un toque

Recomiendo TOTP como método universal y WebAuthn para máxima seguridad. Puedes habilitar múltiples métodos simultáneamente, y los usuarios eligen su favorito al autenticarse.

Políticas de acceso avanzadas con Authelia Docker Compose

El verdadero poder de Authelia Docker Compose se revela al definir políticas granulares en configuration.yml. Ejemplos prácticos:

access_control:
  default_policy: deny
  networks:
    - name: internal
      networks:
        - '192.168.1.0/24'
        - '10.0.0.0/8'
  
  rules:
    # Admin panel requiere 2FA siempre
    - domain: 
        - "portainer.tudominio.com"
        - "grafana.tudominio.com"
      policy: two_factor
      subject:
        - "group:admins"
    
    # Servicios públicos solo necesitan login
    - domain: "*.tudominio.com"
      policy: one_factor
    
    # Acceso desde red local sin autenticación
    - domain: "*.tudominio.com"
      policy: bypass
      networks:
        - internal
    
    # API endpoints permiten bearer tokens
    - domain: "api.tudominio.com"
      policy: one_factor
      resources:
        - "^/api/.*$"

Estas reglas se evalúan en orden. La primera coincidencia determina la acción. Combina dominios, subdominios, grupos de usuarios, redes origen y patrones de URI para control total.

Migrar de SQLite a PostgreSQL para producción

Para entornos de alta disponibilidad, reemplaza SQLite por PostgreSQL añadiendo este servicio al compose:

  postgres:
    image: postgres:16-alpine
    container_name: authelia-postgres
    environment:
      POSTGRES_DB: authelia
      POSTGRES_USER: authelia
      POSTGRES_PASSWORD: password-seguro-aqui
    volumes:
      - ./postgres:/var/lib/postgresql/data
    restart: unless-stopped
    networks:
      - proxy

Y modifica la sección storage en configuration.yml:

storage:
  encryption_key: !secret
  postgres:
    address: 'tcp://postgres:5432'
    database: authelia
    username: authelia
    password: password-seguro-aqui

PostgreSQL permite ejecutar múltiples réplicas del servidor con balanceo de carga, ideal para clusters Kubernetes o entornos Docker Swarm.

Solución de problemas comunes en Authelia Docker Compose

Estos son los errores más frecuentes al implementar Authelia Docker Compose y sus soluciones:

  • «Unable to contact authentication backend»: Verifica que users_database.yml tenga permisos correctos (chmod 644) y formato YAML válido
  • Bucle de redirección infinito: Revisa que el proxy envíe correctamente los headers X-Forwarded-Proto y X-Forwarded-Host. Traefik los añade automáticamente
  • Session no persiste: Asegúrate que Redis esté funcionando y accesible en la red. Comprueba con docker exec -it authelia-redis redis-cli PING
  • Emails no llegan: Prueba la configuración SMTP con docker logs authelia. Para Gmail, verifica que IMAP esté activo y uses una App Password
  • Proxy devuelve 502: El contenedor no está listo. Espera 10-15 segundos tras el inicio y revisa logs con docker logs authelia -f

Activa el nivel de log debug temporalmente para diagnóstico detallado de problemas de integración con aplicaciones.

Mejores prácticas de seguridad

Implementa estas recomendaciones para maximizar la protección de tu despliegue:

  • Secretos en archivos separados: Nunca hardcodees JWT secrets en configuration.yml. Usa siempre archivos en /config/secrets/
  • Limita intentos de login: Configura regulation con max_retries: 5 y ban_time: 15m mínimo
  • Habilita HTTPS estricto: Añade header Strict-Transport-Security en tu proxy con valor max-age=31536000; includeSubDomains
  • Audita logs regularmente: Exporta logs a un sistema centralizado como Loki o Elasticsearch para detectar patrones de acceso anormales
  • Actualiza frecuentemente: Authelia lanza parches de seguridad regularmente. Usa watchtower o actualiza manualmente cada mes
  • Backup de configuración: Respalda authelia/ completo, especialmente db.sqlite3 y los secrets

Para entornos críticos, considera implementar fail2ban monitorizando los logs para banear IPs con múltiples intentos fallidos a nivel de firewall.

Preguntas frecuentes (FAQ)

¿Puedo usar Authelia Docker Compose con aplicaciones que no soportan OAuth/OIDC?

Sí, mediante forward authentication. El proxy intercepta las solicitudes antes de llegar a la aplicación, validando la sesión sin que la aplicación necesite soporte específico para OAuth. Funciona con cualquier servicio web HTTP/HTTPS.

¿Cuántos usuarios puedo gestionar con el backend de archivos?

El backend de archivos es práctico hasta 50-100 usuarios. Para organizaciones mayores, integra LDAP con OpenLDAP, FreeIPA o Active Directory para gestión centralizada de identidades.

¿Es compatible Authelia Docker Compose con aplicaciones móviles?

Sí, si la aplicación móvil usa navegador web interno. Para apps nativas que usan APIs, implementa OAuth 2.0 con el provider OpenID Connect incluido, que soporta flujos de autorización estándar.

¿Puedo ejecutar múltiples instancias para alta disponibilidad?

Absolutamente. Usando PostgreSQL/MySQL como storage y Redis como session provider, puedes escalar horizontalmente con balanceador delante. Cada instancia comparte estado mediante la base de datos.

¿Qué ventajas tiene Authelia Docker Compose sobre soluciones comerciales como Auth0?

Control total sobre tus datos de autenticación, cero costes recurrentes por usuario, despliegue on-premise sin dependencias cloud, y personalización ilimitada del flujo de autenticación. Ideal para cumplimiento GDPR estricto.

Conclusión

Authelia Docker Compose representa la solución más completa para añadir autenticación profesional a tu infraestructura self-hosted. Con su arquitectura ligera, compatibilidad universal con proxies, y soporte para los estándares modernos de autenticación, transforma un conjunto de aplicaciones individuales en un ecosistema unificado y seguro.

La inversión inicial de 30 minutos en configuración te recompensa con autenticación centralizada, 2FA robusto, y control de acceso granular para todos tus servicios. Ya sea que gestiones un homelab personal o una infraestructura empresarial, Authelia Docker Compose escala contigo sin comprometer seguridad ni rendimiento.

Para más información sobre gestión de contenedores y stacks de Docker Compose, explora otros artículos en nuestra categoría docker-compose.

Avatar

Por Mid

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x