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

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

9 min de lecture

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 :

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

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.

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

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"]
ConfigurationPrivilegedBaselineRestricted
privileged: true
hostNetwork/PID/IPC
hostPath volumes
Root (UID 0)
allowPrivilegeEscalation
Capabilities dangereuses
Seccomp requis
  • 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