Contrôleurs d’admission Kubernetes : guide express

Points clés à retenir sur les contrôleurs d’admission Kubernetes :
  • Les contrôleurs d’admission Kubernetes interceptent les requêtes envoyées au serveur d’API Kubernetes et appliquent des politiques personnalisées pour garantir la sécurité et l’intégrité du cluster.

  • Les contrôleurs d’admission agissent comme des filtres qui évaluent les requêtes entrantes au regard des politiques du cluster, renforçant ainsi la conformité, la gestion des ressources et la sécurité.

  • Les types de contrôleurs d’admission incluent les mutating admission controllers et les validating admission controllers, qui assurent le respect des politiques et contribuent à la sécurité ainsi qu’à la bonne configuration des ressources.

  • Les bonnes pratiques d’utilisation des contrôleurs d’admission incluent la maximisation de leur efficacité, l’intégration dans les pipelines CI/CD, la mise en place de la surveillance et bien plus encore.

Définition des contrôleurs d’admission Kubernetes

Un contrôleur d’admission Kubernetes est un composant logiciel qui intercepte les requêtes adressées au serveur d’API Kubernetes après l’authentification et l’autorisation, mais avant leur persistance dans l’état du cluster.

Les contrôleurs d’admission appliquent des politiques personnalisées aux requêtes entrantes afin que seules les requêtes d’API valides et conformes puissent être exécutées. Cette approche est essentielle pour préserver l’intégrité d’un cluster et maintenir une posture de sécurité robuste.

Que vous utilisiez AWS, Azure ou un autre environnement, voyons comment améliorer votre infrastructure globale. Comment gérer les accès, renforcer la sécurité et optimiser les performances de vos clusters Kubernetes ?

Kubernetes Security Best Practices [Cheat Sheet]

This 6 page cheat sheet goes beyond the basics and covers security best practices for Kubernetes pods, components, and network security.

Types de contrôleurs d’admission

Voici les principaux types de contrôleurs d’admission Kubernetes :

  • Mutating admission controllers : ces contrôleurs valident les requêtes au regard des politiques ou les modifient en ajustant leurs configurations. Cela inclut le MutatingAdmissionWebhook, qui permet d’appliquer une logique personnalisée pour transformer des objets via des webhooks de type mutating correspondants.

  • Validating admission controllers : lorsqu’une requête atteint le serveur d’API Kubernetes, ses métadonnées et son contenu passent par l’authentification et l’autorisation. Cela inclut le ValidatingAdmissionWebhook, qui permet d’exploiter une logique de validation personnalisée via des webhooks de type validating correspondants.

Certains contrôleurs gèrent ces deux fonctions simultanément, ce qui facilite le maintien de la conformité et de la sécurité. Cela renforce également la bonne configuration des ressources au sein du cluster.

Fonctionnement des contrôleurs d’admission Kubernetes

Le processus d’admission joue un rôle crucial dans les mécanismes de gestion des ressources et d’application des politiques de sécurité de Kubernetes. En tant que filtre sophistiqué traitant les requêtes entrantes vers le serveur d’API Kubernetes, les contrôleurs d’admission évaluent la conformité des requêtes aux politiques et aux configurations définies au niveau du cluster.

Figure 1 : phases d’un contrôleur d’admission (Source : Kubernetes)

Les contrôleurs d’admission fonctionnent selon deux modes : validating et mutating. Les validating admission controllers inspectent l’objet de la requête et vérifient sa conformité avec les politiques du cluster, en rejetant celles qui ne remplissent pas les critères définis. De leur côté, les mutating admission controllers peuvent modifier l’objet de la requête avant validation et persistance dans l’état du cluster. Ces contrôleurs injectent notamment des sidecars ou définissent des valeurs par défaut pour des champs non spécifiés. Enfin, certains contrôleurs « tout-en-un » sont capables à la fois de valider et de modifier l’objet de la requête.

Configurations des contrôleurs d’admission

