Ce qui se passe
L'identité de production d'une charge de travail Kubernetes reposait jusqu'ici sur le jeton JWT de compte de service : monté par le kubelet avant le démarrage du conteneur, tenu à jour tout seul, limité par le node restriction admission plugin, et fédérable auprès de tous les grands fournisseurs de cloud.
Avec Kubernetes 1.37, les Pod Certificates et les Cluster Trust Bundles passent en disponibilité générale : l'émission de certificats X.509 pour TLS et mTLS entre dans le cœur du projet.
Pourquoi ça compte
Le jeton de compte de service a un défaut que ses garde-fous n'effacent pas : c'est un jeton porteur. Qui le détient est l'identité qu'il porte — et comme il faut en donner une copie à chaque pair pour s'authentifier auprès de lui, chaque pair peut aussi devenir vous. Le bornage dans le temps, par objet et par audience atténue le risque sans le supprimer.
Un certificat X.509 relève d'une autre famille, celle des preuves de possession : la clé privée reste chez la charge de travail, seule la preuve qu'on la détient circule.
Comment ça marche
Deux nouvelles sources de volume projeté suffisent à câbler tout cela :
podCertificate pour l'identité, clusterTrustBundle pour les ancres de
confiance. Le réordonnancement stable des ancres est délibéré : il empêche une
application de dépendre par accident d'un ordre particulier.
Ce qu'il faut savoir avant d'y aller
- La rotation est automatique, sa prise en compte ne l'est pas. L'application
doit relire les fichiers, par
inotifyou par sondage. Pour éviter les courses de lecture en pleine rotation, le kubelet sait écrire clé privée et chaîne dans un fichier unique (credential bundle) — c'est le mode à préférer. - Les durées de vie sont courtes : 24 heures au maximum pour les signataires qui seront un jour livrés dans le cœur, 91 jours au maximum pour les autres.
- Aucun signataire n'est livré dans le cœur aujourd'hui. Pour essayer, il faut en installer un. L'auteur publie Tinycert, qui fournit un signataire émettant des SAN DNS pour les Services du pod, un signataire compatible SPIFFE identifiant l'espace de noms et le compte de service, et une bibliothèque Go pour charger le tout côté application.
Source : Kubernetes Blog, Kubernetes v1.37: Pod Certificates and Cluster Trust Bundles