Files
Portainer/authentik/README.md
Eduardo David Paredes Vara f29208cfa2 middelware fix
2026-02-17 08:57:58 +00:00

346 lines
12 KiB
Markdown

# Authentik - Sistema de Autenticación SSO
Authentik es un sistema de autenticación y autorización de código abierto que proporciona Single Sign-On (SSO) para tus aplicaciones.
## 📋 Descripción
Este stack despliega Authentik configurado para funcionar con Traefik mediante **Forward Authentication**, protegiendo tus servicios con autenticación centralizada.
## 🚀 Despliegue
### Desde Portainer
1. Ve a **Stacks****Add stack**
2. Nombre: `authentik`
3. Selecciona **Repository** o **Git repository**
4. Configura:
- Repository URL: `<tu-repositorio>`
- Repository reference: `main`
- Compose path: `authentik/docker-compose.yml`
5. Carga el archivo de variables de entorno: `authentik/stack.env`
6. O añade manualmente las variables de entorno necesarias
7. Haz clic en **Deploy the stack**
### Variables de Entorno Importantes
Edita el archivo `stack.env` con tus valores:
```env
# Secretos (genera valores aleatorios seguros)
AUTHENTIK_SECRET_KEY=tu-clave-secreta-aleatoria
AUTHENTIK_POSTGRESQL_PASSWORD=tu-password-db-aleatorio
# Dominio de Authentik
AUTHENTIK_DOMAIN=auth.tudominio.com
# Email y SMTP (opcional pero recomendado)
AUTHENTIK_EMAIL__HOST=smtp.tudominio.com
AUTHENTIK_EMAIL__PORT=587
AUTHENTIK_EMAIL__USERNAME=noreply@tudominio.com
AUTHENTIK_EMAIL__PASSWORD=tu-password-email
AUTHENTIK_EMAIL__FROM=noreply@tudominio.com
```
## ⚙️ Configuración Post-Instalación
Una vez desplegado Authentik, accede a su interfaz web en `https://auth.tudominio.com` y completa la configuración inicial.
### 1. Acceso Inicial
- Usuario por defecto: `akadmin`
- Contraseña: La que configures en el primer acceso
- Cambia la contraseña inmediatamente
### 2. Crear Applications (Aplicaciones)
Para cada servicio que quieras proteger (ej: Portainer, Traefik Dashboard, Gitea, etc.):
1. Ve a **Applications****Create**
2. Completa el formulario:
- **Name**: `Portainer` (nombre descriptivo)
- **Slug**: `portainer` (identificador único en minúsculas)
- **Provider**: (lo crearás en el siguiente paso - déjalo vacío por ahora)
- **Policy engine mode**: `any` (permite acceso si alguna política coincide)
- **UI settings**: Configura el icono y apariencia (opcional)
3. Haz clic en **Create**
### 3. Crear Providers de tipo Forward Auth
Los providers conectan tus aplicaciones con Authentik. Para Forward Auth con Traefik:
1. Ve a **Applications** → Tu aplicación → **Provider****Create**
2. Selecciona tipo: **Proxy Provider**
3. Completa el formulario:
- **Name**: `Portainer Provider`
- **Authorization flow**: Selecciona `default-provider-authorization-implicit-consent` (créalo si no existe - ver paso 4)
- **Type**: **Forward auth (single application)**
- **External host**: `https://portainer.tudominio.com` (URL completa de tu servicio)
- **Internal host**: `http://portainer:9000` (opcional - URL interna si Authentik debe hacer reverse proxy)
- **Internal host SSL validation**: Desactivado (si usas HTTP interno)
4. **Advanced settings**:
- **Token validity**: `hours=24` (duración de la sesión)
- **Cookie domain**: `.tudominio.com` (permite SSO entre subdominios)
5. Haz clic en **Create**
6. Vuelve a la aplicación y selecciona el provider que acabas de crear
### 4. Crear Authorization Flow (Implicit)
El authorization flow de tipo **implicit** permite autorización sin pantalla de consentimiento explícita:
#### Opción A: Usar el flow por defecto
Authentik suele incluir un flow llamado `default-provider-authorization-implicit-consent`. Si existe, úsalo directamente en tus providers.
#### Opción B: Crear un flow personalizado
Si necesitas crear uno nuevo:
1. Ve a **Flows & Stages****Flows****Create**
2. Completa el formulario:
- **Name**: `Authorization Flow Implicit`
- **Title**: `Redirecting to application`
- **Slug**: `default-provider-authorization-implicit-consent`
- **Designation**: **Authorization**
- **Authentication**: `Require authentication` (el usuario debe estar autenticado)
- **Behavior settings**:
- **Layout**: `content_left` o el que prefieras
3. Haz clic en **Create**
#### Añadir Stages al Flow
1. Abre el flow que acabas de crear
2. Ve a la pestaña **Stage Bindings**
3. Añade el stage de consentimiento (opcional):
- Haz clic en **Bind existing stage**
- Selecciona `default-provider-authorization-consent` (o crea uno nuevo)
- **Order**: 10
- **Evaluate on plan**: Activado
- **Re-evaluate policies**: Activado
> **Nota**: Para implicit consent, puedes crear un flow sin stages de consentimiento, lo que permite autorización automática.
#### Crear Stage de Consent (si no existe)
Si necesitas crear el stage de consentimiento:
1. Ve a **Flows & Stages****Stages****Create**
2. Tipo: **Consent Stage**
3. Completa:
- **Name**: `default-provider-authorization-consent`
- **Mode**: `always_require` o `hidden` (para implicit)
- **Consent expire in**: `weeks=4` (duración del consentimiento)
4. Haz clic en **Create**
### 5. Configurar Outpost
Los **outposts** son los componentes que ejecutan los providers y procesan las peticiones de autenticación:
1. Ve a **Outposts****Outposts****Create**
2. Completa el formulario:
- **Name**: `authentik-embedded-outpost` (o el nombre que prefieras)
- **Type**: **Proxy**
- **Integration**: Déjalo vacío (el outpost embedded usa la integración por defecto)
3. **Applications**: Selecciona todas las aplicaciones que creaste (Portainer, Traefik, etc.)
4. **Configuration**:
```yaml
authentik_host: https://auth.tudominio.com
authentik_host_insecure: false
log_level: info
object_naming_template: ak-outpost-%(name)s
docker_network: proxy
docker_labels:
traefik.enable: "true"
```
5. Haz clic en **Create**
#### Verificar Estado del Outpost
1. Ve a **Outposts** → **Outposts**
2. Verifica que tu outpost aparece en estado **Healthy** (saludable)
3. Si aparece como **Unhealthy**:
- Verifica los logs: `docker logs authentik-worker`
- Asegúrate de que el contenedor puede comunicarse con el servidor de Authentik
- Verifica la red Docker `proxy`
### 6. Configurar Middleware en Traefik
Para que Traefik use Authentik como forward auth, necesitas configurar el middleware.
#### Opción A: Middleware en el stack de Authentik
Añade las siguientes labels al servicio `authentik-server` en el `docker-compose.yml`:
```yaml
labels:
# Middleware de Forward Auth
traefik.http.middlewares.authentik.forwardauth.address: "http://authentik-server:9000/outpost.goauthentik.io/auth/traefik"
traefik.http.middlewares.authentik.forwardauth.trustForwardHeader: "true"
traefik.http.middlewares.authentik.forwardauth.authResponseHeaders: "X-authentik-username,X-authentik-groups,X-authentik-email,X-authentik-name,X-authentik-uid"
```
#### Opción B: Middleware en archivo de configuración de Traefik
En el archivo de configuración dinámica de Traefik (`dynamic.yml`):
```yaml
http:
middlewares:
authentik:
forwardAuth:
address: "http://authentik-server:9000/outpost.goauthentik.io/auth/traefik"
trustForwardHeader: true
authResponseHeaders:
- "X-authentik-username"
- "X-authentik-groups"
- "X-authentik-email"
- "X-authentik-name"
- "X-authentik-uid"
```
### 7. Proteger Servicios con Authentik
Una vez configurado el middleware, añade la label a los servicios que quieras proteger:
```yaml
labels:
traefik.http.routers.portainer.middlewares: "ths-authentik@docker"
```
O si definiste el middleware en archivo:
```yaml
labels:
traefik.http.routers.portainer.middlewares: "authentik@file"
```
## 🔐 Gestión de Usuarios y Grupos
### Crear Usuarios
1. Ve a **Directory** → **Users** → **Create**
2. Completa los datos del usuario
3. Asigna grupos si es necesario
4. Haz clic en **Create**
### Crear Grupos
1. Ve a **Directory** → **Groups** → **Create**
2. Nombre del grupo (ej: `admins`, `users`)
3. Añade usuarios al grupo
4. Haz clic en **Create**
### Crear Políticas de Acceso
Para controlar quién puede acceder a cada aplicación:
1. Ve a **Applications** → Tu aplicación → **Policy / Group / User Bindings**
2. Haz clic en **Bind existing policy/group/user**
3. Selecciona un grupo (ej: `admins`)
4. **Order**: 0 (menor número = mayor prioridad)
5. Haz clic en **Create**
## 🔧 Configuración Avanzada
### Configurar Múltiples Dominios (SSO entre subdominios)
En la configuración del provider:
- **Cookie domain**: `.tudominio.com` (con el punto inicial)
- Esto permite que la sesión se comparta entre todos los subdominios
### Configurar Email (SMTP)
Para notificaciones y recuperación de contraseñas:
1. Ve a **System** → **Settings** → **Email**
2. Configura los parámetros SMTP (o usa las variables de entorno en `stack.env`)
### Configurar Autenticación de Dos Factores (2FA)
1. Ve a **Flows & Stages** → **Stages**
2. Crea stages de tipo **Authenticator Validation Stage** (TOTP, WebAuthn, etc.)
3. Añade estos stages a tu authentication flow
### Integración con Proveedores Externos (OAuth, SAML)
1. Ve a **System** → **Providers** → **Create**
2. Selecciona el tipo (OAuth2, SAML, etc.)
3. Configura según el proveedor externo (Google, GitHub, etc.)
## 🛠️ Troubleshooting
### El outpost aparece como Unhealthy
```bash
# Ver logs del worker
docker logs authentik-worker
# Ver logs del servidor
docker logs authentik-server
# Verificar conectividad de red
docker exec authentik-server ping authentik-postgresql
docker exec authentik-server ping authentik-redis
```
### Los servicios no están protegidos
1. Verifica que el middleware de Traefik esté correctamente configurado
2. Comprueba que las labels en el servicio están correctas
3. Verifica los logs de Traefik: `docker logs traefik`
4. Asegúrate de que el provider está asociado a la aplicación
5. Verifica que el outpost esté en estado **Healthy**
### Error "Invalid redirect_uri"
1. Verifica que el **External host** en el provider coincide exactamente con la URL del servicio
2. Asegúrate de incluir el protocolo (`https://`)
3. No incluyas barras finales
### Sesiones no persisten / Se desconecta constantemente
1. Verifica que el **Cookie domain** esté configurado correctamente (`.tudominio.com`)
2. Comprueba que Redis esté funcionando: `docker logs authentik-redis`
3. Aumenta el **Token validity** en el provider
### No puedo acceder al panel de Authentik
1. Accede directamente por IP: `http://IP-servidor:9000`
2. Verifica los logs: `docker logs authentik-server`
3. Comprueba que el dominio DNS está configurado correctamente
4. Verifica que Traefik está redirigiendo correctamente
## 📚 Recursos Adicionales
- [Documentación oficial de Authentik](https://goauthentik.io/docs/)
- [Authentik con Traefik](https://goauthentik.io/docs/providers/proxy/forward_auth)
- [Configuración de Flows](https://goauthentik.io/docs/flow/)
- [Configuración de Outposts](https://goauthentik.io/docs/outposts/)
## 🔒 Seguridad
- **Cambia inmediatamente** el password por defecto de `akadmin`
- Genera valores **aleatorios** para `AUTHENTIK_SECRET_KEY` y `AUTHENTIK_POSTGRESQL_PASSWORD`
- Habilita **2FA** para usuarios administradores
- Realiza **backups regulares** de la base de datos PostgreSQL
- Mantén Authentik **actualizado** a la última versión
## 💾 Backups
Para hacer backup de la configuración de Authentik:
```bash
# Backup de la base de datos PostgreSQL
docker exec authentik-postgresql pg_dump -U authentik authentik > authentik_backup.sql
# Backup de Redis (sesiones)
docker exec authentik-redis redis-cli --rdb /data/dump.rdb
```
## 🔄 Actualizaciones
1. En Portainer, ve a tu stack de Authentik
2. Haz clic en **Editor**
3. Actualiza las versiones de las imágenes si es necesario
4. Haz clic en **Update the stack**
5. O ejecuta: `docker compose pull && docker compose up -d`