Aller au contenu
Conteneurs & Orchestration high
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Pod Security Standards (PSS) : sécuriser les workloads Kubernetes

10 min de lecture

Logo Kubernetes

Les Pod Security Standards (PSS) définissent 3 niveaux de restrictions de sécurité pour vos pods Kubernetes : Privileged (aucune restriction), Baseline (bloque les escalades évidentes), et Restricted (hardening maximal). Ce guide vous explique quand utiliser chaque niveau et comment les appliquer sans casser vos applications.

Pod Security Standards (PSS) est le standard officiel Kubernetes pour définir les niveaux de sécurité des pods. Pensez-y comme à des “profils de sécurité prédéfinis” que vous pouvez appliquer à vos namespaces.

Par défaut, Kubernetes autorise des configurations dangereuses. Sans restriction explicite, un développeur peut déployer un pod qui a un accès complet au nœud hôte — ce qui est exactement ce qu’un attaquant recherche.

Voici ce qui est autorisé si vous ne configurez rien :

Configuration par défautRisque
Pod en root (UID 0)Escalade de privilèges si le conteneur est compromis
privileged: true autoriséAccès complet à l’hôte
Montage de / possibleLecture/écriture du système hôte
hostNetwork: true autoriséÉcoute sur les ports de l’hôte

Scénario d’attaque : Un attaquant compromet une application vulnérable dans un pod. Si le pod tourne en root avec privileged: true, l’attaquant peut s’échapper du conteneur, accéder au nœud, puis pivoter vers d’autres nœuds du cluster. Les PSS empêchent ce scénario en bloquant ces configurations dès le déploiement.

Les PSS bloquent ces configurations selon leur niveau de restriction.

Aucune restriction — Ce niveau autorise tout, y compris les configurations les plus dangereuses.

Quand l’utiliser :

  • Namespaces système (kube-system)
  • Outils d’infrastructure (monitoring agents, CNI, CSI drivers)
  • Jamais pour des applications métier
# Ce pod est autorisé en Privileged
apiVersion: v1
kind: Pod
metadata:
name: privileged-pod
spec:
containers:
- name: debug
image: ubuntu
securityContext:
privileged: true # Accès root complet à l'hôte
runAsUser: 0 # Exécution en root

Kubernetes applique les Pod Security Standards via Pod Security Admission (PSA), un admission controller intégré depuis la version 1.25.

PSA offre trois manières d’appliquer un niveau PSS à un namespace. Ces modes peuvent être combinés pour une migration progressive et sécurisée.

ModeComportementUsage
enforceBloque les pods non conformesProduction
auditEnregistre dans les audit logsMigration
warnAffiche un warning à l’utilisateurDéveloppement

Stratégie de migration recommandée :

  1. D’abord warn + audit : Les développeurs voient les warnings, les violations sont loggées, mais rien n’est bloqué. Cela vous donne le temps de corriger les manifests.
  2. Ensuite enforce : Une fois tous les pods conformes, activez le blocage. Toute tentative de déploiement non conforme sera refusée.

Cette approche évite de casser la production du jour au lendemain.

Méthode 1 : Labels sur le namespace

apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
# Applique Restricted en mode enforce
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/enforce-version: latest
# Audit les violations Restricted
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/audit-version: latest
# Avertit pour Restricted
pod-security.kubernetes.io/warn: restricted
pod-security.kubernetes.io/warn-version: latest

Méthode 2 : kubectl label

Fenêtre de terminal
# Appliquer Restricted sur un namespace existant
kubectl label namespace production \
pod-security.kubernetes.io/enforce=restricted \
pod-security.kubernetes.io/warn=restricted \
pod-security.kubernetes.io/audit=restricted
# Vérifier les labels
kubectl get namespace production -o yaml | grep pod-security

Migrer vers Restricted sans casser vos applications

Section intitulée « Migrer vers Restricted sans casser vos applications »
  1. Audit d’abord : identifiez les violations

    Appliquez d’abord en mode audit + warn pour voir ce qui casserait :

    Fenêtre de terminal
    kubectl label namespace monapp \
    pod-security.kubernetes.io/audit=restricted \
    pod-security.kubernetes.io/warn=restricted

    Créez un pod de test et observez les warnings :

    Fenêtre de terminal
    kubectl run test --image=nginx -n monapp
    # Warning: would violate "restricted:latest"...
  2. Corrigez vos Deployments

    Pour chaque violation identifiée, mettez à jour le securityContext :

    spec:
    securityContext:
    runAsNonRoot: true
    seccompProfile:
    type: RuntimeDefault
    containers:
    - name: app
    securityContext:
    allowPrivilegeEscalation: false
    readOnlyRootFilesystem: true
    runAsUser: 1000
    capabilities:
    drop: ["ALL"]
  3. Testez en staging

    Déployez avec les nouveaux securityContext et validez que l’application fonctionne.

  4. Appliquez Restricted en enforce

    Une fois tous les pods conformes :

    Fenêtre de terminal
    kubectl label namespace production \
    pod-security.kubernetes.io/enforce=restricted \
    --overwrite

Erreur 1 : “container has runAsNonRoot and image will run as root”

Section intitulée « Erreur 1 : “container has runAsNonRoot and image will run as root” »

Cause : L’image utilise root mais vous avez runAsNonRoot: true.

Solution :

securityContext:
runAsUser: 1000 # Forcer un UID non-root
runAsGroup: 1000
runAsNonRoot: true

Cause : Le niveau Restricted exige un profil seccomp.

Solution :

spec:
securityContext:
seccompProfile:
type: RuntimeDefault

Cause : Vous n’avez pas droppé toutes les capabilities.

Solution :

containers:
- name: app
securityContext:
capabilities:
drop: ["ALL"]
# Si vraiment nécessaire, ajoutez explicitement :
# add: ["NET_BIND_SERVICE"]

Ce tableau résume ce qui est autorisé ou bloqué à chaque niveau. Utilisez-le comme référence rapide lors de vos audits de sécurité.

ConfigurationPrivilegedBaselineRestricted
privileged: true
hostNetwork/PID/IPC
hostPath volumes
Root (UID 0)
allowPrivilegeEscalation
Capabilities dangereuses
Seccomp requis

Comment lire ce tableau ?

  • Baseline bloque les vulnérabilités critiques (privileged, hostNetwork) mais autorise encore des pratiques risquées (hostPath, root).
  • Restricted va plus loin : il exige un profil seccomp, interdit root, et limite les volumes montés. C’est la posture “zéro confiance” pour vos workloads.
  • Attention à hostPath : Même en Baseline, un attaquant peut monter /etc/shadow s’il contrôle le manifest du pod. C’est pourquoi Restricted est recommandé en production.
  • 3 niveaux : Privileged (tout autorisé), Baseline (bloque le pire), Restricted (hardening maximal)
  • Production = Restricted : C’est le niveau recommandé par la documentation Kubernetes
  • Migration progressive : Utilisez audit et warn avant enforce
  • Pod Security Admission : L’admission controller natif qui applique les PSS via des labels
  • CKS : Les PSS représentent 20% du domaine “Minimize Microservice Vulnerabilities”

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn