Configurer le chargement sécurisé des modules du noyau

Le chargement sécurisé des modules de noyau dans Google Kubernetes Engine (GKE) vous permet d'exécuter des charges de travail qui nécessitent des modules de noyau hors arborescence signés sur des images de système d'exploitation sécurisées et optimisées pour les conteneurs. Le chargement sécurisé des modules de noyau contribue à améliorer la stratégie de sécurité de vos clusters et pools de nœuds en vous offrant plus de contrôle sur le chargement des modules sur les nœuds de processeur ou de TPU avec validation de signature.

Fonctionnement du chargement sécurisé des modules de noyau

Par défaut, les nœuds GKE utilisent différentes images de Container-Optimized OS avec différentes configurations de sécurité, en fonction du type de nœud :

  • Nœuds de processeur et de TPU : utilisez une image de Container-Optimized OS avec le module de sécurité Linux (LSM) Loadpin activé. Loadpin limite le chargement de tout module de noyau hors arborescence. Ce paramètre est sécurisé, mais empêche le chargement des modules hors arborescence.
  • Nœuds GPU : utilisez une image de Container-Optimized OS avec Loadpin désactivé. Ce paramètre permet de charger des modules hors arborescence, tels que l'installation de pilotes NVIDIA, mais il est moins sécurisé par défaut.

Vous activez le chargement sécurisé des modules de noyau à l'aide du paramètre NodeKernelModuleLoading.Policy dans LinuxNodeConfig pour un pool de nœuds ou en transmettant le flag --enable-kernel-module-signature-enforcement lors de la création ou de la mise à jour d'un cluster ou d'un pool de nœuds. Lorsque vous définissez la règle sur ENFORCE_SIGNED_MODULES sur vos pools de nœuds de processeur ou de TPU, Loadpin est activé, mais configuré pour autoriser le chargement des modules de noyau en dehors du système de fichiers racine. Les modules doivent être signés et le système n'autorise que les modules signés par Google.

Quand utiliser le chargement sécurisé des modules de noyau

Utilisez le chargement sécurisé des modules de noyau lorsque vous devez charger des modules de noyau hors arborescence signés par Google, tels que des pilotes personnalisés ou des systèmes de fichiers comme Lustre, sur n'importe quel type de nœud GKE. Cette fonctionnalité vous permet d'utiliser ces modules sans réduire la stratégie de sécurité du nœud. Par exemple, vous pouvez charger un pilote requis sur un nœud de processeur sans avoir à utiliser le type d'image GPU moins restrictif.

Conditions requises et limites

Lorsque vous activez le chargement sécurisé des modules de noyau sur vos pools de nœuds, les conditions requises et limites suivantes s'appliquent :

  • Modules compatibles : seuls les modules hors arborescence signés par Google sont autorisés.
  • cgroup v2 : le pool de nœuds doit utiliser cgroup v2. L'API Kubernetes Engine rejette les requêtes visant à activer cette règle sur les pools de nœuds qui utilisent cgroup v1. Pour en savoir plus, consultez la documentation Kubernetes cgroup.
  • Version GKE : cette fonctionnalité est disponible dans les versions de cluster GKE 1.34.1-gke.2364000 et ultérieures.
  • Types d'images GPU : seules les images de processeur et de TPU sont compatibles avec le chargement sécurisé des modules de noyau. Les GPU ne sont pas compatibles.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

  • Activez l'API Google Kubernetes Engine.
  • Activer l'API Google Kubernetes Engine
  • Si vous souhaitez utiliser la Google Cloud CLI pour cette tâche, installez et initialisez la gcloud CLI. Si vous avez déjà installé la gcloud CLI, obtenez la dernière version en exécutant la commande gcloud components update. Il est possible que les versions antérieures de la gcloud CLI ne permettent pas d'exécuter les commandes de ce document.

Configurer la règle de chargement sécurisé des modules de noyau

