Roadmap
Vue d'ensemble de la progression et des objectifs du projet ProxyAuthK8S
Vue d'ensemble
v0.1.0 — Fondations ✅
Toutes les fonctionnalités de cette version sont terminées et livrées.
CRD & Validation
Création d'une CRD pour stocker les clusters cibles et validation contre des règles définies.
Authentification OIDC
Authentification des utilisateurs via un provider OIDC pour l'UI avec filtrage du dashboard basé sur les groupes utilisateurs.
Interface utilisateur
- Liste des clusters accessibles par l'utilisateur
- Connexion OIDC vers les clusters et affichage du kubeconfig
- Affichage du kubeconfig pour les providers non-OIDC
- Client API auto-généré depuis la documentation Swagger
Controller Kubernetes
- Réconciliation des CRD et mise à jour du statut des clusters
- Gestion des callbacks OIDC
- Haute disponibilité via élection de leader
Backend & Proxy
- API exposée pour l'UI
- Redirection des requêtes vers le bon cluster selon les droits d'accès
- Validation des tokens contre le provider OIDC ou Kubernetes
- Haute disponibilité via stockage d'état dans Redis
- Documentation Swagger auto-générée
CI/CD
- À chaque commit : CodeQL, analyse CVE Rust, Lint front
- Sur TAG (vX.X.X) : Build Docker → GHCR, Helm → GHCR, Draft release GitHub
- Pré-TAG : Format vX.X.X, cog par contributeur humain, changelog obligatoire
v0.2.0 — Documentation & CLI ✅
Livrée en 0.2.0 et 0.2.1.
Documentation
| Guide | Statut |
|---|---|
| Comment déployer ProxyAuthK8S | ✅ Terminé |
| Comment utiliser le plugin Kubectl ProxyAuth | ✅ Terminé |
| Comment utiliser l'UI | ✅ Terminé |
Comment exposer un nouveau cluster (ProxyKubeApi) | ✅ Terminé |
| Environnement de développement CDE (Eclipse Che) | ✅ Terminé |
| Vue d'ensemble de l'architecture | ✅ Terminé |
| Documentation API | ✅ Terminé |
| Comment contribuer | ✅ Terminé |
| Environnement de développement | ✅ Terminé |
| Comment publier une nouvelle version | ✅ Terminé |
Plugin kubectl
Création d'un plugin kubectl (proxyauth) pour faciliter l'utilisation en CLI.
- ✅ Client auto-généré depuis l'OpenAPI spec
- ✅ Installation depuis la release GitHub via mise ; pas de publication sur le Krew Index pour le moment
CI/CD
- ✅ Build du plugin et rendu du manifeste Krew, attachés à la release GitHub lors d'un TAG
Redesign de l'UI
Refonte du front sur le design system BatleHub (« The Proof Sheet ») : tokens, polices auto-hébergées, thèmes clair et sombre, i18n en/fr, WCAG 2.2 AA et en-têtes de sécurité (CSP). Voir la RFC 0002.
- ✅ Refonte UI
Outillage
Sortie de NX et passage à un workspace pnpm orchestré par Taskfile (prérequis de la refonte UI). Voir la RFC 0001.
- ✅ Sortie de NX et workspace pnpm
v0.2.0 — Durcissement du proxy ✅
Prévu en v0.3.0 à v0.5.0, tout est finalement livré dans la 0.2.0 ; l'ordre et les points de synchronisation sont dans le plan de livraison des RFC.
Ports et verbes (breaking)
- ✅ Contournements du filtrage des ports fermés : proxy
pods|services/x:port/proxy,nodes/proxy, règles sansallowed_ports(RFC 0003) - ✅ Règles sensibles au verbe Kubernetes (
verbs), lecture seule implicite sous restriction (RFC 0006) - ✅ Fuzzing des parseurs (workspace
fuzz/, job nightly)
Serveur sur axum
- ✅ Migration d'actix-web vers axum (hyper 1), iso-fonctionnelle, tunnel d'upgrade sur
hyper::upgrade(RFC 0007) ; reste la recette de 7 jours
Exec, attach et audit (breaking)
- ✅ Trace d'audit : schéma versionné, émission garantie, authentification, jetons OAuth, bannissements, fin de session (RFC 0008)
- ✅ Liste blanche des commandes, conteneurs et flux pour
exec/attach, filtre de canaux, audit de session (RFC 0004)
v0.4.0 — Contrôleur et mode agent 🚧
La 0.3.0 (CRD IDE, scan trivy des images) est partie sans la RFC 0011. Le mode agent (RFC 0012, implémentée) est avancé de la v2.0.0 et sort avec elle ; l'échange de jeton (RFC 0010) passe en 0.5.0. L'ordre est dans le plan de livraison des RFC.
Conditions, Events et codes de raison (RFC 0011)
- ✅ Condition
Readystandard (kubectl wait, Argo CD, Flux), colonnesREADYetREASON - ✅ Events Kubernetes à chaque échec et à chaque transition
- ✅ Rythme de reconcile du kit : 5 min, backoff 30 s → 5 min ; métriques de reconcile
Mode Agent (RFC 0012)
- ✅ Un agent installé sur le cluster distant ouvre un tunnel sortant (WebSocket + yamux) vers ProxyAuthK8S : l'apiserver n'a plus à être exposé (guide)
- ✅ TLS de bout en bout entre le proxy et l'apiserver : l'agent ne voit que des octets chiffrés et n'a aucun RBAC
- ✅ Une passerelle d'agents à part (ou dans le pod du proxy) : un redémarrage du proxy ne coupe pas les tunnels
- ✅ Enrôlement par jeton de ServiceAccount projeté (JWKS en ligne, par URL ou depuis un ConfigMap / Secret) ; révocation par
epoch - ✅ Jeton à usage unique (External Secrets + Vault), certificats de votre propre PKI (
ExternalCA: cert-manager, Vault PKI), CronJobjwksPublisher - ✅ Sortie de l'agent par un proxy
CONNECTou SOCKS5 ;tlsMode: passthrough - ✅ Passerelle prête pour la production : PDB, HPA à réduction lente, métriques Prometheus
- ⏳ Condition
AgentConnected(attend un correctif du kit)
v0.4.1 — Versions des agents 🚧
RFC 0013 (.rfc/0013-agent-version-skew.md, Accepted) : sort avant
l'échange de jeton, et corrige des annonces d'agent non validées en 0.4.0.
Versions des agents (RFC 0013)
- ⏳ Protocole négocié entre l'agent et la passerelle, refus explicite d'un protocole inconnu (
AgentProtocolUnsupported) - ⏳ Versions des agents par cluster dans
status.agent, avisAgentVersionSkewau-delà d'une mineure de retard - ⏳ Annonces de l'agent validées avant d'atteindre le statut
v0.5.0 — Authentificateur de confiance ✅
RFC 0014 (.rfc/0014-trusted-authenticator.md, Implemented) ; l'échange de
jeton (RFC 0010) passe en 0.6.0. Mise à jour : vers la 0.5.0.
v0.6.0 — Échange de jeton ✅
RFC 0010 (.rfc/0010-token-exchange.md, Implemented) : livrée sur #332,
prouvée sur le banc d'intégration (§17). Mise à jour : vers la 0.6.0.
Échange de jeton (RFC 0010)
- ✅ Une connexion SSO au proxy, échangée contre un jeton par cluster (fédération d'IdP)
v1.0.0 — Production Ready 🚧
Objectif : rendre ProxyAuthK8S prêt pour la production avec des garanties de sécurité et de fiabilité.
Tests approfondis
- ✅ Tests back (unitaires, intégration, envtest) avec un seuil de couverture en CI
- ✅ Tests front : accessibilité et end-to-end (RFC 0002)
- ✅ Tests profonds côté Rust : faux Redis en mémoire, garde-fous (routes, variantes, contrat OpenAPI), mutants sur les crates de sécurité, couverture à 88 % pour un plancher de 85 (RFC 0015,
.rfc/0015-deep-tests.md, Implemented) - ✅ Suite heavy (écho amont, version précédente à côté) et charge HTTP k6 (RFC 0016,
.rfc/0016-heavy-and-load-tests.md, Implemented)
Redis Cluster HA
- ✅ Support du mode cluster Redis pour la haute disponibilité et le stockage d'état (liste d'URLs ou
REDIS_CLUSTER=true).
Sécurité renforcée
- ✅ Application de
allowed_resourcessur le chemin proxy, y compris par group/version/kind (AllowedCrdConfiguration) - ✅ Autorisation par cluster (
proxy_group) - ✅ Rate limiting et fail2login, adossés à des compteurs Redis
- ✅ Audit de chaque requête proxifiée
- ✅ mTLS entre le proxy et les clusters cibles
- ✅ Règles d'admission CEL sur la CRD
- ✅ Validation locale des JWT contre les authenticators
jwt(validate_against: JwtAuthenticators) - ✅ Récupération de la configuration OIDC depuis des secrets externes (
oidc_provider.config_from) - ✅ Validation des tokens OIDC renforcée
Bascules de défauts (breaking)
- ⏳ Supprimer l'orthographe dépréciée
allowed_ressourcesune fois les ressources migrées versallowed_resources - ⏳
verbsabsent vaut lecture seule (get,list,watch) pour tous (RFC 0006) - ⏳
execabsent : exec interdit sauf règleexecexplicite (RFC 0004)
Qualité
- ⏳ Nettoyage de l'historique Git
- ✅ Méthodes d'installation du plugin dans l'UI : l'installation manuelle télécharge l'archive
kubectl-proxyauth_<version>_<os>_<arch>.tar.gzde la dernière release, l'onglet Homebrew (tap inexistant) est retiré
CI/CD
- ⏳ Publication automatique de la documentation sur GitHub Pages lors d'un TAG
v2.0.0 — Évolutions majeures 🔮
Vision à long terme pour ProxyAuthK8S.
Support Proxy
Ajout de la possibilité de passer par un proxy (ex: Netbird) pour les connexions aux clusters.
Politique fermée par défaut
- Mode
default: denyquandallowed_resourcesest vide (aujourd'hui : tout est autorisé, risque accepté documenté) - Sujets (
users/groups) sur les règlesPath, pour qu'une restriction ne vise pas tout le cluster
Login SSO par device code
Prise en charge de l'OAuth 2.0 Device Authorization Grant (RFC 8628)
pour le login SSO du plugin kubectl quand le navigateur n'est pas sur la machine du plugin
(workspace Eclipse Che, session SSH, conteneur distant) : l'utilisateur ouvre une URL courte sur
n'importe quel appareil et saisit un code, sans redirection vers localhost ni URL à recoller.
Aujourd'hui, ce cas est couvert en collant l'URL de redirection dans le terminal (voir « Navigateur sur une autre machine » dans la page du plugin kubectl) ; le device code en serait la variante la plus confortable.
- IdP : endpoint
device_authorization_endpointannoncé par la discovery (Keycloak, Entra ID, Okta, Dex…) et device grant activé sur le client OIDC de chaque cluster. - Serveur : démarrage du flux et interrogation du token endpoint
(
authorization_pending,slow_down,expired_token), le client secret restant côté serveur comme pour l'échange de code actuel, avec le même contrôleproxy_groupque/auth/login. - Plugin :
login --device-code, ou automatiquement quand le provider le propose et qu'aucun navigateur local n'est utilisable ; affichage de l'URL de vérification et du code.
Hors périmètre ⛔
Décisions prises pour ne pas avoir à les rediscuter.
Authentification par certificat client (admin.conf kubeadm)
Décidé le 2026-10-10 : non retenu. Le cas d'usage était de pointer l'admin.conf généré par
kubeadm (utilisateur client-certificate-data, ex. CN=kubernetes-admin,
O=kubeadm:cluster-admins) vers /clusters/{ns}/{cluster}.
Le proxy termine le TLS et n'a jamais la clé privée de l'utilisateur : il ne peut pas rejouer le certificat vers l'apiserver. Toutes les façons de transmettre l'identité en amont reviennent à ce que le credential du proxy se substitue à celui de l'utilisateur :
- Impersonation (
Impersonate-User/Impersonate-Group) ou front-proxy (X-Remote-User/X-Remote-Group+ certificat front-proxy) : le proxy affirme une identité que l'apiserver ne vérifie pas lui-même, et son credential doit pouvoir endosser les identités les plus privilégiées (system:masters). SubjectAccessReviewpuis requête avec le credential du proxy : la décision d'accès passe de l'apiserver au proxy (traduction URL → attributs RBAC), le credential du proxy doit détenir tous les droits possibles, et l'audit du cluster ne voit que le proxy. UneSelfSubjectReviewne règle rien : « self » est celui qui s'authentifie auprès de l'apiserver, donc le proxy.- TLS passthrough : l'apiserver authentifie bien le certificat, mais le proxy ne voit plus ni chemin ni en-têtes — plus de routage par cluster, plus de politique, de bannissement ni d'audit.
Aucune n'est acceptable pour un certificat client : le proxy n'en a pas la clé et
n'endosserait qu'un nom. Le front-proxy existe depuis, en option par cluster
(upstream_auth.mode: FrontProxy, RFC 0014, guide), mais seulement pour
un utilisateur que le proxy a authentifié par OIDC ou JWT, sous un préfixe. Les admins utilisent leur admin.conf directement contre l'apiserver, ou se connectent via le
proxy avec OIDC. Les en-têtes Impersonate-* et X-Remote-* envoyés par un client restent
systématiquement retirés (voir « En-têtes transmis » dans la page Sécurité).