Funk-lab/k8s/apps/guacamole/deployment.yaml
ALI YESILKAYA fe0aa89ffa
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>
2026-07-07 22:58:24 +02:00

96 lines
3.7 KiB
YAML

apiVersion: apps/v1
kind: Deployment
metadata:
name: guacamole
namespace: auth
spec:
replicas: 1
selector:
matchLabels:
app: guacamole
template:
metadata:
labels:
app: guacamole
spec:
containers:
- name: guacamole
image: guacamole/guacamole:1.6.0
ports:
- containerPort: 8080
env:
- name: GUACD_HOSTNAME
value: "guacd"
- name: GUACD_PORT
value: "4822"
# Base sur storage-01 (schéma posé par le Job guacamole-initdb)
- name: POSTGRESQL_HOSTNAME
value: "192.168.10.1"
- name: POSTGRESQL_DATABASE
value: "guacamole"
- name: POSTGRESQL_USERNAME
value: "guacamole"
- name: POSTGRESQL_PASSWORD
valueFrom:
secretKeyRef:
name: guacamole-secret
key: pg-password
# Les comptes venant d'Authentik sont créés automatiquement dans la base
# (sinon un utilisateur OIDC arrive sans aucune connexion assignable)
- name: POSTGRESQL_AUTO_CREATE_ACCOUNTS
value: "true"
# Servir sur / plutôt que /guacamole
- name: WEBAPP_CONTEXT
value: "ROOT"
# --- SSO OIDC → Authentik (app « guacamole » dans l'UI Authentik) ---
# URL canonique = domaine HTTPS (auth./portail.funklab.online), LAN inclus
# (split-horizon dnsmasq). JWKS : appel serveur→serveur via le Service interne.
- name: OPENID_AUTHORIZATION_ENDPOINT
value: "https://auth.funklab.online/application/o/authorize/"
- name: OPENID_JWKS_ENDPOINT
value: "http://authentik.auth.svc.cluster.local:9000/application/o/guacamole/jwks/"
- name: OPENID_ISSUER
value: "https://auth.funklab.online/application/o/guacamole/"
- name: OPENID_CLIENT_ID
value: "guacamole"
- name: OPENID_REDIRECT_URI
value: "https://portail.funklab.online/"
- name: OPENID_USERNAME_CLAIM_TYPE
value: "preferred_username"
- name: OPENID_SCOPE
value: "openid profile email"
# SSO direct : Authentik est le hub utilisateurs (page « My applications »,
# exposée en :9081) — arriver sur Guacamole = redirection immédiate vers lui.
# guacadmin inaccessible : l'admin passe par le compte SSO « Administer
# system » (Alkatrazz). Dépannage sans Authentik : "*, openid" + re-sync.
- name: EXTENSION_PRIORITY
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
value: "Europe/Paris"
resources:
requests:
cpu: 200m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi
readinessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 30
periodSeconds: 15
livenessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 60
periodSeconds: 30