Vous pouvez configurer et utiliser les contrôleurs d’admission Kubernetes de deux manières principales. Chacune répond à des besoins spécifiques en matière de gestion des ressources, de sécurité et d’efficacité administrative :

  • Contrôleurs d’admission intégrés : Kubernetes est livré avec un ensemble de contrôleurs d’admission intégrés activables ou désactivables selon les exigences du cluster. Ils couvrent des fonctionnalités variées, du respect des politiques de sécurité des pods à la gestion des quotas de ressources, en passant par la garantie que toutes les ressources namespacées possèdent les labels requis.

  • Contrôleurs d’admission dynamiques : lorsque les contrôleurs intégrés ne suffisent pas, Kubernetes propose des contrôleurs d’admission dynamiques, implémentés via des webhooks d’admission. Ces webhooks permettent d’introduire une logique personnalisée dans le processus d’admission. Ils font alors respecter des politiques adaptées à vos besoins et contextes de sécurité spécifiques.

Webhooks et configurations de contrôleurs d’admission

Un webhook est une fonction de rappel basée sur HTTP, déclenchée par un événement via une requête HTTP POST. Dans Kubernetes, les webhooks envoient des requêtes d’admission à des services externes à l’endpoint spécifié. Ils permettent aussi au backend de les traiter à l’aide de politiques personnalisées. Ainsi, quand une requête atteint le serveur d’API, celui-ci peut la transmettre à un serveur de webhook. Celui-ci applique une logique personnalisée pour permettre une prise de décision en temps réel et une application dynamique des politiques.

Les webhooks offrent donc un moyen flexible de faire respecter des politiques personnalisées et d’étendre les capacités des contrôleurs d’admission. Leur intégration améliore la personnalisation et la sécurité du cluster, avec un impact direct sur sa gestion et sa protection. En outre, ils interagissent également avec différents groupes d’API Kubernetes pour faire respecter les politiques de sécurité établies.

Intégration avec le serveur d’API Kubernetes

Une intégration transparente avec le serveur d’API Kubernetes renforce l’efficacité des contrôleurs d’admission, qui appliquent des politiques et des contraintes aux workloads. Ainsi, les contrôleurs dynamiques et les webhooks permettent d’aller au-delà des contrôleurs intégrés pour une personnalisation accrue. Ces contrôleurs impactent directement les nœuds en faisant respecter des politiques de ressources ou des contraintes de planification. Cela garantit que les workloads répondent aux exigences opérationnelles et de sécurité.

L’interaction entre les contrôleurs d’admission et le serveur d’API illustre le design extensible et modulaire de Kubernetes. En effet, en permettant aux organisations de personnaliser la sécurité et l’application des politiques, Kubernetes offre la flexibilité nécessaire pour s’adapter à l’évolution des menaces et à la diversité des besoins applicatifs.

L’importance des contrôleurs d’admission

Les contrôleurs d’admission ne sont pas qu’une simple fonctionnalité de Kubernetes : ils constituent une pierre angulaire de la sécurité et de la gestion des clusters. Ils pilotent la gestion des ressources Kubernetes comme les Pods, les Deployments et les ConfigMaps. En automatisant des tâches administratives, en renforçant la sécurité et en optimisant l’allocation des ressources, ils apportent de nombreux bénéfices :

BénéficeDescription
Sécurité Kubernetes renforcéeRenforcer la sécurité des clusters Kubernetes est l’un des rôles principaux des contrôleurs d’admission. En effet, ils constituent une première ligne de défense en scrutant les requêtes entrantes pour vérifier leur conformité aux politiques et standards de sécurité établis. Cette approche proactive réduit sensiblement la surface d’attaque et vous aide à maintenir une posture de sécurité robuste.
Prévention des accès et configurations non autorisésLes contrôleurs d’admission empêchent des accès non autorisés et des configurations susceptibles d’exposer le cluster à des vulnérabilités. Ce niveau de contrôle est essentiel pour répondre aux exigences réglementaires et aux politiques de sécurité de l’organisation.
Gestion du cluster simplifiéeAu-delà de la sécurité, les contrôleurs d’admission simplifient la gestion des clusters Kubernetes. Ainsi, ils automatisent des tâches administratives telles que la définition de demandes et de limites de ressources par défaut, l’application de labels et d’annotations, ainsi que le respect des conventions de nommage.

Dépannage des problèmes courants liés aux contrôleurs d’admission Kubernetes

Des erreurs de configuration de vos contrôleurs d’admission peuvent compromettre leur efficacité et engendrer des problèmes de sécurité.

Voici trois problèmes fréquents et les solutions pour les résoudre en appliquant de bonnes pratiques de sécurité :

1. Erreurs de connexion des webhooks

Si le serveur d’API Kubernetes ne peut pas communiquer avec votre serveur de webhook d’admission, vous pouvez rencontrer un délai d’expiration (timeout) ou une erreur « connection refused ».

