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

  1. ¿Qué es SSO y Por Qué Lo Necesitas?
  2. Authelia vs Authentik vs Keycloak
  3. LLDAP: El LDAP Que No Odiars
  4. Instalación Paso a Paso
  5. Integración con Nginx/Traefik
  6. Configurar 2FA (TOTP y WebAuthn)
  7. Control de Acceso por Grupos
  8. Troubleshooting Errores Comunes
  9. Preguntas Frecuentes
  10. 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.

Robot punk configurando Authelia con llaves TOTP y WebAuthn en homelab 2025

¿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í:

  1. Usuario intenta acceder a jellyfin.homelab.local
  2. Nginx detecta que no está autenticado y redirige a auth.homelab.local
  3. Usuario introduce username + password + código 2FA
  4. Authelia valida credenciales contra LLDAP
  5. Si es correcto, establece cookie de sesión
  6. Usuario es redirigido a Jellyfin con acceso autorizado
  7. 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.local pero bloquear portainer.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

ComponenteFunciónHerramienta
Identity Provider (IdP)Gestiona autenticación y sesionesAuthelia
User BackendAlmacena usuarios, passwords, gruposLLDAP
Reverse ProxyIntercepta peticiones y consulta IdPNginx / Traefik
Session StoreGuarda sesiones activasRedis
PersistenceAlmacena logs, configuraciónPostgreSQL / SQLite

¿Por Qué Usar Authelia + LLDAP?

Casos de uso ideales:

  1. Homelab con 5+ servicios: Jellyfin, Nextcloud, Home Assistant, Portainer, Gitea, etc.
  2. Múltiples usuarios: Familia, amigos, roommates con diferentes niveles de acceso
  3. Seguridad crítica: Servicios expuestos a internet que requieren protección 2FA
  4. 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ísticaAutheliaAuthentikKeycloak
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 aprendizajeBajaMediaAlta
ComunidadMedia (8k stars)Alta (14k stars)Muy alta (25k stars)
Ideal paraHomelabs simplesHomelabs avanzadosEnterprise

¿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:

  1. Abrir http://lldap.homelab.local:17170
  2. Click en «Create User»
  3. Rellenar formulario:

– Username: john

– Email: john@example.com

– Display Name: John Doe

– Password: SecurePass123!

  1. 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: Username
  • mail: Email
  • cn: Common name (nombre completo)
  • givenName / sn: Nombre y apellido
  • userPassword: 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.

Robot punk celebrando inicio de sesión SSO exitoso con Authelia y LLDAP 2025

Instalación Paso a Paso {#instalacion}

Requisitos Previos

  • Docker + Docker Compose: docker --version → 25.0+
  • Dominio local o DNS: .homelab.local apuntando 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:

  1. Click «Create User»
  2. Rellenar:

– Username: john

– Email: john@homelab.local

– Display Name: John Doe

– Password: JohnPassword123!

  1. Click «Create»

Crear grupos:

  1. Click «Create Group»
  2. Rellenar:

– Group Name: admins

– Display Name: Administrators

  1. Click «Create»
  2. Repetir para grupos users y readonly

Añadir usuario a grupo:

  1. Ir al grupo admins
  2. Click «Add Member»
  3. Seleccionar john
  4. 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.

Robot punk bromeando sobre fallos SSO en escenario cyberpunk con Authelia 2025

Configurar 2FA (TOTP y WebAuthn) {#2fa}

TOTP con Google Authenticator

Flujo de registro:

  1. Usuario se loguea por primera vez en https://auth.homelab.local
  2. Authelia muestra QR code
  3. Usuario abre Google Authenticator en móvil
  4. Escanea QR code
  5. Authelia pide código de 6 dígitos para verificar
  6. Usuario introduce código
  7. 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:

  1. Usuario logueado en Authelia
  2. Ir a Settings (icono engranaje)
  3. Click «Register Security Key»
  4. Introducir nombre: YubiKey 5C NFC
  5. Insertar YubiKey en puerto USB
  6. Tocar botón dorado de la YubiKey
  7. Key registrada ✅

Login con YubiKey:

  1. Usuario introduce username + password
  2. Authelia detecta WebAuthn registrado
  3. Navegador muestra popup: «Toque su llave de seguridad»
  4. Usuario toca botón de YubiKey
  5. 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íticaDescripciónUso
bypassSin autenticaciónRecursos públicos
one_factorSolo passwordApps no críticas
two_factorPassword + 2FAApps sensibles
denyBloquear accesoPaths restringidos

Ejemplo: Homelab con 3 Grupos

Grupos en LLDAP:

  • admins → Acceso total con 2FA obligatorio
  • users → Apps multimedia sin 2FA
  • readonly → 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'
Robot punk monitoreando claves SSO de Authelia en homelab cyberpunk 2025

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 admins en LLDAP
  • Política group:admins no 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:

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:

  1. Exporta usuarios de users_database.yml
  2. Crea usuarios en LLDAP vía UI web (o API GraphQL)
  3. Cambia configuración Authelia:
authentication_backend:
     ldap:  # Cambiar de file: a ldap:
       address: 'ldap://lldap:3890'
  1. 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

  1. Login como admin en http://lldap.homelab.local:17170
  2. Ir a usuario
  3. Click «Change Password»
  4. Introducir nueva password
  5. 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:

  1. Edita /etc/hosts (Linux/Mac) o C:\Windows\System32\drivers\etc\hosts (Windows):
192.168.1.100 auth.local jellyfin.local nextcloud.local
  1. Configura Authelia con domain: 'local'
  2. 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:

  1. Prepara la estructura base – crea los archivos y variables siguiendo la sección de instalación.
  2. Levanta el stack en stagingdocker compose up -d en un entorno de pruebas y valida login/2FA.
  3. Protege tu primer servicio – habilita forward auth en Jellyfin (u otro servicio) y confirma que respeta las políticas.

Para profundizar:

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:

  1. Guarda docker-compose.yml con los servicios Authelia, LLDAP, Redis y PostgreSQL mostrados en la instalación.
  2. Genera configuration.yml, archivos de usuarios/grupos y las políticas access_control adaptando los bloques de ejemplo.
  3. 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

Por ziru

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
El Diario IA
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.