Mit dem sicheren Laden von Kernelmodulen in Google Kubernetes Engine (GKE) können Sie Arbeitslasten, für die signierte, Out-of-Tree-Kernelmodule (OOT) erforderlich sind, auf sicheren, Container-Optimized OS-Images ausführen. Das sichere Laden von Kernelmodulen trägt dazu bei, die Sicherheit Ihrer Cluster und Knotenpools zu verbessern, da Sie durch die Signaturprüfung mehr Kontrolle über das Laden von Modulen auf CPU- oder TPU-Knoten haben.
Funktionsweise des sicheren Ladens von Kernelmodulen
Standardmäßig verwenden GKE-Knoten je nach Knotentyp unterschiedliche Container-Optimized OS-Images mit unterschiedlichen Sicherheitskonfigurationen:
- CPU- und TPU-Knoten: Verwenden Sie ein Container-Optimized OS-Image mit aktiviertem Linux Security Module (LSM) Loadpin. Loadpin schränkt das Laden von OOT-Kernelmodulen ein. Diese Einstellung ist sicher, verhindert aber das Laden von OOT-Modulen.
- GPU-Knoten: Verwenden Sie ein Container-Optimized OS-Image, bei dem Loadpin deaktiviert ist. Mit dieser Einstellung können OOT-Module geladen werden, z. B. zur Installation von NVIDIA-Treibern. Sie ist jedoch standardmäßig weniger sicher.
Sie aktivieren das sichere Laden von Kernelmodulen, indem Sie die Einstellung NodeKernelModuleLoading.Policy in der LinuxNodeConfig für einen Knotenpool verwenden oder das Flag --enable-kernel-module-signature-enforcement beim Erstellen oder Aktualisieren eines Clusters oder Knotenpools übergeben. Wenn Sie die Richtlinie auf ENFORCE_SIGNED_MODULES festlegen, ist Loadpin in Ihren CPU- oder TPU-Knotenpools aktiviert, aber so konfiguriert, dass das Laden von Kernelmodulen von außerhalb des Stammdateisystems zulässig ist. Module müssen signiert sein und das System lässt nur von Google signierte Module zu.
Wann sollte das sichere Laden von Kernelmodulen verwendet werden?
Verwenden Sie das sichere Laden von Kernelmodulen, wenn Sie von Google signierte OOT-Kernelmodule wie benutzerdefinierte Treiber oder Dateisysteme wie Lustre auf einem beliebigen GKE-Knotentyp laden müssen. Mit dieser Funktion können Sie diese Module verwenden, ohne die Sicherheit des Knotens zu beeinträchtigen. So können Sie beispielsweise einen erforderlichen Treiber auf einen CPU-Knoten laden, ohne den weniger restriktiven GPU-Bildtyp verwenden zu müssen.
Anforderungen und Einschränkungen
Wenn Sie das sichere Laden von Kernelmodulen in Ihren Knotenpools aktivieren, gelten die folgenden Anforderungen und Einschränkungen:
- Unterstützte Module: Es sind nur von Google signierte OOT-Module zulässig.
- cgroup v2: Der Knotenpool muss cgroup v2 verwenden. Die Google Kubernetes Engine API lehnt Anfragen zum Aktivieren dieser Richtlinie für Knotenpools ab, die cgroup v1 verwenden. Weitere Informationen finden Sie in der Kubernetes-Dokumentation zu Cgroups.
- GKE-Version: Dieses Feature ist in GKE-Clusterversionen 1.34.1-gke.2364000 und höher verfügbar.
- GPU-Image-Typen: Nur CPU- und TPU-Images unterstützen das sichere Laden von Kernelmodulen. GPUs werden nicht unterstützt.
Hinweise
Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:
- Aktivieren Sie die Google Kubernetes Engine API. Google Kubernetes Engine API aktivieren
- Wenn Sie die Google Cloud CLI für diesen Task verwenden möchten, müssen Sie die gcloud CLI installieren und dann initialisieren. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit dem Befehl
gcloud components updateab. In früheren gcloud CLI-Versionen werden die Befehle in diesem Dokument möglicherweise nicht unterstützt.
Richtlinie zum Laden sicherer Kernelmodule konfigurieren
Sie können die Richtlinie zum Laden sicherer Kernelmodule für einzelne Cluster oder als Knotenpooleinstellung konfigurieren. Folgende Richtlinien sind verfügbar:
ENFORCE_SIGNED_MODULES: Erzwingt, dass alle Out-of-Tree-Kernelmodule von Google signiert werden. Für diese Richtlinie muss der Knotenpool cgroup v2 verwenden.DO_NOT_ENFORCE_SIGNED_MODULES: Ermöglicht das Laden beliebiger Kernel-Module, signiert oder nicht signiert. Das ist das Standardverhalten.
Wenn Sie keine Richtlinie angeben, verwendet GKE das Standardverhalten, bei dem signierte Module nicht erzwungen werden.
Sicheres Laden von Kernelmodulen in einem Cluster aktivieren
Führen Sie einen der folgenden Schritte aus, um das sichere Laden von Kernelmodulen in einem Cluster zu aktivieren:
Führen Sie den folgenden Befehl aus, um die Funktion in einem neuen Cluster zu aktivieren:
Standard
gcloud container clusters create CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementAutopilot
gcloud container clusters create-auto CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementErsetzen Sie Folgendes:
CLUSTER_NAME: Der Name des neuen Clusters.LOCATION: Die Region oder Zone für den Cluster.PROJECT_ID: Ihre Projekt-ID.
Führen Sie den folgenden Befehl aus, um die Funktion in einem vorhandenen Cluster zu aktivieren:
gcloud container clusters update CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementErsetzen Sie Folgendes:
CLUSTER_NAME: Der Name Ihres Clusters.LOCATION: Die Region oder Zone für den Cluster.PROJECT_ID: Ihre Projekt-ID.
Wenn Sie einen vorhandenen Cluster aktualisieren, werden Knoten bei der nächsten verfügbaren Gelegenheit neu erstellt, sofern dies nicht durch ein Wartungsfenster verhindert wird.
Sicheres Laden von Kernelmodulen in einem Knotenpool aktivieren
Führen Sie einen der folgenden Schritte aus, um das sichere Laden von Kernelmodulen in einem Knotenpool zu aktivieren:
Führen Sie den folgenden Befehl aus, um die Funktion in einem neuen Knotenpool zu aktivieren:
gcloud container node-pools create NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementErsetzen Sie Folgendes:
NODEPOOL_NAMEist der Name des neuen Knotenpools.CLUSTER_NAME: Der Name Ihres Clusters.LOCATION: Die Region oder Zone für den Cluster.PROJECT_ID: Ihre Projekt-ID.
Führen Sie den folgenden Befehl aus, um die Funktion für einen vorhandenen Knotenpool zu aktivieren:
gcloud container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementErsetzen Sie Folgendes:
NODEPOOL_NAME: der Name des Knotenpools, der aktualisiert werden soll.CLUSTER_NAME: Der Name Ihres Clusters.LOCATION: Die Region oder Zone für den Cluster.PROJECT_ID: Ihre Projekt-ID.
Prüfen, ob die Richtlinie für das Secure Kernel-Modul festgelegt ist
Führen Sie den folgenden Befehl aus, um zu prüfen, ob eine Richtlinie für einen Cluster festgelegt ist:
gcloud container node-pools describe NODEPOOL_NAME \
--cluster=CLUSTER_NAME \
--location=LOCATION \
--project=PROJECT_ID
Sehen Sie sich in der Ausgabe den Abschnitt linuxNodeConfig an. Im Feld kernelModuleLoading wird die aktuelle Richtlinie angezeigt:
...
config:
linuxNodeConfig:
kernelModuleLoading:
policy: ENFORCE_SIGNED_MODULES
cgroupMode: CGROUP_MODE_V2
Sicheres Laden von Kernelmodulen deaktivieren
Führen Sie einen der folgenden Schritte aus, um das Laden von sicheren Kernelmodulen zu deaktivieren:
Führen Sie den folgenden Befehl aus, um die Funktion in einem Cluster zu deaktivieren:
gcloud container clusters update CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --no-enable-kernel-module-signature-enforcementFühren Sie den folgenden Befehl aus, um die Funktion für einen vorhandenen Knotenpool zu deaktivieren:
gcloud container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --no-enable-kernel-module-signature-enforcement