Ces problèmes surviennent généralement à cause d’une configuration de service incorrecte, d’un problème de connectivité réseau ou d’une erreur TLS/SSL. Pour les résoudre, vous pouvez :

  • Vérifier que la définition du service du webhook (nom, port cible, etc.) est cohérente avec la ValidatingWebHookConfiguration.

  • Tester la connectivité avec kubectl exec et curl ou wget à l’aide d’un pod dans le même namespace.

  • Contrôler que vos certificats TLS sont valides et correctement configurés.

  • Confirmer que vous disposez des bons logs du serveur d’API et identifier les messages d’erreur détaillés.

Exemple de vérification de la définition d’un service webhook :

echo "Verifying webhook service..."
kubectl get service $WEBHOOK_SERVICE -n $WEBHOOK_NAMESPACE

2. Latence induite par les contrôleurs d’admission

Parfois, les webhooks peuvent provoquer des délais au niveau du runtime lors d’une requête API, ce qui ralentit les déploiements et les opérations. Ces problèmes de latence sont généralement liés à une logique trop complexe, à des ressources limitées ou à un réseau lent.

Pour y remédier, vous pouvez :

  • Profiler les performances des webhooks pour identifier les goulots d’étranglement et améliorer les temps d’exécution.

  • Introduire des mécanismes de mise en cache pour réduire les calculs redondants.

  • Allouer suffisamment de CPU et de mémoire pour absorber la charge de requêtes.

  • Définir des timeouts dans la configuration du webhook pour éviter les délais trop longs.

  • Minimiser la latence entre le serveur d’API et les serveurs de webhooks.

Exemple de définition d’un timeout pour un webhook :

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
webhooks:
- name: my-webhook.example.com
  timeoutSeconds: 5

3. Un contrôleur d’admission bloque des requêtes valides

Dans certaines configurations, des contrôleurs peuvent rejeter des requêtes d’API pourtant valides, empêchant ainsi les déploiements. Cela peut arriver en cas d’erreur dans la politique ou si des exceptions manquent, par exemple, l’absence d’un namespace autorisé.

Vous pouvez réduire ces blocages en suivant les étapes suivantes :

  • Revoir la politique d’admission pour détecter les erreurs de configuration.

  • Consulter les logs des webhooks pour identifier les motifs de rejet.

  • Ajouter des exceptions pour les bonnes ressources ou les bons namespaces.

  • Exploiter l’option --dry-run avec kubectl apply pour tester les changements de politique avant le déploiement.

Exemple de test de modifications de politiques :

kubectl apply --server-dry-run -f your-manifest.yaml

4 bonnes pratiques pour utiliser les contrôleurs d’admission

Pour exploiter pleinement le potentiel des contrôleurs d’admission, adoptez ces quatre bonnes pratiques :

1. Intégrer les contrôleurs aux pipelines CI/CD

L’intégration des contrôleurs d’admission dans les pipelines d’intégration et de déploiement continus (CI/CD) garantit que vous ne déployez que des applications conformes et sécurisées, ce qui réduit les risques de vulnérabilités.

Deux approches principales permettent d’implémenter efficacement cette intégration :

  • Automatiser les contrôles de politiques : intégrez les validations des contrôleurs d’admission dans le pipeline CI/CD pour renforcer votre sécurité. Ainsi, vous pouvez configurer des scripts de pipeline pour inclure ces contrôles de manière cohérente. Des outils comme kubeconform peuvent également valider les fichiers YAML Kubernetes au regard des contrôleurs d’admission du cluster.

  • Faire respecter les politiques : améliorez l’application des politiques en ajoutant un webhook de validation qui applique des politiques personnalisées pendant le processus CI/CD. Ce webhook intercepte les requêtes d’API pertinentes et les valide par rapport à des politiques prédéfinies pour garantir la conformité avant le déploiement.

Le pipeline Jenkins suivant inclut une étape de déploiement qui effectue un dry run du déploiement Kubernetes pour vérifier la conformité aux politiques d’admission. Si le dry run échoue, le pipeline s’arrête et empêche toute violation de politique.

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                // Build steps here
            }
        }
        stage('Test') {
            steps {
                // Test steps here
            }
        }
        stage('Deploy') {
            steps {
                script {
                    def deployStatus = sh(script: "kubectl apply -f k8s-deployment.yaml --dry-run=server", returnStatus: true)
                    if (deployStatus != 0) {
                        error("Deployment failed due to admission policy violation.")
                    }
                    sh("kubectl apply -f k8s-deployment.yaml")
                }
            }
        }
    }
}

