Bonnes Pratiques de Sécurité Kubernetes

Kubernetes a révolutionné l'orchestration et la gestion des conteneurs à grande échelle, devenant le standard de facto pour le déploiement des applications cloud-native, mais son architecture distribuée et sa complexité inhérente introduisent une surface d'attaque considérablement élargie par rapport aux modèles de déploiement traditionnels. Un cluster Kubernetes typique implique des dizaines de composants interconnectés - API server, etcd, scheduler, controller manager, kubelet, kube-proxy - chacun avec ses propres vulnérabilités potentielles et ses exigences de hardening spécifiques. La nature dynamique de K8s, où les pods sont constamment créés et détruits, où les workloads migrent entre les nodes, et où les politiques de réseau doivent être appliquées en temps réel, fait de la sécurité un défi multidimensionnel qui exige une approche de défense en profondeur. Les configurations non sécurisées par défaut, telles que des permissions excessivement permissives dans RBAC, l'absence de network policies permettant une communication illimitée entre les pods, des conteneurs exécutés en tant que root avec des capacités privilégiées, et des secrets stockés en texte clair dans un etcd non chiffré, représentent des vecteurs d'attaque couramment exploités dans des environnements K8s mal configurés. Cet article explore les pratiques fondamentales de hardening des clusters Kubernetes, couvrant le contrôle d'accès basé sur les rôles (RBAC), les pod security standards, les network policies pour la micro-segmentation, la gestion sécurisée des secrets, les admission controllers pour le policy enforcement, la surveillance de la sécurité en runtime avec des outils tels que Falco, et la conformité aux benchmarks de l'industrie tels que le CIS Kubernetes Benchmark, fournissant une feuille de route complète pour construire et exploiter des clusters Kubernetes sécurisés dans des environnements de production.

Architecture de Sécurité K8s

Un cluster Kubernetes possède plusieurs composants critiques :

  • Control Plane : API Server, etcd, scheduler, controller manager
  • Nodes : kubelet, kube-proxy, container runtime
  • Add-ons : DNS, dashboard, ingress controllers

RBAC (Role-Based Access Control)

RBAC est le fondement de la sécurité K8s, contrôlant qui peut accéder à quoi via l'API server.

Configuration RBAC

      # Role pour lire les pods dans un namespace spécifique
      apiVersion: rbac.authorization.k8s.io/v1
      kind: Role
      metadata:
      namespace: production
      name: pod-reader
      rules:
      - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get", "list"]
      ---
      # RoleBinding associe le role à un utilisateur
      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
      name: read-pods
      namespace: production
      subjects:
      - kind: User
      name: jane
      apiGroup: rbac.authorization.k8s.io
      roleRef:
      kind: Role
      name: pod-reader
      apiGroup: rbac.authorization.k8s.io
      

Principes RBAC

  • Least privilege : N'accorder que les permissions nécessaires
  • Éviter ClusterAdmin : Créer des rôles spécifiques par fonction
  • Service accounts : Chaque pod doit avoir un SA dédié
  • Namespace isolation : RoleBindings plutôt que ClusterRoleBindings

Pod Security

Pod Security Standards

Kubernetes 1.25+ utilise Pod Security Admission à la place des PSPs dépréciées :

  • Privileged : Sans restriction, pour les workloads de confiance
  • Baseline : Restrictivité minimale, prévient les escalades connues
  • Restricted : Fortement restreint, suit les bonnes pratiques de hardening

Security Context

      apiVersion: v1
      kind: Pod
      metadata:
      name: secure-pod
      spec:
      securityContext:
      runAsNonRoot: true
      runAsUser: 1000
      fsGroup: 2000
      seccompProfile:
      type: RuntimeDefault
      containers:
      - name: app
      image: myapp:latest
      securityContext:
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true
      capabilities:
      drop:
      - ALL
      

Network Policies

Par défaut, les pods peuvent communiquer librement. Les Network Policies implémentent la segmentation :

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
      name: api-allow-from-frontend
      namespace: production
      spec:
      podSelector:
      matchLabels:
      app: api
      policyTypes:
      - Ingress
      ingress:
      - from:
      - podSelector:
      matchLabels:
      app: frontend
      ports:
      - protocol: TCP
      port: 8080
      

Gestion des Secrets

  • Ne jamais coder en dur les secrets : Utiliser Kubernetes Secrets ou des vaults externes
  • etcd encryption : Activer l'encryption-at-rest pour etcd
  • External Secrets Operator : Intégrer avec Vault, AWS Secrets Manager
  • Rotation des secrets : Mettre en place une rotation automatique
  • RBAC pour les secrets : Restreindre qui peut lire les secrets

Image Security

  • Private registries : Ne pas utiliser de registries publics en production
  • Image scanning : Trivy, Clair, Anchore pour le scan de vulnérabilités
  • Image signing : Cosign pour vérifier l'intégrité
  • Admission controllers : Valider les images avant le déploiement
  • Distroless images : Minimiser la surface d'attaque

Admission Controllers

  • OPA/Gatekeeper : Policy-as-code pour la compliance
  • Kyverno : Gestion de politiques native Kubernetes
  • ImagePolicyWebhook : Valider les signatures d'images
  • ResourceQuota : Limiter les ressources par namespace
  • LimitRanger : Imposer des limites de CPU/mémoire

Hardening de l'API Server

  • Activer l'audit logging
  • Utiliser TLS pour toutes les communications
  • Désactiver l'anonymous auth
  • Mettre en place l'API rate limiting
  • Restreindre l'accès à l'API server (network ACLs)

Runtime Security

  • Falco : Détection de menaces en runtime pour K8s
  • Sysdig Secure : Protection en runtime et compliance
  • Aqua Security : Sécurité des conteneurs sur tout le cycle de vie

Compliance et Audit

  • CIS Kubernetes Benchmark : Framework de hardening
  • kube-bench : Vérifications automatisées de compliance CIS
  • kube-hunter : Outil de penetration testing pour K8s
  • Audit logs : Centraliser dans un SIEM pour analyse

Service Mesh Security

Les service meshes (Istio, Linkerd) ajoutent une couche de sécurité :

  • mTLS automatique entre les pods
  • Politiques d'autorisation fine-grained
  • Chiffrement du trafic in transit
  • Observability et auditability

Recommandations Finales

La sécurité K8s est une responsabilité partagée. Mettez en œuvre une défense en couches : RBAC, network policies, pod security, gestion des secrets et runtime protection. Utilisez des outils de compliance automatisés (kube-bench) et surveillez en continu. Formez les équipes à la K8s security - la complexité exige une expertise dédiée.