Vous pouvez configurer la règle de chargement sécurisé des modules de noyau sur des clusters individuels ou en tant que paramètre de pool de nœuds. Les règles disponibles sont les suivantes :

  • ENFORCE_SIGNED_MODULES: impose que tous les modules de noyau hors arborescence soient signés par Google. Cette règle nécessite que le pool de nœuds utilise cgroup v2.
  • DO_NOT_ENFORCE_SIGNED_MODULES: permet de charger n'importe quel module de noyau, signé ou non. Il s'agit du comportement par défaut.

Si vous ne spécifiez pas de règle, GKE utilise le comportement par défaut, qui n'applique pas les modules signés.

Activer le chargement sécurisé des modules de noyau sur un cluster

Pour activer le chargement sécurisé des modules de noyau sur un cluster, effectuez l'une des étapes suivantes :

  • Pour activer cette fonctionnalité sur un nouveau cluster, exécutez la commande suivante :

    Standard

    gcloud container clusters create CLUSTER_NAME \
       --location=LOCATION \
       --project=PROJECT_ID \
       --enable-kernel-module-signature-enforcement
    

    Autopilot

    gcloud container clusters create-auto CLUSTER_NAME \
       --location=LOCATION \
       --project=PROJECT_ID \
       --enable-kernel-module-signature-enforcement
    

    Remplacez les éléments suivants :

    • CLUSTER_NAME : nom de votre nouveau cluster
    • LOCATION : région ou zone du cluster
    • PROJECT_ID : ID de votre projet
  • Pour activer cette fonctionnalité sur un cluster existant, exécutez la commande suivante :

    gcloud container clusters update CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --enable-kernel-module-signature-enforcement
    

    Remplacez les éléments suivants :

    • CLUSTER_NAME : nom du cluster
    • LOCATION : région ou zone du cluster
    • PROJECT_ID : ID de votre projet

    Lorsque vous mettez à jour un cluster existant, les nœuds sont recréés à la prochaine occasion disponible, sauf si un intervalle de maintenance l'empêche.

Activer le chargement sécurisé des modules de noyau sur un pool de nœuds

Pour activer le chargement sécurisé des modules de noyau sur un pool de nœuds, effectuez l'une des étapes suivantes :

  • Pour activer cette fonctionnalité sur un nouveau pool de nœuds, exécutez la commande suivante :

    gcloud container node-pools create NODEPOOL_NAME \
         --cluster=CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --enable-kernel-module-signature-enforcement
    

    Remplacez les éléments suivants :

    • NODEPOOL_NAME : nom de votre nouveau pool de nœuds.
    • CLUSTER_NAME : nom du cluster
    • LOCATION : région ou zone du cluster
    • PROJECT_ID : ID de votre projet
  • Pour activer cette fonctionnalité sur un pool de nœuds existant, exécutez la commande suivante :

    gcloud container node-pools update NODEPOOL_NAME \
         --cluster=CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --enable-kernel-module-signature-enforcement
    

    Remplacez les éléments suivants :

    • NODEPOOL_NAME : nom du pool de nœuds à mettre à jour.
    • CLUSTER_NAME : nom du cluster
    • LOCATION : région ou zone du cluster
    • PROJECT_ID : ID de votre projet

Vérifier que la règle de chargement sécurisé des modules de noyau est définie

Pour vérifier qu'une règle est définie pour un cluster, exécutez la commande suivante :

gcloud container node-pools describe NODEPOOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID

Dans la sortie, vérifiez la section linuxNodeConfig. Le champ kernelModuleLoading affiche la règle actuelle :

...
config:
  linuxNodeConfig:
    kernelModuleLoading:
      policy: ENFORCE_SIGNED_MODULES
    cgroupMode: CGROUP_MODE_V2

Désactiver le chargement sécurisé des modules de noyau

Pour désactiver le chargement sécurisé des modules de noyau, effectuez l'une des étapes suivantes :

  • Pour désactiver cette fonctionnalité sur un cluster, exécutez la commande suivante :

    gcloud container clusters update CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --no-enable-kernel-module-signature-enforcement
    
  • Pour désactiver cette fonctionnalité sur un pool de nœuds existant, exécutez la commande suivante :

    gcloud container node-pools update NODEPOOL_NAME \
         --cluster=CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --no-enable-kernel-module-signature-enforcement
    

Étape suivante