Authelia + LLDAP: SSO y Gestión de Usuarios para tu Homelab (Guía Completa 2025)
—📋 TL;DR (Resumen Ejecutivo)
En este tutorial aprenderás a implementar autenticación centralizada (SSO) y gestión de usuarios en tu homelab usando Authelia y LLDAP. Olvídate de gestionar credenciales en cada servicio: con esta guía, configurarás autenticación de dos factores (2FA), control de acceso granular y gestión de usuarios desde una interfaz web moderna.
Lo que conseguirás:
- ✅ SSO unificado para todos tus servicios (Jellyfin, Nextcloud, Portainer, etc.)
- ✅ Autenticación 2FA con TOTP (Google Authenticator) y WebAuthn (YubiKey)
- ✅ LDAP ligero con interfaz web (sin archivos LDIF complicados)
- ✅ Control de acceso por usuario, grupo, dominio o ruta
- ✅ Docker Compose completo listo para copy-paste
Tiempo de lectura: ~18 minutos | Nivel: Intermedio
—📚 Tabla de Contenidos
- ¿Qué es SSO y Por Qué Lo Necesitas?
- Authelia vs Authentik vs Keycloak
- LLDAP: El LDAP Que No Odiars
- Instalación Paso a Paso
- Integración con Nginx/Traefik
- Configurar 2FA (TOTP y WebAuthn)
- Control de Acceso por Grupos
- Troubleshooting Errores Comunes
- Preguntas Frecuentes
- Recursos y Ejemplos Descargables
> 📅 Última actualización: Noviembre 2025
> ✅ Verificado con: Authelia 4.38 + LLDAP 0.5 + Docker 25.0
> 🔄 Próxima revisión: Febrero 2026
—Introducción
Problema que resuelve:
¿Cansado de gestionar 15 contraseñas diferentes para tus servicios de homelab? ¿Tu familia no puede recordar las credenciales de Jellyfin, Nextcloud y Home Assistant? ¿Quieres implementar 2FA pero configurarlo en cada app es un infierno?
La solución:
Authelia es un portal de autenticación open-source que actúa como guardián centralizado de tu homelab. Intercepta todas las peticiones a tus servicios y verifica que el usuario esté autenticado antes de permitir acceso. Si no está logueado, lo redirige a una página de login elegante con soporte para autenticación de dos factores.
LLDAP, por su parte, es un servidor LDAP ultraligero (~50MB RAM) con interfaz web moderna. A diferencia de OpenLDAP (complejo y tedioso), LLDAP te permite gestionar usuarios y grupos desde el navegador sin tocar archivos LDIF.
Juntos forman el stack SSO perfecto para homelabs:
- Authelia = Portal de autenticación (frontend)
- LLDAP = Base de datos de usuarios (backend)
- Nginx/Traefik = Reverse proxy (middleware)
En esta guía completa aprenderás:
- Cómo instalar Authelia + LLDAP con Docker en 15 minutos
- Configurar forward authentication para proteger cualquier servicio
- Implementar 2FA con Google Authenticator y YubiKey
- Crear políticas de acceso por grupo (admins, users, readonly)
- Integrar con Nginx Proxy Manager y Traefik
- Solucionar los 5 errores más comunes (con ejemplos reales)
Ya seas sysadmin, entusiasta de homelabs o DevOps, esta guía te dará una solución SSO profesional sin pagar por servicios cloud.

