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

Admission Controllers Kubernetes : valider et modifier vos ressources

9 min de lecture

Les Admission Controllers sont des plugins qui interceptent les requêtes vers l’API Kubernetes après authentification et autorisation, mais avant la persistance dans etcd. Ils peuvent valider (accepter ou refuser) ou muter (modifier) les ressources. Ce mécanisme est la base du policy-as-code sur Kubernetes.

Quand vous créez une ressource avec kubectl apply, la requête traverse plusieurs étapes :

kubectl apply → API Server
Authentication
(Qui êtes-vous ?)
Authorization
(Avez-vous le droit ?)
┌──────────┴──────────┐
▼ ▼
Mutating Validating
Admission Admission
(modifie) (accepte/refuse)
│ │
└──────────┬──────────┘
etcd
(persistance)
TypeRôleExemple
MutatingModifie la ressource avant persistanceInjecter un sidecar, ajouter des labels
ValidatingAccepte ou refuse la ressourceBloquer les pods privileged, exiger des labels

Kubernetes inclut de nombreux admission controllers activés par défaut. Voici les plus importants pour la sécurité :

ContrôleurTypeRôleActivé par défaut
PodSecurityValidatingApplique les Pod Security Standards
NodeRestrictionValidatingLimite ce que les kubelets peuvent modifier
ServiceAccountMutatingInjecte le token ServiceAccount
AlwaysPullImagesMutatingForce imagePullPolicy: Always
ContrôleurTypeRôleActivé par défaut
LimitRangerMutating + ValidatingApplique les limites par défaut
ResourceQuotaValidatingVérifie les quotas namespace
DefaultStorageClassMutatingAjoute la StorageClass par défaut
Fenêtre de terminal
# Contrôleurs activés sur l'API Server
kubectl get pods -n kube-system kube-apiserver-* -o yaml | \
grep -A1 "enable-admission-plugins"
# Ou via le manifest (kubeadm)
cat /etc/kubernetes/manifests/kube-apiserver.yaml | \
grep enable-admission-plugins

Le Pod Security Admission est l’admission controller qui applique les Pod Security Standards. Il est activé par défaut depuis Kubernetes 1.25.

PSA se configure via des labels sur les namespaces :

apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
# Niveau à appliquer
pod-security.kubernetes.io/enforce: restricted
# Version du standard (latest ou v1.xx)
pod-security.kubernetes.io/enforce-version: latest
# Mode audit (logs uniquement)
pod-security.kubernetes.io/audit: restricted
# Mode warn (affiche un warning)
pod-security.kubernetes.io/warn: restricted

Certains workloads système nécessitent des privilèges (CNI, monitoring). Exemptez-les dans la configuration :

# /etc/kubernetes/psa.yaml (fichier de config API Server)
apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: PodSecurity
configuration:
apiVersion: pod-security.admission.config.k8s.io/v1
kind: PodSecurityConfiguration
defaults:
enforce: "baseline"
enforce-version: "latest"
exemptions:
usernames: []
runtimeClasses: []
namespaces:
- kube-system
- kube-node-lease

Au-delà des contrôleurs intégrés, vous pouvez créer vos propres admission controllers via des webhooks.

Refuse les ressources non conformes :

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
name: require-labels
webhooks:
- name: require-labels.example.com
clientConfig:
service:
name: label-validator
namespace: admission
path: /validate
caBundle: ${CA_BUNDLE}
rules:
- apiGroups: [""]
apiVersions: ["v1"]
operations: ["CREATE", "UPDATE"]
resources: ["pods"]
admissionReviewVersions: ["v1"]
sideEffects: None
failurePolicy: Fail # Refuse si le webhook est indisponible

Modifie automatiquement les ressources :

apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
name: inject-sidecar
webhooks:
- name: inject-sidecar.example.com
clientConfig:
service:
name: sidecar-injector
namespace: admission
path: /mutate
caBundle: ${CA_BUNDLE}
rules:
- apiGroups: [""]
apiVersions: ["v1"]
operations: ["CREATE"]
resources: ["pods"]
admissionReviewVersions: ["v1"]
sideEffects: None
failurePolicy: Ignore # Accepte si le webhook est indisponible

Depuis Kubernetes 1.30, ValidatingAdmissionPolicy permet de créer des politiques de validation sans webhook externe, directement avec des expressions CEL.

CritèreWebhooksValidatingAdmissionPolicy
Dépendance externeOui (service à maintenir)Non (natif)
LatenceVariable (appel réseau)Minimale
LangageGo, Python, etc.CEL
ComplexitéÉlevéeFaible à moyenne
Depuis K8s1.9+1.30+ (stable)
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicy
metadata:
name: deny-privileged
spec:
failurePolicy: Fail
matchConstraints:
resourceRules:
- apiGroups: [""]
apiVersions: ["v1"]
operations: ["CREATE", "UPDATE"]
resources: ["pods"]
validations:
- expression: "!object.spec.containers.exists(c, c.securityContext.privileged == true)"
message: "Les conteneurs privileged sont interdits"
---
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicyBinding
metadata:
name: deny-privileged-binding
spec:
policyName: deny-privileged
validationActions:
- Deny
matchResources:
namespaceSelector:
matchExpressions:
- key: environment
operator: In
values: ["production"]
SolutionTypeLangageCourbe d’apprentissageCKS
Pod Security AdmissionIntégréLabelsFacile
ValidatingAdmissionPolicyIntégréCELMoyenne
KyvernoAdd-onYAMLFacile⚠️
OPA GatekeeperAdd-onRegoDifficile⚠️
Fenêtre de terminal
# Webhooks de validation
kubectl get validatingwebhookconfigurations
# Webhooks de mutation
kubectl get mutatingwebhookconfigurations
# Détail d'un webhook
kubectl describe validatingwebhookconfiguration <name>

“connection refused” ou timeout

Le webhook n’est pas accessible. Vérifiez :

  1. Le service existe et a des endpoints
  2. Le certificat CA est correct
  3. Le NetworkPolicy autorise le trafic depuis l’API Server
Fenêtre de terminal
kubectl get endpoints -n <namespace> <service-name>
kubectl describe service -n <namespace> <service-name>

“failed to call webhook”

Le webhook retourne une erreur. Vérifiez les logs :

Fenêtre de terminal
kubectl logs -n <namespace> -l app=<webhook-app>
  • Admission Controllers : plugins qui interceptent les requêtes API avant persistance
  • Mutating (modifie) → Validating (accepte/refuse) → etcd
  • Pod Security Admission : contrôleur intégré pour les Pod Security Standards
  • ValidatingAdmissionPolicy (K8s 1.30+) : validation native en CEL, sans webhook
  • Webhooks : pour des cas complexes nécessitant de la logique métier
  • CKS : focus sur PSA et VAP (natives), pas sur Kyverno/Gatekeeper

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