Evitar MFA en casa con Authentik
Introducción
Evitar que Authentik pida el segundo factor en casa, donde es una molestia constante. Se aplica solo bajo una IP fija, y sin comprometer la seguridad externa.
Características
- Login sin MFA desde casa (o IP elegida).
- Flujo normal para el resto del mundo.
- Compatible con Cloudflare como proxy.
- Logs limpios con IP y usuario reales.
- Reversible en segundos.
Requisitos previos
- IP pública fija o semiestable (por rango).
- Caddy como reverse proxy.
- Outpost de Authentik funcionando.
- Dominio configurado en Cloudflare con API activa.
Flujo general
Navegador ─▶ Cloudflare ─▶ Caddy ─▶ Authentik Outpost ─▶ App
▲ IP real via X-Forwarded-For ▲
└─────────────────────────────────┘
- Caddy extrae la IP real con
{client_ip}y la pasa como cabecera. - Authentik la lee en
ak_client_ipy salta el MFA si coincide con la IP marcada.
Caddyfile adaptado
Importante: este ejemplo solo aplica a aplicaciones que estén protegidas por Authentik. Si una app no utiliza Authentik como sistema de autenticación, este snippet no tendrá efecto sobre ella.
Antes de modificar nada, se recomienda hacer una copia de seguridad de tu
Caddyfileactual. Por la naturaleza de los cambios (cabeceras, autenticación, DNS...), un error puede dejarte sin acceso a tus servicios.
Antes de modificar nada, se recomienda hacer una copia de seguridad de tu
Caddyfileactual. Por la naturaleza de los cambios (cabeceras, autenticación, DNS...), un error puede dejarte sin acceso a tus servicios.
Ejemplo con datos falsos para documentar el flujo.
{
email ejemplo@dominio.com
acme_dns cloudflare "API_KEY_FAKE123"
servers {
trusted_proxies static private_ranges \
203.0.113.0/24 198.51.100.0/24 192.0.2.0/24
}
}
(authentik) {
reverse_proxy /outpost.goauthentik.io/* http://10.0.0.3:15500
forward_auth http://10.0.0.3:15500 {
uri /outpost.goauthentik.io/auth/caddy
copy_headers {
X-Authentik-Username
X-Authentik-Email
X-Authentik-Groups
X-Authentik-Name
X-Authentik-Uid
}
header_up X-Real-IP {client_ip}
header_up X-Client-IP {client_ip}
}
}
# Cada app que requiera autenticación debe seguir este mismo patrón.
# Primero importamos el snippet de Authentik, luego definimos el reverse_proxy de la app.
app.midominio.com {
log {
output file /var/log/caddy/app-access.log
format transform "{request>headers>X-Forwarded-For>[0]:request>remote_ip} - {user_id} [{ts}] \"{request>method} {request>uri} {request>proto}\" {status} {size}" {
time_format "02/Jan/2006:15:04:05 -0700"
}
}
route {
# 1) Llama al snippet que gestiona la autenticación
import authentik
# 2) Redirige a la app protegida
reverse_proxy http://10.0.0.3:8080
}
}
Policy en Authentik
-
Expression Policy Nombre:
Skip-Home-IPfrom ipaddress import ip_address return ak_client_ip == ip_address("203.0.113.42") -
Aplica la policy Ruta: Flows and Stages → Flows →
default-authentication-flow→ Stage Bindings →default-authentication-mfa-validationBindea: la policySkip-Home-IPOrden:0Negate: desactivado
Si tienes IP dinámica pero dentro de un rango:
from ipaddress import ip_network
return ak_client_ip in ip_network("203.0.113.0/24")
Verificación
| Prueba | Esperado |
|---|---|
| Desde casa | Sin MFA. |
| Fuera de casa | MFA/login normal. |
| Audit → Requests | ALLOW (policy) y IP correcta en Client-IP. |
caddy validate |
Configuración válida. |
Ventajas
| Qué | Por qué |
|---|---|
| Sin MFA en casa | Nada de abrir el móvil cada dos por tres. |
| IP real protegida | trusted_proxies evita que te cuelen cabeceras falsas. |
| Mantenimiento mínimo | Solo un snippet + una policy. |
| Logs decentes | Se ve quién accedió, desde dónde, sin cosas raras. |
| Reversible fácil | Borra la policy o el import, y listo. |
Resumen breve
trusted_proxies+{client_ip}→ IP real segura.- Policy de tipo Expression comparando
ak_client_ip. - Todo controlado desde Caddy con un solo snippet.
- Flujo transparente, sin MFA en casa pero con seguridad fuera.
Referencias
- Rangos IP de Cloudflare — Para configurar
trusted_proxiessegún los saltos reales desde el proxy.
Caddy:
- Implementación de Cloudflare en Caddy
- Caddy: gestionar dominios fácilmente
- Directiva de Authentik para Caddy
Authentik: