mirror of
https://github.com/Alkatrazz24/Funk-lab.git
synced 2026-07-08 16:24:43 +02:00
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:
parent
a13b5a70cd
commit
fe0aa89ffa
13 changed files with 178 additions and 19 deletions
|
|
@ -117,8 +117,10 @@ Config côté Authentik (UI) — Redirect URI par app : voir le tableau de
|
||||||
|
|
||||||
## Pièges / notes
|
## Pièges / notes
|
||||||
|
|
||||||
1. **Tout est en HTTP** (pas de TLS) — accepté y compris pour l'accès Internet
|
1. **HTTPS sur Internet, HTTP en interne** : l'accès public passe par
|
||||||
(cf. section ci-dessus), avec garde-fous réseau + mots de passe dédiés.
|
`*.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
|
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.
|
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
|
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
|
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/`
|
deviennent faux → log Guacamole `Non 200 status code (404) ... /o/guacamole/jwks/`
|
||||||
et token rejeté. Corriger : Applications → Edit → Slug.
|
et token rejeté. Corriger : Applications → Edit → Slug.
|
||||||
5. **Anti-bruteforce intégré** (extension `ban`) : 5 échecs → IP bloquée ~5 min. Derrière
|
5. **Anti-bruteforce intégré** (extension `ban`) : 5 échecs → IP bloquée ~5 min.
|
||||||
Traefik, l'IP vue est celle du proxy → **le blocage touche tout le monde**. Patienter
|
✅ **Corrigé (2026-07-07)** : `REMOTE_IP_VALVE_ENABLED=true` (deployment) + Traefik en
|
||||||
ou redémarrer le pod guacamole pour purger.
|
`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.
|
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.
|
L'administration passe par les comptes admin habituels, pas par Guacamole.
|
||||||
7. **Enregistrement des sessions** : possible (guacd + volume partagé) mais non configuré
|
7. **Enregistrement des sessions** : possible (guacd + volume partagé) mais non configuré
|
||||||
|
|
|
||||||
|
|
@ -20,8 +20,10 @@ Internet ─▶ grafana.funklab.online ─┐ DNS OVH : *.funklab.online → 82
|
||||||
|
|
||||||
- **Split-horizon** : dnsmasq résout `*.funklab.online → Traefik (192.168.10.200)` en
|
- **Split-horizon** : dnsmasq résout `*.funklab.online → Traefik (192.168.10.200)` en
|
||||||
interne → le LAN utilise les **mêmes URLs** sans sortir sur Internet.
|
interne → le LAN utilise les **mêmes URLs** sans sortir sur Internet.
|
||||||
- **Ports historiques conservés** : le hub reste aussi joignable en `kaya.freeboxos.fr:9081/9080`
|
- **Ports historiques `9080/9081` fermés côté Internet** (durcissement 2026-07-07) :
|
||||||
(bascule non destructive).
|
l'accès direct HTTP clair à Authentik/Guacamole n'existe plus depuis le WAN — tout
|
||||||
|
passe par le domaine en HTTPS. Les VIPs `.201/.202` restent joignables en LAN.
|
||||||
|
(Penser à retirer aussi les redirections Freebox `9080/9081`.)
|
||||||
|
|
||||||
## Prérequis (une fois, côté fournisseurs)
|
## Prérequis (une fois, côté fournisseurs)
|
||||||
|
|
||||||
|
|
@ -119,6 +121,51 @@ Manifests : `k8s/apps/*/ingress-public.yaml`, `k8s/infra/monitoring/ingressroute
|
||||||
|
|
||||||
Détail de l'ajout d'une app au hub : `admin/k8s/auth-portal-admin.md`.
|
Détail de l'ajout d'une app au hub : `admin/k8s/auth-portal-admin.md`.
|
||||||
|
|
||||||
|
## Durcissement (edge) — état 2026-07-07
|
||||||
|
|
||||||
|
Couche de sécurité appliquée à toutes les routes `funklab.online`. Manifests :
|
||||||
|
`k8s/infra/traefik/{values.yaml,middlewares.yaml,tls-options.yaml}` (Traefik **hors
|
||||||
|
ArgoCD** → `kubectl apply` + `helm upgrade`).
|
||||||
|
|
||||||
|
| Mesure | Où | Effet |
|
||||||
|
|---|---|---|
|
||||||
|
| **IP client réelle** | `service.spec.externalTrafficPolicy: Local` (values.yaml) | Traefik voit l'IP source réelle (sinon SNAT kube-proxy → IP d'un nœud). Prérequis du rate-limit par IP et du ban Guacamole par IP. |
|
||||||
|
| **Rate-limit par IP** | Middleware `ratelimit` (infra) sur chaque route | ~100 req/min soutenu, burst 200, **par IP client**. Anti-scan/bruteforce volumétrique. |
|
||||||
|
| **En-têtes sécurité** | Middleware `security-headers` (infra) | HSTS 1 an+subdomains, `nosniff`, `X-Frame-Options: SAMEORIGIN`, `Referrer-Policy`. |
|
||||||
|
| **TLS ≥ 1.2** | `TLSOption` globale `default/default` | Plancher TLS 1.2 + ciphers modernes (TLS 1.3 auto). |
|
||||||
|
| **Ban Guacamole par IP** | `REMOTE_IP_VALVE_ENABLED` (deployment guacamole) | Le ban 5-échecs vise l'IP réelle, plus tout le monde (fin du piège n°5). |
|
||||||
|
| **Ports 9080/9081 fermés (WAN)** | rôle `gateway` (nftables) | Supprime le chemin HTTP clair direct vers Authentik/Guacamole. |
|
||||||
|
|
||||||
|
> Les middlewares du namespace `infra` sont référencés cross-namespace →
|
||||||
|
> `providers.kubernetesCRD.allowCrossNamespace: true` requis (values.yaml).
|
||||||
|
|
||||||
|
**Cross-check DNS (à faire côté OVH)** : ajouter un enregistrement **CAA** pour
|
||||||
|
restreindre l'émission de certificats à Let's Encrypt uniquement :
|
||||||
|
```
|
||||||
|
funklab.online. CAA 0 issue "letsencrypt.org"
|
||||||
|
funklab.online. CAA 0 iodef "mailto:aliyesilkaya93@gmail.com"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Application** (Traefik est hors ArgoCD) :
|
||||||
|
```bash
|
||||||
|
helm upgrade traefik traefik/traefik -n infra --version 40.1.0 \
|
||||||
|
-f k8s/infra/traefik/values.yaml # externalTrafficPolicy + allowCrossNamespace
|
||||||
|
kubectl apply -f k8s/infra/traefik/middlewares.yaml
|
||||||
|
kubectl apply -f k8s/infra/traefik/tls-options.yaml
|
||||||
|
kubectl apply -f k8s/argocd-bootstrap/ingressroute-public.yaml # ArgoCD non auto-sync
|
||||||
|
ansible-playbook -i inventory.yml playbooks/storage-01.yml --tags gateway # ports legacy
|
||||||
|
```
|
||||||
|
Les IngressRoutes des apps `ai/auth/monitoring` sont synchronisées par ArgoCD (merge main).
|
||||||
|
|
||||||
|
**Vérifier** :
|
||||||
|
```bash
|
||||||
|
curl -sI https://auth.funklab.online | grep -i 'strict-transport\|x-frame'
|
||||||
|
nmap --script ssl-enum-ciphers -p 443 auth.funklab.online | grep -i tlsv1
|
||||||
|
```
|
||||||
|
|
||||||
|
**Pistes suivantes** (non faites) : MFA/TOTP Authentik (protège tout le hub),
|
||||||
|
CrowdSec bouncer Traefik (réputation IP), restreindre ArgoCD au LAN+VPN (IPAllowList).
|
||||||
|
|
||||||
## Pièges
|
## Pièges
|
||||||
|
|
||||||
1. **Cert bloqué en « TRAEFIK DEFAULT CERT »** : DNS pas encore propagé ou Freebox
|
1. **Cert bloqué en « TRAEFIK DEFAULT CERT »** : DNS pas encore propagé ou Freebox
|
||||||
|
|
|
||||||
|
|
@ -77,14 +77,12 @@ table inet filter {
|
||||||
ip daddr 192.168.10.20 tcp dport { 7777, 8888 } ct state new,established,related accept
|
ip daddr 192.168.10.20 tcp dport { 7777, 8888 } ct state new,established,related accept
|
||||||
ip daddr 192.168.10.20 udp dport 7777 ct state new,established,related accept
|
ip daddr 192.168.10.20 udp dport 7777 ct state new,established,related accept
|
||||||
|
|
||||||
# Hub public Authentik (:9081) + portail Guacamole (:9080) — trafic Internet
|
# NOTE : les anciens chemins Internet :9081 (Authentik direct) / :9080 (Guacamole
|
||||||
# DNATé vers les VIPs MetalLB dédiées. Rate-limit sur les connexions neuves :
|
# direct), en HTTP clair vers les VIPs .201/.202, ont été FERMÉS au durcissement
|
||||||
# anti-bruteforce/scan réseau, en plus des protections applicatives. Le LAN
|
# (2026-07-07). Tout passe désormais par funklab.online en HTTPS (ci-dessous).
|
||||||
# domestique n'est pas concerné (règle 192.168.1.0/24 plus haut, hairpin
|
# Les VIPs restent joignables en interne (LAN) ; seul l'accès Internet est retiré.
|
||||||
# Freebox inclus).
|
# Penser à supprimer aussi les redirections Freebox 9080/9081 (elles pointent ici
|
||||||
ip daddr 192.168.10.201 tcp dport 9000 ct state new limit rate 30/minute burst 15 packets accept
|
# dans le vide). Rétablir l'accès : re-DNAT ci-dessous + accept forward.
|
||||||
ip daddr 192.168.10.202 tcp dport 8080 ct state new limit rate 30/minute burst 15 packets accept
|
|
||||||
ip daddr { 192.168.10.201, 192.168.10.202 } ct state established,related accept
|
|
||||||
|
|
||||||
# Domaine public funklab.online — Internet DNATé (80/443) → Traefik (.200).
|
# Domaine public funklab.online — Internet DNATé (80/443) → Traefik (.200).
|
||||||
# Routage par sous-domaine + TLS Let's Encrypt côté Traefik. Rate-limit idem.
|
# Routage par sous-domaine + TLS Let's Encrypt côté Traefik. Rate-limit idem.
|
||||||
|
|
@ -118,10 +116,8 @@ table ip nat {
|
||||||
iif {{ wan_interface }} tcp dport { 7777, 8888 } dnat to 192.168.10.20
|
iif {{ wan_interface }} tcp dport { 7777, 8888 } dnat to 192.168.10.20
|
||||||
iif {{ wan_interface }} udp dport 7777 dnat to 192.168.10.20:7777
|
iif {{ wan_interface }} udp dport 7777 dnat to 192.168.10.20:7777
|
||||||
|
|
||||||
# Hub Authentik + portail Guacamole publics (redirections Freebox → s01)
|
# (Anciens DNAT Internet :9081→Authentik / :9080→Guacamole retirés au
|
||||||
# kaya.freeboxos.fr:9081 → Authentik (VIP .201) ; :9080 → Guacamole (VIP .202)
|
# durcissement 2026-07-07 — tout passe par funklab.online HTTPS ci-dessous.)
|
||||||
iif {{ wan_interface }} tcp dport 9081 dnat to 192.168.10.201:9000
|
|
||||||
iif {{ wan_interface }} tcp dport 9080 dnat to 192.168.10.202:8080
|
|
||||||
|
|
||||||
# funklab.online — Freebox 80/443 → Traefik (routage par sous-domaine + TLS)
|
# funklab.online — Freebox 80/443 → Traefik (routage par sous-domaine + TLS)
|
||||||
iif {{ wan_interface }} tcp dport { 80, 443 } dnat to 192.168.10.200
|
iif {{ wan_interface }} tcp dport { 80, 443 } dnat to 192.168.10.200
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,11 @@ spec:
|
||||||
routes:
|
routes:
|
||||||
- match: Host(`auth.funklab.online`)
|
- match: Host(`auth.funklab.online`)
|
||||||
kind: Rule
|
kind: Rule
|
||||||
|
middlewares:
|
||||||
|
- name: security-headers
|
||||||
|
namespace: infra
|
||||||
|
- name: ratelimit
|
||||||
|
namespace: infra
|
||||||
services:
|
services:
|
||||||
- name: authentik
|
- name: authentik
|
||||||
port: 9000
|
port: 9000
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,14 @@ spec:
|
||||||
# system » (Alkatrazz). Dépannage sans Authentik : "*, openid" + re-sync.
|
# system » (Alkatrazz). Dépannage sans Authentik : "*, openid" + re-sync.
|
||||||
- name: EXTENSION_PRIORITY
|
- name: EXTENSION_PRIORITY
|
||||||
value: "openid, *"
|
value: "openid, *"
|
||||||
|
# Derrière Traefik : lire l'IP client réelle dans X-Forwarded-For (Traefik
|
||||||
|
# la connaît grâce à externalTrafficPolicy: Local). Sans ça, l'anti-bruteforce
|
||||||
|
# voit l'IP du pod Traefik → un ban bloque TOUT LE MONDE (piège n°5). Ici le
|
||||||
|
# ban devient par IP. PROXY_ALLOWED_IPS = CIDR pods k8s (source = Traefik).
|
||||||
|
- name: REMOTE_IP_VALVE_ENABLED
|
||||||
|
value: "true"
|
||||||
|
- name: PROXY_ALLOWED_IPS
|
||||||
|
value: "10.42.0.0/16"
|
||||||
- name: TZ
|
- name: TZ
|
||||||
value: "Europe/Paris"
|
value: "Europe/Paris"
|
||||||
resources:
|
resources:
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,11 @@ spec:
|
||||||
routes:
|
routes:
|
||||||
- match: Host(`portail.funklab.online`)
|
- match: Host(`portail.funklab.online`)
|
||||||
kind: Rule
|
kind: Rule
|
||||||
|
middlewares:
|
||||||
|
- name: security-headers
|
||||||
|
namespace: infra
|
||||||
|
- name: ratelimit
|
||||||
|
namespace: infra
|
||||||
services:
|
services:
|
||||||
- name: guacamole
|
- name: guacamole
|
||||||
port: 8080
|
port: 8080
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,11 @@ spec:
|
||||||
routes:
|
routes:
|
||||||
- match: Host(`n8n.funklab.online`)
|
- match: Host(`n8n.funklab.online`)
|
||||||
kind: Rule
|
kind: Rule
|
||||||
|
middlewares:
|
||||||
|
- name: security-headers
|
||||||
|
namespace: infra
|
||||||
|
- name: ratelimit
|
||||||
|
namespace: infra
|
||||||
services:
|
services:
|
||||||
- name: n8n
|
- name: n8n
|
||||||
port: 5678
|
port: 5678
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,11 @@ spec:
|
||||||
routes:
|
routes:
|
||||||
- match: Host(`openwebui.funklab.online`)
|
- match: Host(`openwebui.funklab.online`)
|
||||||
kind: Rule
|
kind: Rule
|
||||||
|
middlewares:
|
||||||
|
- name: security-headers
|
||||||
|
namespace: infra
|
||||||
|
- name: ratelimit
|
||||||
|
namespace: infra
|
||||||
services:
|
services:
|
||||||
- name: open-webui
|
- name: open-webui
|
||||||
port: 8080
|
port: 8080
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,11 @@ spec:
|
||||||
routes:
|
routes:
|
||||||
- match: Host(`argocd.funklab.online`)
|
- match: Host(`argocd.funklab.online`)
|
||||||
kind: Rule
|
kind: Rule
|
||||||
|
middlewares:
|
||||||
|
- name: security-headers
|
||||||
|
namespace: infra
|
||||||
|
- name: ratelimit
|
||||||
|
namespace: infra
|
||||||
services:
|
services:
|
||||||
- name: argocd-server
|
- name: argocd-server
|
||||||
port: 80
|
port: 80
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,11 @@ spec:
|
||||||
routes:
|
routes:
|
||||||
- match: Host(`grafana.funklab.online`)
|
- match: Host(`grafana.funklab.online`)
|
||||||
kind: Rule
|
kind: Rule
|
||||||
|
middlewares:
|
||||||
|
- name: security-headers
|
||||||
|
namespace: infra
|
||||||
|
- name: ratelimit
|
||||||
|
namespace: infra
|
||||||
services:
|
services:
|
||||||
- name: kube-prometheus-stack-grafana
|
- name: kube-prometheus-stack-grafana
|
||||||
port: 80
|
port: 80
|
||||||
|
|
|
||||||
42
k8s/infra/traefik/middlewares.yaml
Normal file
42
k8s/infra/traefik/middlewares.yaml
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
# Middlewares mutualisés pour les routes publiques funklab.online.
|
||||||
|
# Traefik est HORS ArgoCD → appliquer à la main (comme redirect.yaml) :
|
||||||
|
# kubectl apply -f k8s/infra/traefik/middlewares.yaml
|
||||||
|
# Référencés depuis les IngressRoutes des apps via { name: <m>, namespace: infra }
|
||||||
|
# (nécessite providers.kubernetesCRD.allowCrossNamespace: true dans values.yaml).
|
||||||
|
---
|
||||||
|
# Rate-limit par IP client réelle (dépend de externalTrafficPolicy: Local sur le
|
||||||
|
# service Traefik). Bucket à jetons : ~100 req/min soutenu, pointe (1er chargement
|
||||||
|
# d'assets) jusqu'à 200. Anti-scan / anti-bruteforce volumétrique en bord ; la
|
||||||
|
# protection fine du login reste côté Authentik/Guacamole. Ajustable si 429 gênants.
|
||||||
|
apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: Middleware
|
||||||
|
metadata:
|
||||||
|
name: ratelimit
|
||||||
|
namespace: infra
|
||||||
|
spec:
|
||||||
|
rateLimit:
|
||||||
|
average: 100
|
||||||
|
period: 1m
|
||||||
|
burst: 200
|
||||||
|
# sourceCriterion par défaut = IP distante (remoteAddr) = IP client réelle
|
||||||
|
# grâce à externalTrafficPolicy: Local. Pas de depth XFF (aucun proxy amont
|
||||||
|
# de confiance entre Internet et Traefik : Freebox + DNAT sont en L4).
|
||||||
|
---
|
||||||
|
# En-têtes de sécurité HTTP pour les apps publiques. Attaché uniquement aux routes
|
||||||
|
# funklab.online (pas aux routes internes *.lab.local en HTTP).
|
||||||
|
apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: Middleware
|
||||||
|
metadata:
|
||||||
|
name: security-headers
|
||||||
|
namespace: infra
|
||||||
|
spec:
|
||||||
|
headers:
|
||||||
|
# HSTS 1 an + sous-domaines (tout *.funklab.online est en HTTPS). Pas de preload
|
||||||
|
# (n'engage pas l'apex sur les listes HSTS des navigateurs, réversible).
|
||||||
|
stsSeconds: 31536000
|
||||||
|
stsIncludeSubdomains: true
|
||||||
|
contentTypeNosniff: true
|
||||||
|
browserXssFilter: true
|
||||||
|
referrerPolicy: strict-origin-when-cross-origin
|
||||||
|
# SAMEORIGIN (pas DENY) : Grafana embarque ses propres panels en iframe.
|
||||||
|
customFrameOptionsValue: SAMEORIGIN
|
||||||
19
k8s/infra/traefik/tls-options.yaml
Normal file
19
k8s/infra/traefik/tls-options.yaml
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
# TLSOption globale (nom `default` dans le namespace `default` = appliquée à toutes
|
||||||
|
# les routes TLS qui n'en spécifient pas). Traefik est HORS ArgoCD → à la main :
|
||||||
|
# kubectl apply -f k8s/infra/traefik/tls-options.yaml
|
||||||
|
# Élève le plancher à TLS 1.2 et fixe des ciphers modernes (TLS 1.3 auto, non
|
||||||
|
# configurable). Vérifier ensuite : nmap --script ssl-enum-ciphers -p 443 <host>.
|
||||||
|
apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: TLSOption
|
||||||
|
metadata:
|
||||||
|
name: default
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
minVersion: VersionTLS12
|
||||||
|
cipherSuites:
|
||||||
|
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
|
||||||
|
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
|
||||||
|
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
|
||||||
|
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
|
||||||
|
- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
|
||||||
|
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
|
||||||
|
|
@ -8,9 +8,20 @@
|
||||||
service:
|
service:
|
||||||
type: LoadBalancer
|
type: LoadBalancer
|
||||||
loadBalancerIP: 192.168.10.200 # VIP MetalLB — NE PAS changer
|
loadBalancerIP: 192.168.10.200 # VIP MetalLB — NE PAS changer
|
||||||
|
# Préserve l'IP client réelle jusqu'à Traefik (sinon kube-proxy SNAT en Cluster →
|
||||||
|
# Traefik voit l'IP d'un nœud). Requis pour le rate-limit par IP (middleware
|
||||||
|
# ratelimit) et le X-Forwarded-For propagé aux apps (ban Guacamole par IP).
|
||||||
|
# MetalLB L2 : la VIP n'est annoncée que depuis un nœud portant un pod Traefik prêt.
|
||||||
|
spec:
|
||||||
|
externalTrafficPolicy: Local
|
||||||
ingressRoute:
|
ingressRoute:
|
||||||
dashboard:
|
dashboard:
|
||||||
enabled: true
|
enabled: true
|
||||||
|
# Autorise les IngressRoutes (auth/ai/monitoring/argocd) à référencer les middlewares
|
||||||
|
# mutualisés du namespace infra (ratelimit, security-headers). Défaut Traefik v3 = false.
|
||||||
|
providers:
|
||||||
|
kubernetesCRD:
|
||||||
|
allowCrossNamespace: true
|
||||||
logs:
|
logs:
|
||||||
general:
|
general:
|
||||||
level: INFO
|
level: INFO
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue