TL;DR — Resumen Rápido
Despliega Authelia como proxy SSO y 2FA. Cubre Docker Compose, Traefik, TOTP, WebAuthn, backends LDAP y configuración de proveedor OpenID Connect.
Authelia es un portal de autenticación open-source que funciona como companion de forward-auth para tu reverse proxy. En lugar de añadir formularios de login a cada servicio autoalojado, Authelia intercepta cada petición, valida la sesión y aplica políticas de 2FA desde un único portal. Esta guía cubre un despliegue completo en producción con Docker Compose, Traefik, TOTP y un proveedor OpenID Connect.
Requisitos Previos
- Docker y Docker Compose v2 en un host Linux.
- Traefik v2/v3 configurado (o Nginx/Caddy — se incluyen notas de integración).
- Un dominio con DNS apuntando a tu servidor (Authelia requiere un dominio real para las cookies).
- Conocimientos básicos de YAML y redes de contenedores.
Arquitectura de Authelia
El flujo de una petición es:
- El navegador solicita
app.ejemplo.com. - Traefik intercepta y llama al endpoint ForwardAuth en
auth.ejemplo.com/api/authz/forward-auth. - Authelia comprueba la cookie de sesión, aplica reglas de control de acceso y devuelve
200 OKo401 Unauthorized. - En caso de 401, Traefik redirige al usuario al portal de login de Authelia.
- El usuario se autentica (contraseña + 2FA), recibe una cookie de sesión firmada y es redirigido de vuelta.
Componentes clave:
- Portal de autenticación — UI de login servida en el subdominio de Authelia.
- Almacén de sesiones — Redis para despliegues distribuidos/HA; en memoria para nodo único.
- Backend de almacenamiento — SQLite (nodo único) o PostgreSQL/MySQL para HA.
- Motor de políticas — Reglas de control de acceso evaluadas de arriba a abajo.
Paso 1: Stack de Docker Compose
Crea /opt/authelia/docker-compose.yml:
version: "3.9"
networks:
proxy:
external: true
services:
authelia:
image: authelia/authelia:latest
container_name: authelia
restart: unless-stopped
volumes:
- ./config:/config
environment:
- AUTHELIA_JWT_SECRET_FILE=/config/secrets/jwt_secret
- AUTHELIA_SESSION_SECRET_FILE=/config/secrets/session_secret
- AUTHELIA_STORAGE_ENCRYPTION_KEY_FILE=/config/secrets/storage_key
networks:
- proxy
labels:
- "traefik.enable=true"
- "traefik.http.routers.authelia.rule=Host(`auth.ejemplo.com`)"
- "traefik.http.routers.authelia.entrypoints=websecure"
- "traefik.http.middlewares.authelia.forwardauth.address=http://authelia:9091/api/authz/forward-auth"
- "traefik.http.middlewares.authelia.forwardauth.trustForwardHeader=true"
- "traefik.http.middlewares.authelia.forwardauth.authResponseHeaders=Remote-User,Remote-Groups,Remote-Name,Remote-Email"
redis:
image: redis:7-alpine
container_name: authelia-redis
restart: unless-stopped
networks:
- proxy
volumes:
- redis-data:/data
volumes:
redis-data:
Genera los secretos:
mkdir -p /opt/authelia/config/secrets
tr -dc 'A-Za-z0-9' </dev/urandom | head -c 64 > /opt/authelia/config/secrets/jwt_secret
tr -dc 'A-Za-z0-9' </dev/urandom | head -c 64 > /opt/authelia/config/secrets/session_secret
tr -dc 'A-Za-z0-9' </dev/urandom | head -c 64 > /opt/authelia/config/secrets/storage_key
Paso 2: Configuración Principal
Crea /opt/authelia/config/configuration.yml:
server:
host: 0.0.0.0
port: 9091
log:
level: info
totp:
issuer: ejemplo.com
period: 30
skew: 1
authentication_backend:
file:
path: /config/users.yml
password:
algorithm: argon2id
iterations: 3
memory: 65536
parallelism: 4
access_control:
default_policy: deny
rules:
- domain: "auth.ejemplo.com"
policy: bypass
- domain: "*.ejemplo.com"
subject: "group:admins"
policy: two_factor
- domain: "interno.ejemplo.com"
networks:
- 192.168.1.0/24
policy: one_factor
session:
name: authelia_session
domain: ejemplo.com
expiration: 1h
inactivity: 5m
remember_me: 1M
redis:
host: redis
port: 6379
regulation:
max_retries: 5
find_time: 2m
ban_time: 10m
storage:
local:
path: /config/db.sqlite3
notifier:
smtp:
host: smtp.ejemplo.com
port: 587
username: noreply@ejemplo.com
password: tupassword
sender: "Authelia <noreply@ejemplo.com>"
Paso 3: Backends de Autenticación
Basado en Archivo (users.yml)
users:
juan:
displayname: "Juan García"
password: "$argon2id$v=19$m=65536,t=3,p=4$..."
email: juan@ejemplo.com
groups:
- admins
- users
Genera hashes argon2:
docker run authelia/authelia:latest authelia crypto hash generate argon2 --password 'tupassword'
Backend LDAP / Active Directory
authentication_backend:
ldap:
address: ldap://ldap.ejemplo.com:389
implementation: activedirectory
base_dn: dc=ejemplo,dc=com
username_attribute: sAMAccountName
users_filter: "(&({username_attribute}={input})(objectClass=person))"
groups_filter: "(member={dn})"
user: cn=authelia,ou=CuentasServicio,dc=ejemplo,dc=com
password: ldappassword
Paso 4: Control de Acceso
Las reglas se evalúan de arriba a abajo; gana la primera coincidencia.
| Campo | Descripción | Ejemplo |
|---|---|---|
domain | Dominio(s) con comodín | "*.ejemplo.com" |
resources | Regex de ruta URL | ["^/api/.*"] |
subject | Usuario o grupo | "group:admins" |
networks | Bloques CIDR | ["10.0.0.0/8"] |
policy | Acción | one_factor, two_factor, bypass, deny |
Paso 5: Métodos de Doble Factor
TOTP
Los usuarios se registran en el portal de Authelia. Compatible con Google Authenticator, Authy y cualquier app TOTP.
WebAuthn / Passkeys FIDO2
Soportado en todos los navegadores modernos. Los usuarios registran una llave hardware (YubiKey) o autenticador de plataforma (Face ID, Windows Hello).
Duo Push
duo_api:
hostname: api-XXXXXXXX.duosecurity.com
integration_key: DIXXXXXXXXXXXXXXXXXX
secret_key: tu_secreto_duo
Paso 6: Proveedor OpenID Connect
identity_providers:
oidc:
hmac_secret: un_secreto_aleatorio_de_al_menos_32_chars
clients:
- id: grafana
secret: "$argon2id$v=19$..."
authorization_policy: two_factor
redirect_uris:
- "https://grafana.ejemplo.com/login/generic_oauth"
scopes:
- openid
- profile
- email
- groups
pkce_challenge_method: S256
Authelia vs Alternativas
| Característica | Authelia | Authentik | Keycloak | Vouch Proxy | OAuth2 Proxy |
|---|---|---|---|---|---|
| 2FA/MFA | TOTP, WebAuthn, Duo | TOTP, WebAuthn, Duo | TOTP, WebAuthn | Según IdP | Según IdP |
| Proveedor OIDC | Sí (v4.34+) | Sí (IdP completo) | Sí (enterprise) | No | No |
| LDAP/AD | Sí | Sí | Sí | No | No |
| RAM | ~50 MB | ~300 MB | ~512 MB | ~10 MB | ~10 MB |
| Complejidad | Baja-Media | Media | Alta | Baja | Baja |
Solución de Problemas
| Problema | Solución |
|---|---|
| Bucle 401 tras el login | Verifica que session.domain coincida con el dominio de cookie de todos los servicios protegidos |
| Email de registro 2FA no recibido | Prueba SMTP con startup_check_address; revisa logs del notifier |
| Registro WebAuthn falla | Asegura HTTPS activo; el RP ID debe coincidir exactamente con el dominio de sesión |
| Auth LDAP falla | Activa log.level: debug; verifica credenciales del bind DN y base DN |
| Regulación bloqueando usuarios legítimos | Revisa regulation.find_time; aumenta max_retries si hay IPs compartidas |
Resumen
- Authelia es un proxy SSO + 2FA ligero con motor de políticas integrado.
- El patrón forward-auth permite que cualquier reverse proxy aplique autenticación sin tocar las apps upstream.
- TOTP, WebAuthn y Duo ofrecen opciones flexibles de 2FA.
- El proveedor OIDC permite a Authelia actuar como IdP completo para apps OAuth2.
- La regulación proporciona protección contra fuerza bruta de forma nativa.