feat(auth): Authentik en hub utilisateur public — SSO de bout en bout (#82)

L'entrée unique devient la page « My applications » d'Authentik
(kaya.freeboxos.fr:9081) : login → tuiles des apps autorisées → SSO
vers Guacamole (:9080). Plus de comptes locaux Guacamole.

- Services LoadBalancer dédiés (MetalLB .201 Authentik / .202 Guacamole) :
  le DNAT par port ne peut pas router par Host derrière Traefik :80
- gateway : DNAT 9081→.201:9000 et 9080→.202:8080 + rate-limit par VIP
- Guacamole : endpoints OIDC sur l'URL publique canonique (LAN inclus,
  hairpin Freebox) + retour au SSO direct (openid prioritaire)
- doc : section « Accès externe » réécrite (hub, chaîne, config provider)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
ALI YESILKAYA 2026-07-07 11:25:56 +02:00 committed by GitHub
parent cf09e404ef
commit 5a4190faaa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 92 additions and 40 deletions

View file

@ -85,22 +85,35 @@ kubectl -n auth create secret generic guacamole-secret \
3. Settings → Users : les comptes Authentik apparaissent après leur **premier login**
(`POSTGRESQL_AUTO_CREATE_ACCOUNTS=true`) → leur assigner les connexions (READ).
## Accès externe (Internet) — `kaya.freeboxos.fr:9080`
## Accès externe (Internet) — Authentik en hub utilisateur
Le portail est joignable depuis Internet **sans VPN** (choix assumé 2026-07-07,
simplicité d'abord — le VPN WireGuard reste dispo, cf. `admin/infra/wireguard.md`) :
**Authentik est la porte d'entrée** (page « My applications » : une tuile par app
autorisée), le SSO fait le reste. Choix assumé 2026-07-07 : exposition directe sans
VPN, simplicité d'abord (WireGuard reste dispo, cf. `admin/infra/wireguard.md`).
- **Chaîne** : `kaya.freeboxos.fr:9080` → redirection Freebox `9080/tcp → funk-s01`
→ DNAT nftables `→ 192.168.10.200:80` (Traefik) → IngressRoute (host
`kaya.freeboxos.fr` accepté) → Guacamole
- **Auth externe = comptes locaux Guacamole** (Settings → Users → New user + mot de
passe fort + cocher ses connexions). **Authentik n'est PAS exposé** : le SSO ne
fonctionne que du LAN (le lien « OpenID » échoue depuis Internet — normal).
- **Garde-fous** : rate-limit nftables (30 connexions neuves/min) + anti-bruteforce
Guacamole (5 échecs → ~5 min) + mots de passe forts obligatoires. ⚠️ HTTP **non
chiffré** : mots de passe des comptes locaux interceptables en théorie — ne pas
réutiliser un mot de passe important, et envisager TLS (vrai domaine + Let's
Encrypt) ou l'option TOTP de Guacamole si l'usage s'installe.
| URL publique | Service | Chaîne |
|---|---|---|
| `http://kaya.freeboxos.fr:9081` | **Authentik** (hub + login) | Freebox `9081/tcp → s01` → DNAT → VIP MetalLB `192.168.10.201:9000` |
| `http://kaya.freeboxos.fr:9080` | Guacamole (via tuile SSO) | Freebox `9080/tcp → s01` → DNAT → VIP `192.168.10.202:8080` |
- **URL canonique unique** : les endpoints OIDC de Guacamole pointent sur
`kaya.freeboxos.fr`**tout le monde, LAN inclus**, doit utiliser ces URLs (le LAN
repasse par la Freebox, hairpin NAT). `portail.lab.local` affiche encore l'UI mais
le SSO ramène sur l'URL publique.
- Les VIPs dédiées **contournent Traefik** : un DNAT par port ne peut pas router par
Host sur l'entrypoint unique :80.
- **Un seul compte par personne (Authentik)** — plus de comptes locaux Guacamole.
Parcours ami : `kaya.freeboxos.fr:9081` → login → tuile « Portail consoles » →
console. Nouvelle app plus tard = nouveau provider + tuile, zéro compte en plus.
- **Garde-fous** : rate-limit nftables (30 connexions neuves/min par service) +
protections applicatives (Authentik : flows/lockout ; Guacamole : ban 5 échecs).
⚠️ HTTP **non chiffré** : mots de passe interceptables en théorie — mots de passe
dédiés, MFA/TOTP Authentik recommandé pour durcir, TLS (vrai domaine + Let's
Encrypt) si l'usage s'installe.
Config côté Authentik (UI) : provider `guacamole` → **Redirect URI
`http://kaya.freeboxos.fr:9080/`** ; application « Portail consoles » → **Launch URL
`http://kaya.freeboxos.fr:9080/`**.
## Pièges / notes
@ -110,12 +123,11 @@ simplicité d'abord — le VPN WireGuard reste dispo, cf. `admin/infra/wireguard
serveur→serveur de Guacamole ne dépend pas de la résolution `lab.local` des pods.
L'issuer, lui, reste `http://auth.lab.local/...` (doit matcher le claim `iss` des
tokens émis via le navigateur).
3. **`EXTENSION_PRIORITY="*, openid"`** : formulaire local affiché en premier (requis
pour les comptes locaux de l'accès Internet), lien « OpenID » en dessous pour le SSO
LAN. La variante `"openid, *"` (redirection SSO immédiate, testée puis abandonnée
le 2026-07-07) est incompatible avec l'accès externe sans exposer Authentik.
NB : le compte SSO `Alkatrazz` a « Administer system » — admin possible par les
deux chemins.
3. **`EXTENSION_PRIORITY="openid, *"`** : arriver sur Guacamole = redirection
immédiate vers Authentik (le hub). Conséquence : `guacadmin` inaccessible —
l'admin passe par le compte SSO `Alkatrazz` (« Administer system »). Dépannage si
Authentik est HS : remettre `"*, openid"` dans le deployment + re-sync (le
formulaire local revient).
4. **Le slug de l'application Authentik doit être exactement `guacamole`** : Authentik
le génère depuis le nom (« Portail consoles » → `portail-consoles`) et l'issuer/JWKS
deviennent faux → log Guacamole `Non 200 status code (404) ... /o/guacamole/jwks/`