feat(security): durcissement edge funklab.online (vraie IP client + rate-limit + TLS/headers) (#95)

- Traefik externalTrafficPolicy: Local → IP client réelle (fin du SNAT kube-proxy)
- middleware ratelimit par IP (100/min, burst 200) sur les 6 routes publiques
- middleware security-headers (HSTS, nosniff, X-Frame SAMEORIGIN, Referrer-Policy)
- TLSOption globale : plancher TLS 1.2 + ciphers modernes
- Guacamole REMOTE_IP_VALVE → ban anti-bruteforce par IP (fin du piège n°5)
- nftables : fermeture des ports Internet legacy 9080/9081 (HTTP clair redondant)
- allowCrossNamespace pour mutualiser les middlewares depuis infra
- docs : section Durcissement (public-domain.md) + CAA OVH + pièges à jour

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ALI YESILKAYA 2026-07-07 22:58:24 +02:00 committed by GitHub
parent a13b5a70cd
commit fe0aa89ffa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 178 additions and 19 deletions

View file

@ -117,8 +117,10 @@ Config côté Authentik (UI) — Redirect URI par app : voir le tableau de
## Pièges / notes
1. **Tout est en HTTP** (pas de TLS) — accepté y compris pour l'accès Internet
(cf. section ci-dessus), avec garde-fous réseau + mots de passe dédiés.
1. **HTTPS sur Internet, HTTP en interne** : l'accès public passe par
`*.funklab.online` en **TLS Let's Encrypt** (durcissement 2026-07-07) ; les routes
internes `*.lab.local` restent en HTTP clair (LAN de confiance). L'issuer OIDC est
donc le domaine HTTPS (cf. piège n°2).
2. **JWKS via le Service interne** (`authentik.auth.svc.cluster.local:9000`) : l'appel
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
@ -132,9 +134,13 @@ Config côté Authentik (UI) — Redirect URI par app : voir le tableau de
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/`
et token rejeté. Corriger : Applications → Edit → Slug.
5. **Anti-bruteforce intégré** (extension `ban`) : 5 échecs → IP bloquée ~5 min. Derrière
Traefik, l'IP vue est celle du proxy → **le blocage touche tout le monde**. Patienter
ou redémarrer le pod guacamole pour purger.
5. **Anti-bruteforce intégré** (extension `ban`) : 5 échecs → IP bloquée ~5 min.
**Corrigé (2026-07-07)** : `REMOTE_IP_VALVE_ENABLED=true` (deployment) + Traefik en
`externalTrafficPolicy: Local` → Guacamole lit l'IP client réelle (X-Forwarded-For), le
ban est **par IP** et non plus global. Avant ce fix, l'IP vue était celle du pod Traefik
→ le blocage touchait tout le monde. Si un ban global réapparaît : vérifier que la valve
est active et que Traefik n'est pas repassé en `Cluster`. Purge immédiate : redémarrer le
pod guacamole.
6. **User `console` sans sudo** (volontaire) : le portail sert à observer/opérer léger.
L'administration passe par les comptes admin habituels, pas par Guacamole.
7. **Enregistrement des sessions** : possible (guacd + volume partagé) mais non configuré