Sistema de Identidad¶
Visión global del subsistema de identidad y autenticación de SmallCountry: cómo se gestionan usuarios, grupos, permisos y el flujo de inicio de sesión único (SSO) que protege todos los servicios.
Descripción general¶
La identidad en SmallCountry es centralizada y federada. Un solo proveedor —Authentik— gestiona todos los usuarios, grupos, políticas de acceso y segundo factor de autenticación (2FA). Ningún servicio maneja sus propios usuarios: todos delegan en Authentik vía OAuth2, OIDC o proxy forward-auth.
Esta decisión está documentada en el ADR-014. El principio rector es: una sola fuente de verdad para la identidad, una sola puerta para entrar.
Flujo de autenticación¶
sequenceDiagram
actor Usuario as 👤 Persona
participant Caddy as 🔒 Caddy (proxy TLS)
participant Authentik as 🛡️ Authentik (IdP)
participant Servicio as 📦 Servicio (Nextcloud, Immich...)
Usuario->>Caddy: GET servicio.sc
Caddy->>Caddy: ¿Requiere auth?
alt No autenticado
Caddy->>Authentik: forward_auth (sin sesión)
Authentik->>Usuario: Redirige a login
Usuario->>Authentik: Credenciales + 2FA
Authentik->>Authentik: Valida credenciales y TOTP/WebAuthn
Authentik->>Caddy: Token de sesión válido
end
Caddy->>Servicio: Proxy con cabeceras de autenticación
Servicio->>Servicio: Autorización por grupo/perfil
Servicio->>Usuario: Contenido del servicio
Estructura del directorio¶
Authentik organiza usuarios en grupos que reflejan los 18 roles de SmallCountry. Cada grupo tiene permisos específicos sobre qué servicios puede ver y usar.
| Grupo | Rol(es) | Servicios con acceso |
|---|---|---|
familia |
Vesta, Orfeo, Minerva | Nextcloud, Immich, Jellyfin, Matrix, Joplin, Homepage |
campo |
Deméter, Melissa, Fauno, Gea, Silvano | farmOS, Grafana (dashboards de campo), Node-RED (lectura) |
empresa |
Mercurio, Vulcano | FacturaScripts, Mautic, Odoo, n8n (flujos de negocio) |
salud |
Higía | Joplin Server (cifrado E2E), Hermes Agent, n8n (flujos clínicos) |
admin |
Jano, Argos, Hefesto, Hermes, Égida, Mnemósine, Terminus | Proxmox, Grafana (admin), Semaphore, Forgejo, Portainer, Uptime Kuma |
invitado |
Externos temporales | Solo servicios designados con permiso explícito |
Métodos de autenticación¶
| Método | Obligatorio para | Descripción |
|---|---|---|
| Contraseña + TOTP | Todos los usuarios | Segundo factor con aplicación autenticadora (Aegis, Raivo) |
| WebAuthn / Passkeys | admin |
Llave de seguridad física (YubiKey) como alternativa al TOTP |
| Proxy forward-auth | Servicios sin soporte SSO | Authentik actúa como intermediario. Caddy consulta a Authentik antes de enrutar |
| OAuth2 / OIDC | Servicios con soporte nativo | Integración estándar. Nextcloud, Immich, Grafana, Forgejo lo soportan |
| SAML | Servicios enterprise | Alternativa para Odoo y servicios que requieran SAML |
| Token de API | Automatizaciones (n8n, Node-RED) | Tokens de larga duración para flujos automatizados entre servicios |
Mapeo de servicios¶
| Servicio | Método de auth | Grupo(s) | Ficha |
|---|---|---|---|
| Nextcloud | OIDC | familia, empresa, admin | Ficha |
| Immich | OAuth2 | familia, admin | Ficha |
| Grafana | OAuth2 | campo (lectura), admin (edición) | Ficha |
| Forgejo | OAuth2 | admin | Ficha |
| Matrix | OIDC | familia, admin | Ficha |
| Joplin Server | Forward-auth + E2E | familia, salud, admin | Ficha |
| farmOS | OAuth2 | campo, admin | Ficha |
| Open WebUI | OAuth2 | familia, empresa, admin | Ficha |
| Semaphore | Forward-auth | admin | Ficha |
| Portainer | OAuth2 | admin | Ficha |
| Uptime Kuma | Forward-auth | admin | Ficha |
| Homepage | Forward-auth | todos (vista filtrada por grupo) | Ficha |
| Hermes Agent | Token API | salud, admin | Ficha |
| n8n | OAuth2 | empresa, admin | Ficha |
| Node-RED | Forward-auth | campo (lectura), admin (edición) | Ficha |
Políticas de seguridad¶
| Política | Valor | Aplica a |
|---|---|---|
| Longitud mínima de contraseña | 16 caracteres | Todos los usuarios |
| Rotación de contraseña | 180 días (aviso), sin expiración forzada | admin |
| Bloqueo por intentos fallidos | 5 intentos → 15 min de bloqueo | Todos los usuarios |
| 2FA obligatorio | Sí, sin excepción | Todos los usuarios |
| Sesión máxima | 24 horas (navegador), 7 días (apps) | Todos los usuarios |
| IP allowlist para admin | Solo desde vmbr2 (red de gestión) |
admin |
| Auditoría de accesos | Logs en Victoria Logs con retención de 90 días | Todos los accesos |
Modo isla y degradación¶
En modo isla (sin internet), Authentik sigue funcionando completamente porque no depende de ningún servicio externo:
- Las contraseñas se validan contra la base de datos local (PostgreSQL en
vmbr1) - Los códigos TOTP se generan localmente (sin reloj externo, con tolerancia ampliada)
- Los tokens OAuth2 emitidos antes del corte de internet siguen siendo válidos hasta su expiración
- La IP allowlist de admin se mantiene porque los bridges de Proxmox son locales
El único escenario de riesgo es si Authentik mismo cae. En ese caso, los servicios protegidos por forward-auth dejan de ser accesibles. Es un punto único de fallo consciente, mitigado por el Protocolo de Mortalidad que define cómo recuperar Authentik desde cero en menos de 15 minutos.
Para el arquitecto
Configuración en Authentik¶
| Provider | Client ID | Redirect URI | Grupos |
|---|---|---|---|
| Nextcloud OIDC | nextcloud |
https://nextcloud.sc/apps/oidc_login/oidc |
familia, empresa, admin |
| Immich OAuth2 | immich |
https://fotos.sc/auth/login |
familia, admin |
| Grafana OAuth2 | grafana |
https://grafana.sc/login/generic_oauth |
admin |
| Forgejo OAuth2 | forgejo |
https://forgejo.sc/user/oauth2/authentik/callback |
admin |
| Matrix OIDC | matrix |
https://matrix.sc/_matrix/client/v3/login/sso/redirect |
familia, admin |
Mapeo de grupos a roles¶
Fichas relacionadas¶
- Authentik — Proveedor de identidad y SSO
- Caddy — Proxy inverso con forward-auth
- Vaultwarden — Gestor de contraseñas
- Pi-hole — DNS interno para
.sc - Fail2Ban — Protección contra fuerza bruta