Authelia — autenticación MFA para servicios externos
Cómo funciona Authelia, cómo está instalado y cómo protegerá cualquier servicio que exponga a Internet con usuario, contraseña y TOTP.
Tener servicios accesibles desde Internet sin ningún tipo de autenticación es una mala idea. Aunque Cloudflare Tunnel oculta la IP y cierra los puertos, cualquiera que conozca la URL puede intentar acceder al servicio. Authelia añade una capa de autenticación centralizada delante de todo.
Qué es Authelia
Authelia es un portal de autenticación de código abierto que actúa como intermediario entre el usuario y el servicio. Antes de llegar a cualquier aplicación protegida, el usuario tiene que autenticarse con usuario, contraseña y un segundo factor — en este caso TOTP (los códigos de 6 dígitos de una app de autenticación móvil).
Una vez autenticado, Authelia guarda la sesión durante un tiempo configurable. No hace falta volver a autenticarse en cada visita — solo cuando la sesión caduca o desde un dispositivo nuevo.
Instalación con ProxMenux
La instalación se hizo con ProxMenux, que despliega Authelia en un LXC dedicado
(LXC 105, IP 192.168.1.105) con la configuración base lista. Durante el proceso
el script pide el dominio — hay que introducir jelopez.link, no auth.jelopez.link.
Ajustes post-instalación
El script de ProxMenux hace un buen trabajo, pero dejó un par de cosas que corregir.
Bug en la URL de Authelia — la configuración generada tenía un error:
la authelia_url apuntaba a https://auth.auth.jelopez.link con el subdominio
duplicado. Un sed lo arregla:
sed -i 's|authelia_url: "https://auth.auth.jelopez.link"|authelia_url: "https://auth.jelopez.link"|' /etc/authelia/configuration.yml
Política por defecto — el script configura one_factor por defecto,
lo que significa solo usuario y contraseña sin segundo factor. Para forzar MFA
en todos los servicios:
sed -i 's/default_policy: one_factor/default_policy: two_factor/' /etc/authelia/configuration.yml
Dominio de cookie — también había que corregir el dominio para que las cookies
funcionen correctamente en todos los subdominios de jelopez.link:
sed -i 's/domain: "auth.jelopez.link"/domain: "jelopez.link"/' /etc/authelia/configuration.yml
Tras los cambios, reiniciar el servicio:
systemctl restart authelia
Configuración de usuarios
Los usuarios se definen en /etc/authelia/users.yml. Las contraseñas se almacenan
como hash Argon2 — nunca en texto plano. Para generar el hash de una contraseña:
authelia crypto hash generate argon2 --password 'tucontraseña'
El fichero de usuarios tiene esta estructura:
users:
juanen:
disabled: false
displayname: "Juanen"
password: "$argon2id$v=19$..."
email: "tucorreo@gmail.com"
groups:
- admins
Configurar el TOTP
La primera vez que inicias sesión, Authelia detecta que no tienes segundo factor configurado y te redirige a registrar un dispositivo. Escaneas el QR con cualquier app de autenticación (Aegis, Google Authenticator, Authy) y listo.
Un detalle: Authelia envía el enlace de verificación por email, pero en esta
configuración el notificador está configurado como fichero local — no envía emails reales.
El enlace se guarda en /etc/authelia/emails.txt en el servidor:
cat /etc/authelia/emails.txt
Integración con Cloudflare Tunnel
Authelia se integra con Cloudflare Tunnel mediante forward auth — cada petición que llega a un servicio protegido pasa primero por Authelia antes de llegar al servicio.
El flujo es:
- Usuario accede a
app.jelopez.link - Cloudflare Tunnel consulta a Authelia:
https://auth.jelopez.link/api/authz/forward-auth - Si no hay sesión válida → Authelia redirige al portal de login
- Usuario introduce usuario, contraseña y código TOTP
- Authelia valida y devuelve 200 OK
- Cloudflare pasa el tráfico al servicio
Esta integración se configura en Origin request settings de cada ruta del túnel
en Cloudflare Zero Trust. De momento no hay servicios expuestos más allá del propio
auth.jelopez.link, pero cualquier servicio nuevo que se publique llevará Authelia
delante desde el primer momento.
Acceso
El portal de Authelia está accesible en https://auth.jelopez.link — tanto desde
dentro de la LAN (via AdGuard + NPMplus) como desde Internet (via Cloudflare Tunnel).
Es el único servicio expuesto externamente de forma permanente, ya que es el que
gestiona la autenticación del resto.