¿Qué es SSO y Por Qué Lo Necesitas? {#que-es-sso}
Single Sign-On: El Santo Grial de la Autenticación
SSO (Single Sign-On) significa «iniciar sesión una vez, acceder a todo». Es el mismo sistema que usa Google: te logueas en Gmail y automáticamente tienes acceso a YouTube, Drive, Calendar y demás servicios.
En tu homelab funciona así:
- Usuario intenta acceder a
jellyfin.homelab.local - Nginx detecta que no está autenticado y redirige a
auth.homelab.local - Usuario introduce username + password + código 2FA
- Authelia valida credenciales contra LLDAP
- Si es correcto, establece cookie de sesión
- Usuario es redirigido a Jellyfin con acceso autorizado
- Durante la próxima hora, puede acceder a Nextcloud, Portainer, Gitea, etc. sin volver a loguearse
Beneficios en homelab:
- ✅ Una sola contraseña para recordar (en lugar de 10-20)
- ✅ 2FA centralizado (configuras una vez, aplica a todo)
- ✅ Gestión simplificada de usuarios (creas un usuario, tiene acceso a lo que determines)
- ✅ Control granular: Puedes dar acceso a
jellyfin.homelab.localpero bloquearportainer.homelab.local - ✅ Logs centralizados: Un solo lugar para auditar quién accedió a qué
- ✅ Revocación instantánea: Borras un usuario de LLDAP y pierde acceso a TODO
Componentes de un Sistema SSO
| Componente | Función | Herramienta |
|---|---|---|
| Identity Provider (IdP) | Gestiona autenticación y sesiones | Authelia |
| User Backend | Almacena usuarios, passwords, grupos | LLDAP |
| Reverse Proxy | Intercepta peticiones y consulta IdP | Nginx / Traefik |
| Session Store | Guarda sesiones activas | Redis |
| Persistence | Almacena logs, configuración | PostgreSQL / SQLite |
¿Por Qué Usar Authelia + LLDAP?
Casos de uso ideales:
- Homelab con 5+ servicios: Jellyfin, Nextcloud, Home Assistant, Portainer, Gitea, etc.
- Múltiples usuarios: Familia, amigos, roommates con diferentes niveles de acceso
- Seguridad crítica: Servicios expuestos a internet que requieren protección 2FA
- Recursos limitados: Raspberry Pi, mini PC (Authelia ~100MB RAM, LLDAP ~50MB)
NO uses Authelia + LLDAP si:
- ❌ Solo tienes 1-2 servicios (overhead innecesario)
- ❌ Necesitas OAuth2/OIDC nativo (usa Authentik o Keycloak en su lugar)
- ❌ Requieres SAML para integraciones enterprise
- ❌ Más de 500 usuarios concurrentes (LLDAP no escala tanto, usa OpenLDAP)
Authelia vs Authentik vs Keycloak {#comparativa}
| Característica | Authelia | Authentik | Keycloak |
|---|---|---|---|
| Facilidad de setup | ⭐⭐⭐⭐⭐ 10 min | ⭐⭐⭐⭐ 30 min | ⭐⭐⭐ 1-2h |
| RAM usage | ~100MB | ~300MB | ~1GB+ |
| Forward Auth | ✅ Nativo (diseño principal) | ✅ Vía proxy | ✅ Vía adapter |
| OAuth2/OIDC | ❌ No soportado | ✅ Completo | ✅ Completo |
| SAML | ❌ No | ✅ Sí | ✅ Sí |
| LDAP support | ✅ Excelente | ✅ Excelente | ✅ Excelente |
| 2FA | ✅ TOTP + WebAuthn | ✅ TOTP + WebAuthn + SMS | ✅ TOTP + WebAuthn |
| UI Admin | ⚠️ Archivo config | ✅ Web completa | ✅ Web completa |
| Curva de aprendizaje | Baja | Media | Alta |
| Comunidad | Media (8k stars) | Alta (14k stars) | Muy alta (25k stars) |
| Ideal para | Homelabs simples | Homelabs avanzados | Enterprise |
¿Cuándo Usar Cada Una?
Usa Authelia si:
- ✅ Solo necesitas forward auth para Nginx/Traefik
- ✅ Quieres setup rápido y bajo consumo de recursos
- ✅ Prefieres archivos YAML sobre UI web
- ✅ Tu homelab tiene <50 usuarios
Usa Authentik si:
- ✅ Necesitas OAuth2/OIDC para apps modernas (Grafana, Gitea, etc.)
- ✅ Quieres UI administrativa elegante
- ✅ Requieres proveedores de auth externos (Google, GitHub login)
- ✅ Self-service de usuarios (registro, reset password)
Usa Keycloak si:
- ✅ Entorno enterprise con SAML
- ✅ Integración con Active Directory
- ✅ Necesitas Kerberos, LDAP replication, etc.
- ✅ >500 usuarios
Recomendación general: Si estás leyendo esto para un homelab casero, Authelia es tu mejor opción. Es el balance perfecto entre funcionalidad y simplicidad.
—LLDAP: El LDAP Que No Odiarás {#lldap}
¿Por Qué LLDAP y No OpenLDAP?
OpenLDAP: El estándar de la industria, usado en enterprise desde los 90s. Potente, flexible… y dolorosamente complejo para un homelab.
Configurar un usuario en OpenLDAP:
# Crear archivo LDIF
cat > newuser.ldif <<EOF
dn: uid=john,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
uid: john
cn: John Doe
sn: Doe
mail: john@example.com
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/john
userPassword: {SSHA}abcdef123456...
EOF
# Añadir con ldapadd
ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f newuser.ldif
¿Resultado? 15 minutos para crear un usuario, 10 líneas de LDIF arcano.
Crear el mismo usuario en LLDAP:
- Abrir
http://lldap.homelab.local:17170 - Click en «Create User»
- Rellenar formulario:
– Username: john
– Email: john@example.com
– Display Name: John Doe
– Password: SecurePass123!
- Click «Create»
¿Resultado? 30 segundos, 0 líneas de código.
Características de LLDAP
- ✅ Interfaz Web React moderna (no phpLDAPadmin antiguo)
- ✅ 50MB RAM (vs 200-300MB OpenLDAP)
- ✅ Configuración con 4 variables de entorno (vs docenas de LDIF)
- ✅ Compatible con estándar LDAP (funciona con Authelia, Nextcloud, Jellyfin, etc.)
- ✅ Backend SQLite o PostgreSQL (tú eliges)
- ✅ API GraphQL para integraciones avanzadas
Estructura LDAP de LLDAP:
dc=homelab,dc=local (Base DN)
├── ou=people (Usuarios)
│ ├── uid=john
│ ├── uid=jane
│ └── uid=admin
└── ou=groups (Grupos)
├── cn=admins
├── cn=users
└── cn=readonly
Atributos soportados:
uid: Usernamemail: Emailcn: Common name (nombre completo)givenName/sn: Nombre y apellidouserPassword: Password hasheado (bcrypt)memberOf: Grupos del usuario
Limitaciones de LLDAP
⚠️ LLDAP NO soporta:
- Schemas LDAP personalizados (solo schema básico)
- Replicación multi-master (solo un servidor)
- StartTLS/LDAPS nativo (requiere proxy TLS externo)
- Más de ~1,000 usuarios (no diseñado para enterprise)
¿Es un problema? Para el 95% de homelabs, no. Si tienes <100 usuarios y solo necesitas autenticación básica, LLDAP es perfecto.
—
Instalación Paso a Paso {#instalacion}
Requisitos Previos
- ✅ Docker + Docker Compose:
docker --version→ 25.0+ - ✅ Dominio local o DNS:
.homelab.localapuntando a tu servidor - ✅ Reverse proxy: Nginx o Traefik configurado
- ✅ Puertos libres: 9091 (Authelia), 17170 (LLDAP web), 3890 (LLDAP LDAP)
Verificar Docker:
docker --version
# Docker version 25.0.0
docker compose version
# Docker Compose version v2.24.0
Paso 1: Crear Estructura de Directorios
# Crear directorio del proyecto
mkdir -p ~/homelab/authelia-sso
cd ~/homelab/authelia-sso
# Crear subdirectorios
mkdir -p authelia lldap nginx secrets
# Estructura final:
# authelia-sso/
# ├── authelia/
# │ └── configuration.yml
# ├── lldap/
# ├── nginx/
# ├── secrets/
# └── docker-compose.yml
Paso 2: Generar Secretos Seguros
# Generar secretos aleatorios (64 chars hex)
openssl rand -hex 32 > secrets/authelia_jwt_secret
openssl rand -hex 32 > secrets/authelia_session_secret
openssl rand -hex 32 > secrets/authelia_storage_encryption_key
openssl rand -hex 32 > secrets/lldap_jwt_secret
# Crear passwords manuales
echo "SuperSecureAdminPassword2025!" > secrets/lldap_admin_password
echo "PostgresPassword123Secure!" > secrets/postgres_password
echo "SuperSecureAdminPassword2025!" > secrets/authelia_ldap_password
# Permisos restrictivos
chmod 600 secrets/*
# Verificar
ls -lah secrets/
# -rw------- 1 user user 65 Nov 7 secrets/authelia_jwt_secret
# ...
Paso 3: Docker Compose Completo
Crea docker-compose.yml:
version: '3.8'
services:
# LLDAP - Backend de usuarios
lldap:
image: lldap/lldap:stable
container_name: lldap
restart: unless-stopped
networks:
- sso
ports:
- "17170:17170" # Web UI
- "3890:3890" # LDAP port
volumes:
- lldap_data:/data
environment:
- TZ=Europe/Madrid
- LLDAP_LDAP_BASE_DN=dc=homelab,dc=local
- LLDAP_JWT_SECRET_FILE=/run/secrets/lldap_jwt_secret
- LLDAP_LDAP_USER_PASS_FILE=/run/secrets/lldap_admin_password
- LLDAP_HTTP_PORT=17170
- LLDAP_LDAP_PORT=3890
secrets:
- lldap_jwt_secret
- lldap_admin_password
# Redis - Session store para Authelia
redis:
image: redis:7-alpine
container_name: authelia-redis
restart: unless-stopped
networks:
- sso
volumes:
- redis_data:/data
command: redis-server --save 60 1 --loglevel warning
# PostgreSQL - Storage para Authelia
postgres:
image: postgres:16-alpine
container_name: authelia-postgres
restart: unless-stopped
networks:
- sso
environment:
- POSTGRES_DB=authelia
- POSTGRES_USER=authelia
- POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password
volumes:
- postgres_data:/var/lib/postgresql/data
secrets:
- postgres_password
# Authelia - Portal SSO
authelia:
image: authelia/authelia:latest
container_name: authelia
restart: unless-stopped
networks:
- sso
ports:
- "9091:9091"
volumes:
- ./authelia/configuration.yml:/config/configuration.yml:ro
- authelia_data:/config
environment:
- TZ=Europe/Madrid
- AUTHELIA_JWT_SECRET_FILE=/run/secrets/authelia_jwt_secret
- AUTHELIA_SESSION_SECRET_FILE=/run/secrets/authelia_session_secret
- AUTHELIA_STORAGE_ENCRYPTION_KEY_FILE=/run/secrets/authelia_storage_encryption_key
- AUTHELIA_STORAGE_POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password
- AUTHELIA_AUTHENTICATION_BACKEND_LDAP_PASSWORD_FILE=/run/secrets/authelia_ldap_password
secrets:
- authelia_jwt_secret
- authelia_session_secret
- authelia_storage_encryption_key
- postgres_password
- authelia_ldap_password
depends_on:
- lldap
- redis
- postgres
networks:
sso:
driver: bridge
volumes:
lldap_data:
redis_data:
postgres_data:
authelia_data:
secrets:
lldap_jwt_secret:
file: ./secrets/lldap_jwt_secret
lldap_admin_password:
file: ./secrets/lldap_admin_password
authelia_jwt_secret:
file: ./secrets/authelia_jwt_secret
authelia_session_secret:
file: ./secrets/authelia_session_secret
authelia_storage_encryption_key:
file: ./secrets/authelia_storage_encryption_key
postgres_password:
file: ./secrets/postgres_password
authelia_ldap_password:
file: ./secrets/authelia_ldap_password
Paso 4: Configuración de Authelia
Crea authelia/configuration.yml:
---
theme: dark
default_redirection_url: https://home.homelab.local
server:
address: 'tcp://0.0.0.0:9091'
log:
level: 'info'
# Sesiones con Redis
session:
name: 'authelia_session'
domain: 'homelab.local'
expiration: '1h'
inactivity: '10m'
redis:
host: 'redis'
port: 6379
# Storage con PostgreSQL
storage:
postgres:
address: 'tcp://postgres:5432'
database: 'authelia'
username: 'authelia'
# Backend LDAP (LLDAP)
authentication_backend:
refresh_interval: '5m'
ldap:
implementation: 'custom'
address: 'ldap://lldap:3890'
timeout: '5s'
start_tls: false
base_dn: 'dc=homelab,dc=local'
user: 'uid=admin,ou=people,dc=homelab,dc=local'
username_attribute: 'uid'
mail_attribute: 'mail'
display_name_attribute: 'cn'
additional_users_dn: 'ou=people'
additional_groups_dn: 'ou=groups'
users_filter: '(&({username_attribute}={input})(objectClass=person))'
groups_filter: '(&(member={dn})(objectClass=groupOfUniqueNames))'
group_name_attribute: 'cn'
# Control de acceso
access_control:
default_policy: 'deny'
rules:
# Admins: acceso completo con 2FA
- domain:
- 'portainer.homelab.local'
- 'proxmox.homelab.local'
policy: 'two_factor'
subject:
- 'group:admins'
# Users: apps multimedia con password
- domain:
- 'jellyfin.homelab.local'
- 'nextcloud.homelab.local'
policy: 'one_factor'
subject:
- 'group:users'
# Protección brute force
regulation:
max_retries: 5
find_time: '2m'
ban_time: '5m'
# TOTP (Google Authenticator)
totp:
issuer: 'homelab.local'
period: 30
skew: 1
# WebAuthn (YubiKey)
webauthn:
display_name: 'Homelab Authelia'
relying_party_id: 'homelab.local'
# Notificaciones por email (opcional)
notifier:
filesystem:
filename: '/config/notifications.txt'
Paso 5: Iniciar el Stack
# Iniciar servicios
docker compose up -d
# Verificar que todo está corriendo
docker compose ps
# Deberías ver:
# NAME STATUS
# lldap Up
# authelia-redis Up
# authelia-postgres Up
# authelia Up
# Ver logs en tiempo real
docker compose logs -f authelia
# Buscar líneas como:
# level=info msg="Authentication backend LDAP is ready"
# level=info msg="Session provider is ready"
# level=info msg="Storage backend is ready"
Paso 6: Configurar LLDAP
# Acceder a LLDAP
open http://localhost:17170
# Login:
# Usuario: admin
# Password: SuperSecureAdminPassword2025! (tu secrets/lldap_admin_password)
Crear usuarios:
- Click «Create User»
- Rellenar:
– Username: john
– Email: john@homelab.local
– Display Name: John Doe
– Password: JohnPassword123!
- Click «Create»
Crear grupos:
- Click «Create Group»
- Rellenar:
– Group Name: admins
– Display Name: Administrators
- Click «Create»
- Repetir para grupos
usersyreadonly
Añadir usuario a grupo:
- Ir al grupo
admins - Click «Add Member»
- Seleccionar
john - Click «Add»
Integración con Nginx/Traefik {#integracion}
Opción A: Nginx
Crear archivo /etc/nginx/conf.d/authelia-authrequest.conf:
# Verificación de autenticación
auth_request /authelia;
# Redirigir a Authelia si no autenticado (401)
error_page 401 =302 https://auth.homelab.local/?rd=$scheme://$http_host$request_uri;
# Headers de usuario autenticado
auth_request_set $user $upstream_http_remote_user;
auth_request_set $groups $upstream_http_remote_groups;
auth_request_set $email $upstream_http_remote_email;
# Pasar headers a la app
proxy_set_header Remote-User $user;
proxy_set_header Remote-Groups $groups;
proxy_set_header Remote-Email $email;
Crear archivo /etc/nginx/conf.d/authelia-location.conf:
location /authelia {
internal;
proxy_pass http://authelia:9091/api/verify;
proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
proxy_set_header X-Forwarded-Method $request_method;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Uri $request_uri;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Content-Length "";
proxy_pass_request_body off;
}
Proteger servicio Jellyfin:
# /etc/nginx/sites-available/jellyfin.conf
server {
listen 443 ssl http2;
server_name jellyfin.homelab.local;
# SSL config
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
# Incluir auth Authelia
include /etc/nginx/conf.d/authelia-location.conf;
location / {
include /etc/nginx/conf.d/authelia-authrequest.conf;
proxy_pass http://jellyfin:8096;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# Portal de Authelia
server {
listen 443 ssl http2;
server_name auth.homelab.local;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
location / {
proxy_pass http://authelia:9091;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Opción B: Traefik
Añadir labels al servicio Authelia en docker-compose.yml:
authelia:
# ... configuración anterior ...
labels:
- "traefik.enable=true"
- "traefik.http.routers.authelia.rule=Host(`auth.homelab.local`)"
- "traefik.http.routers.authelia.tls=true"
- "traefik.http.services.authelia.loadbalancer.server.port=9091"
# Middleware para forward auth
- "traefik.http.middlewares.authelia.forwardAuth.address=http://authelia:9091/api/verify?rd=https://auth.homelab.local"
- "traefik.http.middlewares.authelia.forwardAuth.trustForwardHeader=true"
- "traefik.http.middlewares.authelia.forwardAuth.authResponseHeaders=Remote-User,Remote-Groups,Remote-Email"
Proteger servicio Jellyfin con Traefik:
jellyfin:
image: jellyfin/jellyfin:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.jellyfin.rule=Host(`jellyfin.homelab.local`)"
- "traefik.http.routers.jellyfin.tls=true"
- "traefik.http.routers.jellyfin.middlewares=authelia@docker"
- "traefik.http.services.jellyfin.loadbalancer.server.port=8096"
Resultado: Ahora al acceder a https://jellyfin.homelab.local, Traefik redirigirá automáticamente a Authelia si no estás autenticado.

Configurar 2FA (TOTP y WebAuthn) {#2fa}
TOTP con Google Authenticator
Flujo de registro:
- Usuario se loguea por primera vez en
https://auth.homelab.local - Authelia muestra QR code
- Usuario abre Google Authenticator en móvil
- Escanea QR code
- Authelia pide código de 6 dígitos para verificar
- Usuario introduce código
- TOTP queda registrado ✅
Apps TOTP recomendadas:
- 📱 Google Authenticator (Android/iOS) – Simple
- 📱 Microsoft Authenticator (Android/iOS) – Backup en cloud
- 📱 Authy (Android/iOS/Desktop) – Multi-device
- 🔐 Bitwarden (Si usas password manager) – Todo en uno
- 🔐 1Password (Premium) – Elegante
Configuración avanzada TOTP:
# authelia/configuration.yml
totp:
disable: false
issuer: 'homelab.local'
algorithm: 'sha1' # o sha256 (más seguro pero menos compatible)
digits: 6 # o 8 (más seguro pero menos compatible)
period: 30 # Cambiar cada 30s (estándar)
skew: 1 # Tolerancia ±30s (para relojes desincronizados)
secret_size: 32 # Tamaño del secret (32 bytes = 256 bits)
WebAuthn con YubiKey
Hardware keys compatibles:
- 🔑 YubiKey 5 Series (USB-A, USB-C, NFC, Nano)
- 🔑 Google Titan Security Key (USB-A + NFC, USB-C)
- 🔑 Thetis FIDO U2F Key (Budget)
- 🔑 Cualquier llave FIDO2/WebAuthn certificada
Registrar YubiKey:
- Usuario logueado en Authelia
- Ir a Settings (icono engranaje)
- Click «Register Security Key»
- Introducir nombre:
YubiKey 5C NFC - Insertar YubiKey en puerto USB
- Tocar botón dorado de la YubiKey
- Key registrada ✅
Login con YubiKey:
- Usuario introduce
username+password - Authelia detecta WebAuthn registrado
- Navegador muestra popup: «Toque su llave de seguridad»
- Usuario toca botón de YubiKey
- Login completado en 2-3 segundos ⚡
Ventajas de WebAuthn vs TOTP:
- ✅ Resistente a phishing (verifica dominio)
- ✅ Más rápido (tocar botón vs escribir 6 dígitos)
- ✅ No requiere móvil (YubiKey en llavero)
- ✅ Hardware seguro (chip dedicado)
Configuración WebAuthn:
# authelia/configuration.yml
webauthn:
disable: false
timeout: '60s'
display_name: 'Homelab SSO'
attestation_conveyance_preference: 'indirect'
user_verification: 'preferred'
# IMPORTANTE: Cambiar por tu dominio (sin https://)
relying_party_id: 'homelab.local'
relying_party_display_name: 'Homelab Authelia'
—
Control de Acceso por Grupos {#control-acceso}
Políticas de Acceso
Authelia soporta 4 niveles de política:
| Política | Descripción | Uso |
|---|---|---|
bypass | Sin autenticación | Recursos públicos |
one_factor | Solo password | Apps no críticas |
two_factor | Password + 2FA | Apps sensibles |
deny | Bloquear acceso | Paths restringidos |
Ejemplo: Homelab con 3 Grupos
Grupos en LLDAP:
admins→ Acceso total con 2FA obligatoriousers→ Apps multimedia sin 2FAreadonly→ Solo lectura
Configuración access_control:
access_control:
default_policy: 'deny' # Por defecto bloquear todo
rules:
# ADMINS: Acceso completo con 2FA
- domain:
- 'portainer.homelab.local'
- 'proxmox.homelab.local'
- 'nginx.homelab.local'
policy: 'two_factor'
subject:
- 'group:admins'
# USERS: Apps multimedia solo password
- domain:
- 'jellyfin.homelab.local'
- 'nextcloud.homelab.local'
- 'photoprism.homelab.local'
policy: 'one_factor'
subject:
- 'group:users'
- 'group:admins' # Admins también tienen acceso
# READONLY: Monitoring sin 2FA
- domain: 'grafana.homelab.local'
policy: 'one_factor'
subject:
- 'group:readonly'
resources:
- '^/dashboard$' # Solo path /dashboard
# PÚBLICO: Sin autenticación
- domain: 'blog.homelab.local'
policy: 'bypass'
# RESTRINGIR POR PATH: /admin requiere 2FA
- domain: 'nextcloud.homelab.local'
policy: 'two_factor'
resources:
- '^/settings/admin([/?].*)?$'
subject:
- 'group:admins'
Restricción por Usuario Específico
# Solo el usuario john puede acceder
- domain: 'john-private.homelab.local'
policy: 'two_factor'
subject:
- 'user:john'
Restricción por IP
# Solo desde red local
- domain: 'admin.homelab.local'
policy: 'two_factor'
subject:
- 'group:admins'
networks:
- '192.168.1.0/24'
- '10.0.0.0/8'
—

Troubleshooting: Errores Comunes {#troubleshooting}
Error 1: «LDAP connection failed»
Síntomas:
ERROR: Authentication backend LDAP is not ready
ERROR: Failed to connect to LDAP: connection refused
Causas:
- LLDAP no está corriendo
- Puerto 3890 bloqueado por firewall
- Red Docker incorrecta
Solución:
# 1. Verificar que LLDAP está corriendo
docker ps | grep lldap
# 2. Ver logs de LLDAP
docker logs lldap
# 3. Test de conexión LDAP
docker exec -it authelia ldapsearch \
-x -H ldap://lldap:3890 \
-D "uid=admin,ou=people,dc=homelab,dc=local" \
-w "tu_password_admin" \
-b "dc=homelab,dc=local"
# Si falla, verificar network
docker network inspect sso
# Asegurar que Authelia y LLDAP están en la misma red
Error 2: «Invalid credentials»
Síntomas:
- Login falla con mensaje «Invalid credentials»
- Usuario existe en LLDAP
- Password es correcto
Causas:
- Password de bind admin incorrecto en
configuration.yml - DN de bind incorrecto
Solución:
# Verificar en authelia/configuration.yml
authentication_backend:
ldap:
user: 'uid=admin,ou=people,dc=homelab,dc=local'
# DEBE coincidir EXACTAMENTE con Base DN de LLDAP
base_dn: 'dc=homelab,dc=local'
# DEBE coincidir con LLDAP_LDAP_BASE_DN
Verificar desde command line:
# Login manual con ldapsearch
ldapsearch -x -H ldap://localhost:3890 \
-D "uid=admin,ou=people,dc=homelab,dc=local" \
-w "TU_PASSWORD_ADMIN" \
-b "ou=people,dc=homelab,dc=local" \
"(uid=john)"
# Si funciona, el problema está en secrets de Docker
# Verificar que secret existe:
docker exec authelia cat /run/secrets/authelia_ldap_password
Error 3: «Session cookie not set»
Síntomas:
- Login exitoso pero vuelve a pedir login
- Cookie no se establece en navegador
Causas:
- Dominio de sesión incorrecto
- Usando HTTP en lugar de HTTPS
- SameSite policy bloqueando cookie
Solución:
# configuration.yml
session:
domain: 'homelab.local' # Sin subdominios, solo raíz
# Para testing con HTTP (NUNCA en producción)
cookies:
- domain: 'homelab.local'
secure: false # Solo para HTTP local
sameSite: 'lax'
Verificar en navegador:
- F12 → Application/Storage → Cookies
- Debe existir cookie
authelia_session - Domain:
.homelab.local - Secure: true (si usas HTTPS)
Error 4: «User not found in LDAP»
Síntomas:
ERROR: User 'john' not found in LDAP directory
Solución:
# 1. Verificar que usuario existe en LLDAP
docker exec -it lldap sqlite3 /data/users.db \
"SELECT * FROM users WHERE username='john';"
# 2. Verificar con ldapsearch
ldapsearch -x -H ldap://localhost:3890 \
-D "uid=admin,ou=people,dc=homelab,dc=local" \
-w "password_admin" \
-b "ou=people,dc=homelab,dc=local" \
"(uid=john)"
# 3. Verificar filtro en configuration.yml
users_filter: '(&({username_attribute}={input})(objectClass=person))'
# Debe coincidir con objectClass de LLDAP
Error 5: «Group permissions not working»
Síntomas:
- Usuario está en grupo
adminsen LLDAP - Política
group:adminsno aplica
Solución:
# 1. Verificar membresía de grupo
ldapsearch -x -H ldap://localhost:3890 \
-D "uid=admin,ou=people,dc=homelab,dc=local" \
-w "password_admin" \
-b "ou=groups,dc=homelab,dc=local" \
"(cn=admins)"
# Debe aparecer:
# member: uid=john,ou=people,dc=homelab,dc=local
# 2. Verificar filtro de grupos en configuration.yml
groups_filter: '(&(member={dn})(objectClass=groupOfUniqueNames))'
group_name_attribute: 'cn'
# 3. Ver logs de Authelia durante login
docker logs authelia -f
# Buscar línea:
# level=info msg="User 'john' is member of groups: [admins, users]"
—
🔗 Artículos Relacionados
Continúa aprendiendo con estas guías complementarias:
- Nginx Proxy Manager: Reverse Proxy con UI Visual y SSL Automático (Guía Completa 2025) – Perfecto para combinar con Authelia
- Docker Compose: De 0 a Homelab Completo en 2025 – Stack base para este tutorial
- Portainer: Gestiona Docker con Interfaz Web (Guía Completa 2025) – Protege Portainer con Authelia
- TrueNAS Scale: NAS Potente con Docker y ZFS para tu Homelab (Guía Completa 2025) – Implementa SSO en TrueNAS Apps
- Nextcloud: Tu Google Drive Self-Hosted con LDAP – Integración Nextcloud + LLDAP
- Jellyfin: Media Server con Autenticación SSO – Protege Jellyfin con Authelia
- Home Assistant con Docker: Smart Home Self-Hosted en tu Homelab – Autenticación forward auth
- Uptime Kuma: Monitoreo Self-Hosted Gratis para tu Homelab – Monitorea Authelia y servicios
Preguntas Frecuentes {#faq}
¿Qué es SSO y por qué lo necesito en mi homelab?
SSO (Single Sign-On) significa «iniciar sesión una vez, acceder a todo». En lugar de gestionar 10-20 contraseñas diferentes para Jellyfin, Nextcloud, Portainer, etc., configuras un sistema centralizado donde te logueas una vez y tienes acceso automático a todos tus servicios durante una sesión.
Beneficios clave: Gestión simplificada de usuarios, 2FA centralizado, control de acceso granular por grupo/usuario, revocación instantánea de acceso, y logs centralizados de autenticación.
Tiempo de implementación: 30-60 minutos siguiendo esta guía.
¿Cuál es mejor: Authelia, Authentik o Keycloak?
Authelia es la mejor opción para homelabs con <50 usuarios que solo necesitan forward authentication. Es ligero (~100MB RAM), se configura en 10 minutos, y se integra perfectamente con Nginx/Traefik.
Usa Authentik si necesitas OAuth2/OIDC nativo (para apps como Grafana, Gitea) o prefieres UI web administrativa en lugar de archivos YAML.
Usa Keycloak solo si tienes requisitos enterprise como SAML, integración con Active Directory, o >500 usuarios. Consume ~1GB RAM y tiene curva de aprendizaje alta.
¿LLDAP es suficiente o necesito OpenLDAP?
LLDAP es más que suficiente para el 95% de homelabs. Soporta <1,000 usuarios, tiene interfaz web moderna, y consume solo 50MB RAM. OpenLDAP es necesario solo si requieres schemas LDAP personalizados, replicación multi-master, o más de 1,000 usuarios concurrentes.
Ventaja clave de LLDAP: Crear un usuario toma 30 segundos con UI web vs 15 minutos con archivos LDIF en OpenLDAP.
¿Cómo protejo servicios que ya están corriendo?
Para servicios en Docker: Añade labels de Traefik con middleware authelia@docker, o configura auth_request en Nginx.
Para servicios nativos (fuera de Docker): Crea un virtual host en Nginx/Traefik que haga proxy al servicio y añade autenticación Authelia. Ejemplo:
server {
listen 443 ssl;
server_name myapp.homelab.local;
include /etc/nginx/conf.d/authelia-authrequest.conf;
location / {
proxy_pass http://192.168.1.100:8080; # IP del servicio
}
}
¿Funciona con Cloudflare Tunnel / Tailscale?
Sí, funciona perfectamente. Authelia valida autenticación independientemente de cómo llegue el tráfico (Cloudflare Tunnel, Tailscale, VPN, puerto 443 directo).
Cloudflare Tunnel: Configura el tunnel apuntando a auth.homelab.local:9091 y servicios protegidos con forward auth.
Tailscale: Authelia verifica autenticación en la capa HTTP, compatible con cualquier VPN mesh.
¿Cómo añado 2FA obligatorio solo para admins?
Configuración en access_control:
access_control:
default_policy: 'one_factor' # Por defecto solo password
rules:
# Admins: 2FA obligatorio
- domain: '*' # Todos los dominios
policy: 'two_factor'
subject:
- 'group:admins'
# Users regulares: solo password
- domain: '*'
policy: 'one_factor'
subject:
- 'group:users'
Resultado: Usuarios del grupo admins en LLDAP siempre verán prompt de 2FA (TOTP o WebAuthn).
¿Puedo usar Google/GitHub OAuth para login?
No, Authelia no soporta OAuth2/OIDC como Identity Provider. Solo soporta LDAP (como LLDAP) o archivo de usuarios local.
Alternativa: Usa Authentik que sí soporta proveedores externos (Google, GitHub, Microsoft, etc.) para login social.
¿Cómo hago backup de Authelia + LLDAP?
Backup de LLDAP (usuarios y grupos):
# Backup del volumen Docker
docker run --rm -v lldap_data:/data -v $(pwd):/backup \
alpine tar czf /backup/lldap-backup-$(date +%Y%m%d).tar.gz /data
# Restaurar
docker run --rm -v lldap_data:/data -v $(pwd):/backup \
alpine tar xzf /backup/lldap-backup-20251107.tar.gz -C /
Backup de Authelia (sessions, logs, config 2FA):
# Backup PostgreSQL
docker exec authelia-postgres pg_dump -U authelia authelia > authelia-db-$(date +%Y%m%d).sql
# Restaurar
docker exec -i authelia-postgres psql -U authelia authelia < authelia-db-20251107.sql
Automatizar con cron:
# Ejecutar diario a las 3 AM
0 3 * * * /home/user/homelab/backup.sh
¿Authelia consume muchos recursos?
No, es muy ligero:
- Authelia: ~100MB RAM, <5% CPU (idle)
- LLDAP: ~50MB RAM, <2% CPU
- Redis: ~30MB RAM
- PostgreSQL: ~50MB RAM
Total stack SSO: ~230MB RAM. Funciona perfectamente en Raspberry Pi 4 (8GB).
Comparativa:
- Authentik: ~300MB (2 contenedores)
- Keycloak: ~1GB+ (JVM)
¿Qué pasa si LLDAP se cae?
Si LLDAP falla:
- ❌ No se pueden hacer nuevos logins (Authelia no puede verificar credenciales)
- ✅ Sesiones activas siguen funcionando (cookies en Redis son válidas)
- ✅ Usuarios ya logueados pueden seguir accediendo por ~1h (expiration time)
Recomendación: Implementa monitoreo con Uptime Kuma para detectar caídas de LLDAP/Authelia.
¿Puedo migrar de archivos de usuarios a LLDAP después?
Sí, el proceso es manual pero sencillo:
- Exporta usuarios de
users_database.yml - Crea usuarios en LLDAP vía UI web (o API GraphQL)
- Cambia configuración Authelia:
authentication_backend:
ldap: # Cambiar de file: a ldap:
address: 'ldap://lldap:3890'
- Reinicia Authelia:
docker compose restart authelia
Nota: Contraseñas hasheadas NO son compatibles (Authelia file usa argon2, LLDAP usa bcrypt). Los usuarios deberán resetear passwords.
¿Cómo reseteo la contraseña de un usuario?
Opción 1: Desde LLDAP UI
- Login como admin en
http://lldap.homelab.local:17170 - Ir a usuario
- Click «Change Password»
- Introducir nueva password
- Click «Save»
Opción 2: Via SMTP notifications
Si configuraste SMTP en Authelia, los usuarios pueden usar «Forgot Password» desde el portal de login.
Opción 3: Command line
# Resetear password en LLDAP
docker exec -it lldap lldap_cli set_password \
--base-dn "dc=homelab,dc=local" \
--username john \
--password "NewPassword123!"
¿Authelia funciona sin dominio (solo IP)?
Técnicamente sí, pero NO es recomendado. Authelia y WebAuthn requieren dominios para funcionalidad completa.
Solución para testing:
- Edita
/etc/hosts(Linux/Mac) oC:\Windows\System32\drivers\etc\hosts(Windows):
192.168.1.100 auth.local jellyfin.local nextcloud.local
- Configura Authelia con
domain: 'local' - Accede a
http://jellyfin.local(sin HTTPS)
Para producción: Usa un dominio real (aunque sea .homelab.local resuelto internamente).
¿Puedo usar Authelia con Kubernetes?
Sí, Authelia tiene Helm chart oficial:
helm repo add authelia https://charts.authelia.com
helm install authelia authelia/authelia \
--set ingress.enabled=true \
--set domain=homelab.local
Integración con Ingress NGINX:
apiVersion: networking.k8s.io/v1
kind:Ingress
metadata:
name: jellyfin
annotations:
nginx.ingress.kubernetes.io/auth-url: "http://authelia.default.svc.cluster.local:9091/api/verify"
nginx.ingress.kubernetes.io/auth-signin: "https://auth.homelab.local"
Documentación: https://www.authelia.com/integration/kubernetes/introduction/
—Conclusión
Resumen de Puntos Clave
En este tutorial has aprendido:
✅ Qué es SSO y por qué lo necesitas – Gestión centralizada de autenticación para todos tus servicios
✅ Authelia vs alternativas – Cuándo usar Authelia, Authentik o Keycloak según tu caso
✅ Instalación completa – Docker Compose con Authelia, LLDAP, Redis y PostgreSQL funcionando en 15 minutos
✅ Integración con Nginx/Traefik – Forward authentication protegiendo servicios existentes
✅ 2FA avanzado – TOTP (Google Authenticator) y WebAuthn (YubiKey) configurado y funcionando
✅ Control de acceso por grupos – Políticas granulares (admins con 2FA, users con password, readonly limitado)
✅ Troubleshooting – Soluciones a los 5 errores más comunes con comandos específicos
Próximos Pasos Recomendados
Para comenzar HOY:
- Prepara la estructura base – crea los archivos y variables siguiendo la sección de instalación.
- Levanta el stack en staging –
docker compose up -den un entorno de pruebas y valida login/2FA. - Protege tu primer servicio – habilita forward auth en Jellyfin (u otro servicio) y confirma que respeta las políticas.
Para profundizar:
- 📖 Lee: Nginx Proxy Manager + Authelia: Combinación Perfecta
- 🎓 Aprende: Documentación oficial de Authelia
- 🛠️ Practica: Implementa políticas de acceso avanzadas (restricciones por IP, paths específicos, horarios)
Comparte tus mejoras
Si tu despliegue añade reglas o integraciones interesantes, compártelas en los comentarios o enlaza tu repositorio para incorporarlas en futuras actualizaciones.
Mantén tu configuración versionada (Git o backups) y documenta los cambios clave para que cualquier migración o restauración sea sencilla.
—📥 Recursos y Ejemplos Descargables {#recursos}
Checklist de archivos principales
Recrea tu bundle local utilizando los fragmentos del artículo:
- Guarda
docker-compose.ymlcon los servicios Authelia, LLDAP, Redis y PostgreSQL mostrados en la instalación. - Genera
configuration.yml, archivos de usuarios/grupos y las políticasaccess_controladaptando los bloques de ejemplo. - Exporta tus scripts de backup/restore y cualquier workflow auxiliar para versionarlos junto al stack.
Protege credenciales (usa variables de entorno o un secret manager) y versiona los cambios para restaurar o compartir mejoras con la comunidad.
Otros Recursos Útiles
- Documentación Oficial Authelia: https://www.authelia.com/
- Repositorio LLDAP: https://github.com/lldap/lldap
- Discord de Authelia: https://discord.authelia.com
- Community Forum: r/selfhosted, r/homelab
Recursos Adicionales:
- Authelia Configuration Reference: https://www.authelia.com/configuration/prologue/introduction/
- LLDAP Quickstart: https://github.com/lldap/lldap#quickstart
- Forward Auth con Nginx: https://www.authelia.com/integration/proxies/nginx/
- Forward Auth con Traefik: https://www.authelia.com/integration/proxies/traefik/
Última actualización: Noviembre 7, 2025