2. Assurer haute disponibilité et performances

Des performances optimales et une haute disponibilité des contrôleurs d’admission évitent qu’ils ne deviennent des goulets d’étranglement ou des points de défaillance dans un environnement Kubernetes.

Voici comment maximiser leur efficacité :

  • Mettre en place la redondance : déployez plusieurs instances de serveurs de webhooks derrière un répartiteur de charge pour garantir la redondance et la haute disponibilité.

  • Surveiller les performances : utilisez des outils comme Prometheus et Grafana pour suivre les performances des contrôleurs d’admission et des serveurs de webhooks.

La configuration suivante met en place un webhook de type mutating. Celui-ci oriente les requêtes vers un service capable de répartir la charge entre plusieurs instances de serveurs de webhooks. Cette approche améliore la haute disponibilité en distribuant efficacement la charge.

apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
  name: example-mutating-webhook
webhooks:
  - name: example.webhook.com
    clientConfig:
      service:
        name: webhook-service
        namespace: webhook-namespace
        path: "/mutate"
      caBundle: <CA_BUNDLE>
    rules:
      - operations: ["CREATE", "UPDATE"]
        apiGroups: [""]
        apiVersions: ["v1"]
        resources: ["pods"]
    failurePolicy: Fail
    sideEffects: None
    admissionReviewVersions: ["v1", "v1beta1"]

3. Mettre à jour et auditer régulièrement

La mise à jour régulière de vos contrôleurs d’admission et serveurs de webhooks protège votre système contre des vulnérabilités connues et vous garantit l’accès aux dernières fonctionnalités.

Pour cela, suivez ces étapes clés :

  • Mettre à jour régulièrement : planifiez des mises à jour périodiques des contrôleurs d’admission et des serveurs de webhooks pour maintenir la sécurité et les performances. Vous pouvez aussi exploiter les mises à jour rolling de Kubernetes pour appliquer les changements avec un minimum d’interruption.

  • Vérifier les logs d’audit : examinez et auditez régulièrement les configurations des contrôleurs d’admission et les politiques des webhooks afin de les aligner sur les standards de sécurité actuels et les politiques de l’organisation.

Le CronJob suivant s’exécute quotidiennement et analyse les logs d’audit Kubernetes pour identifier des problèmes de sécurité potentiels ou des violations de politiques :

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: audit-log-analysis
spec:
  schedule: "0 2 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: log-analyzer
            image: log-analyzer:latest
            env:
            - name: LOG_PATH
              value: "/var/log/kubernetes/audit.log"
            volumeMounts:
            - name: log-volume
              mountPath: "/var/log/kubernetes"
          restartPolicy: OnFailure
          volumes:
          - name: log-volume
            hostPath:
              path: "/var/log/kubernetes"

4. Mettre en place la surveillance et la journalisation

Une surveillance et une journalisation efficaces sont indispensables pour suivre l’activité des contrôleurs d’admission, détecter les incidents et maintenir la conformité.

Procédez comme suit :

  • Journaliser les décisions d’admission : assurez-vous que les serveurs de webhooks tracent toutes les décisions d’admission, y compris les motifs de rejet. Pour agréger et analyser les logs, utilisez une solution de journalisation centralisée comme Elastic Stack ou Grafana Loki.

  • Mettre en place des métriques et des alertes : utilisez des outils de surveillance pour créer des tableaux de bord suivant les performances et l’activité des contrôleurs d’admission. Configurez des alertes sur les anomalies ou les problèmes opérationnels.

L’extrait de configuration Fluentd ci-dessous collecte les logs d’un serveur de webhook et les envoie vers un cluster Elasticsearch pour une journalisation et une analyse centralisées :

<source>
  @type tail
  path /var/log/webhook-server.log
  pos_file /var/log/webhook-server.log.pos
  tag webhook.logs
  <parse>
    @type json
  </parse>
</source>

<match webhook.logs>
  @type elasticsearch
  host elasticsearch.logging
  port 9200
  logstash_format true
  logstash_prefix webhook-logs
  flush_interval 10s
</match>

