Contactez-nous

Sécurisation de la communication intra-cluster (mTLS)

Apprenez à chiffrer et authentifier les communications entre les composants Kubernetes (API Server, Kubelet, etcd...) via mTLS pour une sécurité renforcée.

Au-delà des frontières : sécuriser les échanges internes

Après avoir renforcé les composants critiques du Control Plane comme l'API Server et etcd, l'étape suivante pour une sécurité en profondeur consiste à sécuriser les canaux de communication entre les différents composants du cluster Kubernetes. Même si les points d'extrémité sont protégés, une communication interceptée ou usurpée sur le réseau interne peut toujours présenter des risques significatifs.

Par défaut, Kubernetes met en place des mesures pour sécuriser certaines communications clés (comme l'accès à l'API Server via TLS). Cependant, il est crucial de s'assurer que toutes les communications sensibles entre les composants maîtres (API Server, etcd, controller manager, scheduler) et entre les maîtres et les noeuds workers (API Server <-> Kubelet) sont non seulement chiffrées pour garantir la confidentialité, mais aussi mutuellement authentifiées pour prévenir l'usurpation d'identité (spoofing).

Le mécanisme standard pour atteindre cet objectif est le TLS Mutuel (mTLS). Contrairement au TLS standard où seul le serveur prouve son identité au client, mTLS exige que le client et le serveur vérifient mutuellement leurs identités à l'aide de certificats avant d'établir une connexion sécurisée.

mTLS expliqué : l'authentification bidirectionnelle

Rappelons brièvement le fonctionnement du TLS standard (souvent utilisé pour HTTPS) : le client vérifie le certificat du serveur pour s'assurer qu'il parle bien au bon serveur (authentification du serveur) et établit ensuite un canal chiffré. Le serveur, lui, ne vérifie pas forcément l'identité du client (l'authentification client se fait souvent à une couche supérieure, comme avec un login/mot de passe).

Le mTLS va plus loin en ajoutant une étape d'authentification du client. Le processus simplifié est le suivant :

  1. Le client initie la connexion et vérifie le certificat du serveur (comme en TLS standard).
  2. Le serveur demande ensuite au client de présenter son propre certificat.
  3. Le client envoie son certificat et une preuve de possession de la clé privée associée.
  4. Le serveur vérifie le certificat du client (signé par une autorité de confiance reconnue par le serveur).
  5. Si les deux vérifications réussissent, un canal chiffré est établi, et les deux parties sont assurées de l'identité de leur interlocuteur.

Dans le contexte de Kubernetes, cela signifie que non seulement le Kubelet peut être sûr qu'il parle au véritable API Server, mais l'API Server peut également être sûr qu'il parle à un Kubelet légitime (et vice-versa), ou que les membres etcd ne communiquent qu'entre eux.

Où appliquer mTLS dans Kubernetes ?

Le mTLS est essentiel pour sécuriser plusieurs chemins de communication critiques au sein du cluster :

  • API Server <-> etcd : Comme mentionné en 18.1, l'API Server doit s'authentifier auprès d'etcd via un certificat client, et etcd doit présenter un certificat serveur valide. C'est une application directe de mTLS.
  • etcd <-> etcd (Peers) : La communication entre les différents membres du cluster etcd pour la réplication et le consensus doit également être sécurisée via mTLS pour éviter qu'un faux membre ne rejoigne le cluster ou n'intercepte les données.
  • API Server <-> Kubelet : C'est une communication bidirectionnelle. L'API Server contacte le Kubelet (par exemple, pour récupérer des logs, exécuter des commandes via `kubectl exec`, ou pour les port-forwards). Le Kubelet contacte l'API Server (pour surveiller les changements sur les Pods qui lui sont assignés, rapporter l'état du noeud et des Pods). Les deux sens de cette communication doivent être sécurisés par mTLS. L'API Server vérifie le certificat du Kubelet, et le Kubelet vérifie celui de l'API Server.
  • API Server <-> Webhooks d'Admission/Conversion : Lorsque l'API Server appelle des webhooks (qui sont souvent des Pods dans le cluster) pour la validation, la mutation ou la conversion de ressources, il est crucial que cette communication soit sécurisée via TLS. Idéalement, l'API Server devrait aussi vérifier l'identité du serveur webhook (via TLS standard, en s'assurant que le certificat du webhook est signé par une CA de confiance, souvent configurée via `caBundle` dans la configuration du webhook). Bien que ce ne soit pas strictement mTLS dans le sens client->serveur, la sécurisation de ce canal est vitale.

La sécurisation de la communication Pod-à-Pod est généralement gérée à un niveau différent, souvent par des solutions de Service Mesh comme Istio ou Linkerd, qui déploient des proxys sidecar et établissent automatiquement des connexions mTLS entre les services applicatifs. Bien que ce soit un sujet avancé distinct, il repose sur le même principe fondamental de mTLS pour sécuriser le trafic interne.

Mise en place et gestion de la PKI

La mise en oeuvre de mTLS repose entièrement sur une Infrastructure à Clé Publique (PKI - Public Key Infrastructure) robuste. Cela implique :

  • Une Autorité de Certification (CA) racine : C'est l'entité de confiance ultime qui signe les certificats. Sa clé privée doit être protégée de manière extrêmement sécurisée.
  • Des Certificats pour chaque composant : Chaque serveur (API Server, etcd, Kubelets) et chaque client (API Server agissant comme client d'etcd ou de Kubelet, Kubelets agissant comme clients de l'API Server) doit posséder sa propre paire clé privée/certificat signé par la CA (ou une CA intermédiaire).
  • Configuration des composants : Chaque composant doit être configuré pour :
    • Utiliser son propre certificat et sa clé privée pour prouver son identité (ex: flags --tls-cert-file, --tls-private-key-file pour l'API Server, --cert-file, --key-file pour etcd, --kubeconfig pour Kubelet pointant vers ses credentials).
    • Faire confiance à la CA racine (ou aux CA appropriées) pour valider les certificats présentés par l'autre partie (ex: flags --client-ca-file pour l'API Server et etcd, --etcd-cafile pour l'API Server, certificate-authority-data dans le kubeconfig du Kubelet).

La gestion de cette PKI (génération, distribution, renouvellement avant expiration, révocation des certificats compromis) est une tâche complexe mais critique. Des outils comme kubeadm facilitent la génération initiale lors de la création du cluster. Pour la gestion continue, des outils comme cfssl, des solutions de gestion de certificats internes, ou des intégrations avec des PKI d'entreprise peuvent être utilisés. Le contrôleur `kube-controller-manager` gère également un processus d'approbation et de signature de certificats pour les Kubelets (Certificate Signing Requests - CSR).

Avantages et conclusion

La mise en place systématique du mTLS pour les communications intra-cluster apporte des avantages significatifs en matière de sécurité :

  • Authentification forte : Assure que seuls les composants légitimes et autorisés peuvent communiquer entre eux.
  • Confidentialité : Chiffre les données sensibles transitant sur le réseau interne.
  • Intégrité : Protège contre la modification des données en transit.
  • Prévention du Spoofing : Empêche des acteurs malveillants d'usurper l'identité d'un composant légitime.

Combiné à la sécurisation des composants eux-mêmes (comme vu en 18.1) et à la segmentation réseau via les Network Policies (qui contrôlent *qui* a le droit d'initier une connexion), le mTLS forme une couche de défense essentielle pour protéger les artères vitales de votre cluster Kubernetes contre les menaces internes et les mouvements latéraux d'attaquants.