Sie können die Integrität des Compute Engine-Images für virtuelle Maschinen (VM) prüfen, das von Google Kubernetes Engine (GKE) für Steuerungsebenen-VMs verwendet wird. Diese Seite enthält eine Anleitung für ein Sicherheitsteam, das die Logs der Steuerungsebene überwacht, um Folgendes zu prüfen:
- Die Steuerungsebenen-VM wurde mit authentischer Firmware und anderer Bootsoftware gestartet, die durch Secure Boot und Integritätsmonitoring kryptografisch verifiziert wurde.
- Die Steuerungsebenen-VM wurde von einem authentischen GKE-Betriebssystem-Image gestartet.
Sie können diese Prüfung auch für die Betriebssystem-Images und die Bootintegrität Ihrer Knoten durchführen.
Auf dieser Seite wird ein Teil einer Reihe optionaler Funktionen der Steuerungsebene in GKE beschrieben, mit denen Sie Aufgaben wie das Prüfen des Sicherheitsstatus Ihrer Steuerungsebene oder das Konfigurieren der Verschlüsselung und der Signierung von Anmeldedaten in der Steuerungsebene mit von Ihnen verwalteten Schlüsseln ausführen können. Weitere Informationen finden Sie unter Informationen zur GKE-Steuerungsebene-Autorität.
Standardmäßig Google Cloud wendet verschiedene Sicherheitsmaßnahmen auf die verwaltete Steuerungsebene an. Auf dieser Seite werden optionale Funktionen beschrieben, die Ihnen mehr Einblick in die GKE-Steuerungsebene geben oder Ihnen mehr Kontrolle darüber ermöglichen.
VM-Integritätsprüfung
Standardmäßig sind alle GKE-Steuerungsebenen-Instanzen Shielded VMs. Das sind gehärtete VMs, die Sicherheitsfunktionen wie Secure Boot und Measured Boot, ein virtuelles Trusted Platform Module (vTPM) und UEFI-Firmware verwenden. Auf allen GKE-Knoten ist auch aktiviert, Integritätsmonitoring, das die Bootsequenz jeder Shielded VM mit einer Baseline-Bootsequenz vergleicht. Diese Prüfung gibt für jede Phase der Bootsequenz ein Ergebnis zurück und fügt diese Ergebnisse Cloud Logging hinzu. Das Integritätsmonitoring ist in allen GKE-Clustern standardmäßig aktiviert und prüft die folgenden Phasen:
- Frühe Bootsequenz: vom Start der UEFI-Firmware bis zur Übernahme der Steuerung durch den
Bootloader. Wird den VM-Logs als
earlyBootReportEventhinzugefügt. - Späte Startphase: von der Übernahme der Steuerung durch den Bootloader bis zur Übernahme der Steuerung durch den Betriebssystem-Kernel. Wird den VM-Logs als
lateBootReportEventhinzugefügt.
GKE fügt auch Logs zur Erstellung von Steuerungsebenen-VMs zu Logging hinzu. Diese Logs enthalten Metadaten, die die Maschine identifizieren und Details zum VM-Image und zur Bootsequenz enthalten. Google Cloud veröffentlicht eine Zusammenfassung der Verifizierung (Verification Summary Attestation, VSA) für jedes GKE-Steuerungsebenen-VM-Image im gke-vsa-Repository auf GitHub. Die VSA verwendet das in-toto-Framework für Attestierungen. Sie können die Logs der Steuerungsebenen-VM für Ihre Cluster mit den entsprechenden VSAs vergleichen, um zu prüfen, ob die Knoten der Steuerungsebene wie erwartet gestartet wurden.
Durch diese Prüfungen können Sie Folgendes erreichen:
- Sicherstellen, dass die Software auf der Steuerungsebene durch Secure Boot und Integritätsmonitoring geschützt ist, mit dem beabsichtigten Quellcode übereinstimmt und genau dem Image entspricht, das andere Google Cloud Kunden verwenden.
- Mehr Vertrauen in die Art und Weise gewinnen, wie GKE die Steuerungsebene schützt.
Preise
Diese Funktion wird in GKE ohne zusätzliche Kosten angeboten.
Hinweis
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,
installieren und dann
initialisieren Sie die
gcloud CLI. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste
Version mit dem
gcloud components updateBefehl ab. Ältere gcloud CLI-Versionen unterstützen möglicherweise nicht die Ausführung der Befehle in diesem Dokument.
-
Cloud Logging API aktivieren
Erforderliche Rollen zum Aktivieren von APIs
Zum Aktivieren von APIs benötigen Sie die IAM-Rolle „Service Usage-Administrator“ (
roles/serviceusage.serviceUsageAdmin), die die Berechtigungserviceusage.services.enableenthält. Informationen zum Zuweisen von Rollen. - Achten Sie darauf, dass Sie bereits einen GKE Autopilot- oder Standardcluster mit Version 1.29 oder höher haben.
Erforderliche Rollen
Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für Ihr Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Prüfen der Integrität der Steuerungsebenen-VM benötigen:
-
Cluster erstellen und mit ihnen interagieren:
Administrator für Kubernetes Engine-Cluster (
roles/container.clusterAdmin) -
Auf Logs zugreifen und sie verarbeiten:
Loganzeige (
roles/logging.viewer)
Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.
Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.
Auf fehlgeschlagene Phasen der Bootsequenz prüfen
Das Integritätsmonitoring fügt Logging einen Log hinzu, wenn eine Steuerungsebenen-VM eine Phase der Bootsequenz nicht abschließt oder erfolgreich abschließt. Führen Sie die folgenden Befehle aus, um fehlgeschlagene Bootereignisse aufzurufen:
Rufen Sie in der Google Cloud Console die Seite Log-Explorer auf:
Geben Sie im Feld Abfrage die folgende Abfrage ein:
jsonPayload.@type="type.googleapis.com/cloud_integrity.IntegrityEvent" jsonPayload.earlyBootReportEvent.policyEvaluationPassed="false" OR jsonPayload.lateBootReportEvent.policyEvaluationPassed="false" jsonPayload.metadata.isKubernetesControlPlaneVM="true"Sie können auch nach erfolgreichen Bootereignissen suchen, indem Sie
falsein dieser Abfrage durchtrueersetzen.Klicken Sie auf Abfrage ausführen. Wenn keine Ergebnisse angezeigt werden, haben Ihre Steuerungsebenen-VMs alle Prüfungen des Integritätsmonitorings bestanden. Wenn eine Ausgabe angezeigt wird, fahren Sie mit dem nächsten Schritt fort, um den entsprechenden Cluster zu identifizieren.
Kopieren Sie im Log für die fehlgeschlagene Bootintegrität den Wert im Feld
resource.labels.instance_id.Geben Sie im Feld Abfrage die folgende Abfrage ein:
protoPayload.@type="type.googleapis.com/google.cloud.audit.AuditLog" protoPayload.metadata.isKubernetesControlPlaneVM="true" resource.labels.instance_id="INSTANCE_ID" protoPayload.methodName="v1.compute.instances.insert"Ersetzen Sie
INSTANCE_IDdurch den Wert des Feldesinstance_idaus dem vorherigen Schritt.Klicken Sie auf Abfrage ausführen. Der Wert im Feld
protoPayload.metadata.parentResource.parentResourceIdist die GKE-Cluster-ID.Suchen Sie den Namen des GKE-Cluster:
gcloud asset query \ --organization=ORGANIZATION_ID \ --statement="SELECT name FROM container_googleapis_com_Cluster WHERE resource.data.id='CLUSTER_ID';"Ersetzen Sie Folgendes:
ORGANIZATION_ID: die numerische ID Ihrer Google Cloud Organisation.CLUSTER_ID: der Wert des FeldesprotoPayload.metadata.parentResource.parentResourceIdaus dem vorherigen Schritt.
Die Ausgabe sieht etwa so aus:
# lines omitted for clarity //container.googleapis.com/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAMEDiese Ausgabe enthält die folgenden Felder:
PROJECT_ID: Ihre Google Cloud Projekt-ID.LOCATION: Der Standort des Clusters.CLUSTER_NAME: Der Name des Clusters.
Logs der Steuerungsebenen-VM suchen und prüfen
Die Logs zur Erstellung von Compute Engine-VMs, die
GKE-Clustern entsprechen, werden im
_Default Log-Bucket gespeichert.
So suchen Sie die Erstellungslogs für die VMs der Steuerungsebene Ihres Clusters und rufen diese Metadaten ab:
Rufen Sie in der Google Cloud Console die Seite Log-Explorer auf:
Geben Sie im Feld Abfrage die folgende Abfrage ein:
resource.type="gce_instance" protoPayload.methodName="v1.compute.instances.insert" protoPayload.metadata.isKubernetesControlPlaneVM="true"Klicken Sie auf Abfrage ausführen. Wenn keine Ergebnisse angezeigt werden, prüfen Sie, ob Sie alle Anforderungen im Abschnitt Hinweis erfüllen.
Prüfen Sie in den Abfrageergebnissen das Feld
metadata. Die Ausgabe sieht etwa so aus:# fields omitted for clarity "metadata": { "usedResources": { "attachedDisks": [ { "sourceImageId": "9046093115864736653", "sourceImage": "https://www.googleapis.com/compute/v1/projects/1234567890/global/images/gke-1302-gke1627000-cos-113-18244-85-49-c-pre", "isBootDisk": true } # fields omitted for clarityDas Feld
metadataenthält die folgenden Informationen:usedResources: die Liste der Ressourcen, die zum Erstellen der VM verwendet wurden.attachedDisks: das Bootlaufwerk für die VM.sourceImageId: die eindeutige ID des VM-Image.sourceImage: die URL des Quell-VM-Image. Die Syntax des Werts in diesem Feld isthttps://www.googleapis.com/compute/v1/projects/PROJECT_NUMBER/global/images/IMAGE_NAME, wobeiPROJECT_NUMBERdie Nummer des Google Cloud-eigenen Projekts ist, das die Steuerungsebenen-VMs hostet, undIMAGE_NAMEder Name des Image ist, das zum Starten der VM verwendet wurde.isBootDisk: ein boolescher Wert, der angibt, ob dieses Laufwerk als Bootlaufwerk für die VM verwendet wurde.
VSA für Steuerungsebenen-VM-Images suchen und prüfen
In diesem Abschnitt suchen Sie die VSA, die Ihrem Steuerungsebenen-VM-Image entspricht, im gke-vsa-Repository auf GitHub. Anschließend prüfen Sie die VSA mit dem Tool
slsa-verifier, das vom
SLSA-Framework (Supply Chain Levels for Software Artifacts)
bereitgestellt wird. Sie benötigen die folgenden Daten aus dem Log zur Erstellung der Steuerungsebenen-VM:
- Die VM-Image-ID
- Die Projektnummer des Google CloudProjekts, das die VMs hostet
- Der Name des Betriebssystem-Image, das zum Starten der VM verwendet wurde
Die Datei, die Ihrer Steuerungsebenen-VM entspricht, hat das folgende Dateinamenformat:
IMAGE_NAME:IMAGE_ID.intoto.jsonl
Ersetzen Sie Folgendes:
IMAGE_NAME: der Name des VM-Image, der String nach/images/im FeldattachedDisks.sourceImageim VM-Audit-Log aus dem vorherigen Abschnitt. Beispiel:gke-1302-gke1627000-cos-113-18244-85-49-c-pre.IMAGE_ID: die VM-Image-ID, der Wert des FeldesattachedDisks.sourceImageIdim VM-Audit-Log aus dem vorherigen Abschnitt. Beispiel:9046093115864736653.
So suchen und prüfen Sie die VSA, wenn Sie den Dateinamen Ihrer VSA-Datei kennen:
- Öffnen Sie das
gke-vsaGitHub-Repository. - Suchen Sie im Verzeichnis „gke-master-images“ die Datei, die Ihrem VM-Image entspricht. Beispiel:
https://github.com/GoogleCloudPlatform/gke-vsa/blob/main/gke-master-images:78064567238/IMAGE_NAME:IMAGE_ID.intoto.jsonl - Laden Sie die VSA-Datei herunter.
- Installieren Sie das Tool
slsa-verifier. Speichern Sie den öffentlichen Schlüssel zum Prüfen der VSA in einer Datei mit dem Namen
vsa_signing_public_key:Prüfen Sie die VSA:
slsa-verifier verify-vsa \ --attestation-path=PATH_TO_VSA_FILE \ --resource-uri=gce_image://gke-master-images:IMAGE_NAME \ --subject-digest=gce_image_id:IMAGE_ID\ --verifier-id=https://bcid.corp.google.com/verifier/bcid_package_enforcer/v0.1 \ --verified-level=BCID_L1 \ --verified-level=SLSA_BUILD_LEVEL_2 \ --public-key-path=PATH_TO_PUBLIC_KEY_FILE \ --public-key-id=keystore://76574:prod:vsa_signing_public_keyErsetzen Sie Folgendes:
PATH_TO_VSA_FILE: der Pfad zur heruntergeladenen VSA-Datei.IMAGE_NAME: der Name des VM-Image, z. B.gke-1302-gke1627000-cos-113-18244-85-49-c-pre.IMAGE_ID: die VM-Image-ID, z. B.9046093115864736653.
Wenn die VSA die Prüfungen besteht, sieht die Ausgabe so aus:
Verifying VSA: PASSED PASSED: SLSA verification passed