En suivant ces bonnes pratiques, les organisations peuvent utiliser efficacement les contrôleurs d’admission Kubernetes pour renforcer la sécurité des clusters, assurer la conformité et améliorer l’efficacité opérationnelle. Pour des informations de configuration détaillées, les équipes de développement peuvent également consulter la documentation officielle de Kubernetes.

Renforcement de votre contrôle d’admission Kubernetes avec Wiz

Malgré l’existence des contrôleurs d’admission, la sécurisation du plan de contrôle et du plan de données de Kubernetes reste un défi complexe. Comme le souligne Ofir Cohen, CTO en charge de la sécurité des conteneurs chez Wiz : « De nombreux développeurs et ingénieurs DevOps essaient encore de rattraper leur retard sur les identités de workloads, et nous voyons encore des secrets embarqués et de longue durée s’échapper à votre insu dans les images de conteneurs. »

Pour amorcer votre stratégie shift-left (approche préventive en amont du cycle de développement), appliquez les bonnes pratiques Kubernetes. Utilisez une plateforme unifiée de sécurité cloud afin de :

  • éviter les problèmes de sécurité courants ;

  • limiter les retards ;

  • améliorer la posture de sécurité de vos clusters Kubernetes.

La solution la plus simple consiste à adopter une plateforme comme Wiz.

Le contrôleur d’admission Kubernetes de Wiz permet aux organisations d’implémenter plus efficacement une stratégie shift-left et de faire respecter les politiques de sécurité dès l’étape de déploiement. Parmi les fonctionnalités :

  • Politiques de contrôle d’admission Kubernetes granulaires : l’approche de Wiz offre un contrôle plus ciblé et précis des politiques d’admission Kubernetes. Ainsi, votre organisation peut définir des politiques de sécurité spécifiques qui bloquent les déploiements non conformes. Par exemple, vous pouvez empêcher les conteneurs très privilégiés ou restreindre l’accès à des volumes sensibles.

  • Vue centralisée des admission reviews Kubernetes : la plateforme de Wiz fournit des insights sur le processus d’admission review, ce qui permet à vos équipes de comprendre les tentatives de modification et les causes des échecs. Le tableau de bord centralisé suivant met rapidement en évidence les écarts de conformité et de sécurité des déploiements :

  • Surveillance enrichie des événements et création de politiques personnalisées : le contrôleur d’admission de Wiz génère désormais des logs d’événements détaillés pour chaque opération de création, mise à jour, suppression et connexion au sein d’un cluster. En outre, cette capacité détecte aussi les comportements anormaux, comme des tentatives de suppression de ressources critiques ou l’exécution de commandes kubectl exec. Vous pouvez également configurer des alertes personnalisées selon la criticité des événements pour garantir des réponses immédiates aux problèmes majeurs.

  • Une sécurité renforcée au déploiement : la solution de Wiz empêche des auteurs non approuvés d’introduire des risques en limitant les pulls d’images à des registres spécifiques. Par exemple, vous pouvez éliminer les risques liés aux NodePort en refusant les pods exposant des ports de l’hôte, ou prévenir les évasions de conteneur en refusant les pods avec des privilèges root. Votre équipe peut aussi réduire les risques de DDoS en exigeant des limites de ressources.

  • Visibilité et contrôle sur les événements d’admission : Wiz surveille l’ensemble des activités des contrôleurs d’admission pour apporter de la transparence sur les tentatives de déploiement. Ainsi, vos équipes obtiennent des insights sur les violations de politiques avant qu’elles n’impactent votre environnement. Vous conservez des traces d’audit de toutes les décisions pour la conformité et les investigations de sécurité.

Améliorez dès aujourd’hui la sécurité de vos environnements Kubernetes

Les capacités du contrôleur d’admission de Wiz constituent un véritable saut en avant pour la sécurité Kubernetes. En effet, la plateforme fournit aux organisations les outils nécessaires pour faire respecter des politiques de sécurité cohérentes, de la phase de développement jusqu’au déploiement. En intégrant ces contrôles dans les pipelines CI/CD, les développeurs et les équipes de sécurité collaborent plus efficacement, réduisant ainsi le risque de brèches et de non-conformités.

Vous souhaitez exploiter ces nouvelles capacités pour renforcer votre sécurité Kubernetes ? Téléchargez dès aujourd’hui les bonnes pratiques de sécurité Kubernetes de Wiz pour en savoir plus.