tadata
← Retour à l'accueil

Checklist de durcissement Kubernetes : clusters autogérés et EKS, AKS, GKE

#security#kubernetes#cloud#containers#devops

Qui contrôle l'API Kubernetes contrôle toutes les applications du cluster, et bien souvent le compte cloud qui est derrière. Les services managés (EKS, AKS, GKE) prennent en charge le plan de contrôle, mais l'identité, les politiques de charge de travail, les règles réseau, les images et la détection restent de votre ressort : la ligne de responsabilité partagée est plus haute que ne le pensent la plupart des équipes. Cette checklist suit le chemin de l'attaquant : l'API, le pod, le réseau, l'image, les secrets, la détection.

Le modèle de menace en un tableau

CoucheAttaque typiqueContrôle principal
CloudUn pod vole les identifiants du nœud via le service de métadonnéesBloquer l'IMDS depuis les pods, identité de charge de travail par compte de service
Serveur d'APIPoint d'accès public, accès anonyme, RBAC trop largePoint d'accès privé, OIDC pour les humains, RBAC au moindre privilège
PodConteneur privilégié, montage hostPath, utilisateur rootPod Security Admission restricted
RéseauRéseau de cluster à plat, mouvement latéralNetworkPolicy en refus par défaut, contrôle des flux sortants
ImageImage non signée ou vulnérable, tag mutableSignature, vérification à l'admission, digests
SecretsSecrets en base64 dans etcd, variables d'environnement, gitChiffrement KMS, coffre externe
ExécutionShell dans un conteneur, minage de cryptomonnaieFalco ou sonde eBPF équivalente, journaux d'audit
tadata
Component \ Attack classInitial accessPriv. escalationLateral moveData theftPersistence
API server54334
etcd23152
kubelet (10250)45322
Pod / workload45434
Image registry32125
Network / CNI21531
Secrets14453
Exposition de chaque composant (5 = cible principale pour cette classe d'attaque)

Extrait de la fiche « Kubernetes Security » · Demander la fiche complète

1. Identité et RBAC

  • Les humains s'authentifient via le fournisseur d'identité de l'entreprise : access entries EKS reliées aux rôles IAM Identity Center, AKS avec intégration Entra ID et comptes locaux désactivés, GKE avec Google Groups pour le RBAC. Pas de certificats clients pour les personnes : ils ne sont pas révocables.
  • Les charges de travail ont leur propre identité cloud : EKS Pod Identity ou IRSA, AKS Workload Identity, GKE Workload Identity Federation. Jamais le rôle du nœud.
  • Un RBAC sans jokers et sans cluster-admin hors comptes de secours. Certains verbes sont des escalades déguisées : escalate, bind, impersonate, create sur les pods (montage de n'importe quel compte de service), get/list sur les secrets, pods/exec, nodes/proxy.
  • automountServiceAccountToken: false sur les pods qui n'appellent jamais l'API.

Audit rapide :

# Qui est cluster-admin ?
kubectl get clusterrolebindings -o json \
  | jq -r '.items[] | select(.roleRef.name=="cluster-admin") | .subjects[]?'
# Que peut faire le compte de service web ?
kubectl auth can-i --list --as=system:serviceaccount:shop:web

2. Pod Security Admission

Pod Security Admission (intégré, stable depuis la 1.25) applique trois profils standard par namespace : privileged, baseline, restricted. Visez restricted sur tous les namespaces applicatifs, privileged uniquement pour quelques namespaces système (CNI, stockage, agents de supervision).

kubectl label ns shop \
  pod-security.kubernetes.io/enforce=restricted \
  pod-security.kubernetes.io/warn=restricted \
  pod-security.kubernetes.io/audit=restricted

restricted impose un utilisateur non root, allowPrivilegeEscalation: false, la suppression de toutes les capacités, un profil seccomp RuntimeDefault, et interdit les namespaces de l'hôte et les volumes hostPath. Ajoutez un système de fichiers racine en lecture seule dans la spécification du pod.

tadata
  • L1 Privileged — unrestricted; only for CNI (container network plugin), storage and monitoring agents in dedicated namespaces
  • L2 Baseline — blocks known escalations: privileged, host namespaces, hostPath, extra capabilities, unconfined seccomp
  • L3 Restricted — hardening best practice: non-root, no privilege escalation, drop ALL capabilities, RuntimeDefault seccomp
Les Pod Security Standards (PSS), appliqués par namespace par le contrôleur intégré Pod Security Admission (PSA) ; l'ancienne PodSecurityPolicy (PSP) a été retirée en 1.25

Extrait de la fiche « Kubernetes Security » · Demander la fiche complète

3. Politiques réseau

Les namespaces délimitent les noms et le RBAC, pas le réseau : sans politique, chaque pod joint tous les autres. Commencez chaque namespace par un refus par défaut en entrée et en sortie, puis autorisez le DNS et les flux nécessaires. Il faut un CNI qui applique les politiques (Calico, Cilium ou les équivalents managés).

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
  namespace: shop
spec:
  podSelector: {}
  policyTypes: [Ingress, Egress]
  egress:
    - to:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: kube-system
      ports:
        - {protocol: UDP, port: 53}
        - {protocol: TCP, port: 53}

Bloquez l'adresse de métadonnées cloud (169.254.169.254) depuis les pods et, sur les nœuds EKS, imposez IMDSv2 avec une limite de saut à 1.

4. Chaîne d'approvisionnement des images et contrôle d'admission

Ne faites confiance qu'aux images construites par votre pipeline, analysées et signées :

  • images de base minimales (distroless ou slim), épinglées par digest, USER non root ;
  • analyse en CI puis à nouveau dans le registre, car de nouvelles CVE apparaissent chaque jour (Trivy, Grype ou le scanner du registre cloud) ;
  • signature avec Sigstore cosign en mode keyless et attestation SBOM jointe (voir la sécurité de la CI/CD) ;
  • vérification à l'admission : images non signées, registres inconnus et tags latest sont refusés.
Moteur d'admissionAtoutQuand le choisir
ValidatingAdmissionPolicy (intégré, stable en 1.30)Pas de webhook à opérer, expressions CELInvariants simples : labels, registres, pas de latest
KyvernoPolitiques en YAML, mutation/génération, verifyImagesChoix par défaut pour vérifier les signatures sans compétence Rego
OPA GatekeeperPolitiques Rego, réutilisables avec Conftest sur l'IaCVous utilisez déjà OPA ailleurs

Une politique Kyverno qui n'accepte que les images signées par votre workflow de release :

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: verify-signed-images
spec:
  validationFailureAction: Enforce
  rules:
    - name: cosign-keyless
      match:
        any:
          - resources:
              kinds: [Pod]
      verifyImages:
        - imageReferences: ["registry.example.com/*"]
          attestors:
            - entries:
                - keyless:
                    issuer: "https://token.actions.githubusercontent.com"
                    subject: "https://github.com/acme/app/.github/workflows/release.yml@refs/heads/main"

Épinglez exactement l'identité du signataire : une vérification keyless sans sujet ni émetteur accepte n'importe quel compte GitHub. Sur GKE, Binary Authorization remplit le même rôle.

5. Secrets

Les Secrets Kubernetes sont encodés en base64, pas chiffrés. Chiffrez-les au repos avec un fournisseur KMS (activé par défaut ou à un paramètre près sur les services managés), restreignez get/list sur les secrets, et gardez la source de vérité dans un coffre : AWS Secrets Manager, Azure Key Vault, Google Secret Manager ou HashiCorp Vault, synchronisés par External Secrets Operator ou le pilote CSI Secrets Store. Rien dans git, rien en variable d'environnement si un fichier monté convient. Plus de détails dans notre guide de gestion des secrets.

6. Détection à l'exécution et journaux d'audit

  • Journaux d'audit : activez l'audit du plan de contrôle (logs du plan de contrôle EKS, paramètres de diagnostic AKS, Cloud Audit Logs GKE) et envoyez-les au SIEM. Alertez sur pods/exec, les lectures de secrets par des comptes de service applicatifs, les modifications RBAC et les nouveaux webhooks.
  • Sonde d'exécution : Falco (eBPF) avec ses règles par défaut, par exemple Terminal shell in container et Contact K8S API Server From Container ; alternatives : Tetragon, GuardDuty Runtime Monitoring sur EKS, Defender for Containers sur AKS.
  • Réponse : isolez un pod compromis par un label associé à une politique de refus total, mettez le nœud en cordon, préservez les preuves, faites tourner les identifiants du compte de service et du cloud, puis reconstruisez depuis une image signée. Ne jamais supprimer d'abord.

La checklist

#ContrôlePrioritéSpécificités des services managés
1Point d'accès API privé ou liste d'IP autorisées ; pas d'accès anonymeP0Options de cluster privé EKS/AKS/GKE
2OIDC/SSO pour les humains, aucun kubeconfig partagéP0Access entries EKS, Entra ID pour AKS, Groups pour GKE
3Aucun RBAC à joker, cluster-admin réservé aux comptes de secoursP0Revoir aussi les correspondances IAM cloud vers RBAC
4Identité de charge de travail par compte de service ; IMDS bloqué depuis les podsP0Pod Identity/IRSA, Workload Identity AKS/GKE
5PSA restricted sur les namespaces applicatifsP0Identique sur les trois
6NetworkPolicy en refus par défaut, entrée et sortieP1Vérifier que le CNI applique les politiques
7Secrets chiffrés par KMS ; coffre externeP1Intégration KMS propre à chaque fournisseur
8Images épinglées par digest, analysées en CI et dans le registreP1Analyse ECR / ACR / Artifact Registry
9Vérification des signatures à l'admissionP1Kyverno, Gatekeeper ou Binary Authorization (GKE)
10Journaux d'audit du plan de contrôle vers le SIEM, avec alertesP1Désactivés par défaut sur certains services : à activer explicitement
11Détection à l'exécution (Falco ou équivalent managé)P2GuardDuty, Defender for Containers
12Version de Kubernetes supportée, mise à jour automatique des nœudsP2Canaux de release / mise à jour automatique
13Analyse régulière CIS Kubernetes Benchmark (kube-bench)P2Utiliser la variante du benchmark propre au service managé
14Procédure « pod compromis » répétéeP2Inclure la révocation des identifiants cloud

P0 = ce mois-ci, P1 = ce trimestre, P2 = sous six mois. Pour la conception de la plateforme dans son ensemble, voir les patterns Kubernetes et l'architecture zero trust.

Notre accompagnement

Le durcissement de Kubernetes et des clusters managés EKS, AKS et GKE est au cœur de l'offre sécurité cloud et DevSecOps de Tadata, du RBAC aux politiques d'admission, en passant par la chaîne d'approvisionnement et les secrets. Voir notre page cybersécurité ; la bibliothèque de fiches contient des fiches sécurité Kubernetes et contrôle d'admission reprenant les commandes ci-dessus.

Nous utilisons des cookies analytiques pour améliorer votre expérience. Aucune donnée personnelle n'est collectée.