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:

  1. El navegador solicita app.ejemplo.com.
  2. Traefik intercepta y llama al endpoint ForwardAuth en auth.ejemplo.com/api/authz/forward-auth.
  3. Authelia comprueba la cookie de sesión, aplica reglas de control de acceso y devuelve 200 OK o 401 Unauthorized.
  4. En caso de 401, Traefik redirige al usuario al portal de login de Authelia.
  5. 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.

CampoDescripciónEjemplo
domainDominio(s) con comodín"*.ejemplo.com"
resourcesRegex de ruta URL["^/api/.*"]
subjectUsuario o grupo"group:admins"
networksBloques CIDR["10.0.0.0/8"]
policyAcciónone_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ísticaAutheliaAuthentikKeycloakVouch ProxyOAuth2 Proxy
2FA/MFATOTP, WebAuthn, DuoTOTP, WebAuthn, DuoTOTP, WebAuthnSegún IdPSegún IdP
Proveedor OIDCSí (v4.34+)Sí (IdP completo)Sí (enterprise)NoNo
LDAP/ADNoNo
RAM~50 MB~300 MB~512 MB~10 MB~10 MB
ComplejidadBaja-MediaMediaAltaBajaBaja

Solución de Problemas

ProblemaSolución
Bucle 401 tras el loginVerifica que session.domain coincida con el dominio de cookie de todos los servicios protegidos
Email de registro 2FA no recibidoPrueba SMTP con startup_check_address; revisa logs del notifier
Registro WebAuthn fallaAsegura HTTPS activo; el RP ID debe coincidir exactamente con el dominio de sesión
Auth LDAP fallaActiva log.level: debug; verifica credenciales del bind DN y base DN
Regulación bloqueando usuarios legítimosRevisa 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.

Artículos Relacionados