Clustermetadaten schützen


Übersicht

Google Kubernetes Engine (GKE) verwendet Instanzmetadaten, um virtuelle Knotenmaschinen (VMs) zu konfigurieren. Einige dieser Metadaten sind jedoch möglicherweise vertraulich und sollten vor Arbeitslasten geschützt werden, die auf dem Cluster ausgeführt werden.

Hinweis

Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:

  • Achten Sie darauf, dass die Google Kubernetes Engine API aktiviert ist.
  • Google Kubernetes Engine API aktivieren
  • Prüfen Sie, ob das Cloud SDK installiert ist.
  • Mit den folgenden Methoden können Sie die Standardeinstellungen für das gcloud-Befehlszeilentool für Ihr Projekt einrichten:
    • Verwenden Sie gcloud init, wenn Sie die erforderlichen Standardeinstellungen für Projekte festlegen möchten.
    • Verwenden Sie gcloud config, um Ihre Projekt-ID, Zone und Region individuell festzulegen.

    gcloud init

    1. Führen Sie gcloud init aus und folgen Sie der Anleitung:

      gcloud init

      Wenn Sie SSH auf einem Remote-Server verwenden, können Sie mit dem Flag --console-only verhindern, dass mit dem Befehl ein Browserfenster geöffnet wird:

      gcloud init --console-only
    2. Folgen Sie der Anleitung, um das gcloud-Tool zur Verwendung Ihres Google Cloud-Kontos zu autorisieren.
    3. Erstellen Sie eine neue Konfiguration oder wählen Sie eine vorhandene aus.
    4. Wählen Sie ein Google Cloud-Projekt aus.
    5. Wählen Sie eine Compute Engine-Standardzone aus.
    6. Wählen Sie eine Compute Engine-Standardregion aus.

    gcloud config

    1. Legen Sie Ihre standardmäßige Projekt-ID fest:
      gcloud config set project PROJECT_ID
    2. Legen Sie Ihre standardmäßige Compute Engine-Region fest (z. B. us-central1):
      gcloud config set compute/region COMPUTE_REGION
    3. Legen Sie Ihre standardmäßige Compute Engine-Zone fest (z. B. us-central1-c):
      gcloud config set compute/zone COMPUTE_ZONE
    4. Aktualisieren Sie gcloud auf die neueste Version:
      gcloud components update

    Durch Festlegen von Standardspeicherorten können Sie Fehler im gcloud-Tool wie die folgenden vermeiden: One of [--zone, --region] must be supplied: Please specify location.

Knotendienstkonto konfigurieren

Die Dienstkonto-Anmeldedaten jedes Knotens sind weiterhin für Arbeitslasten verfügbar. Standardmäßig verwenden Ihre Knoten das Compute Engine-Standarddienstkonto. Sie sollten ein Dienstkonto mit minimalen Berechtigungen für Ihre Knoten konfigurieren, das anstelle des Compute Engine-Standarddienstkontos verwendet werden sollen. Hängen Sie dann dieses Dienstkonto an Ihre Knoten an, damit ein Angreifer den GKE-Metadatenschutz nicht umgehen kann, indem er die Compute Engine API für den direkten Zugriff auf die zugrunde liegenden VM-Instanzen verwendet.

Weitere Informationen finden Sie unter Dienstkonten mit minimalen Berechtigungen verwenden.

Führen Sie die folgenden Schritte aus, um ein Dienstkonto mit minimalen Berechtigungen zu erstellen:

  1. Erstellen Sie ein neues IAM-Dienstkonto (Identity and Access Management) und speichern Sie die E-Mail-Adresse in einer Umgebungsvariablen:

    gcloud iam service-accounts create NODE_SA_NAME \
        --display-name="DISPLAY_NAME"
    export NODE_SA_EMAIL=$(gcloud iam service-accounts list --format='value(email)' \
        --filter='displayName:DISPLAY_NAME')
    

    Dabei gilt:

    • NODE_SA_NAME ist der Name des neuen Knotendienstkontos.
    • DISPLAY_NAME ist der Anzeigename des neuen Dienstkontos.

    Die E-Mail-Adresse des Knotendienstkontos hat das Format NODE_SA_NAME@PROJECT_ID.iam.gserviceaccount.com.

  2. Konfigurieren Sie Ihr Dienstkonto mit den Mindestrollen und -berechtigungen, um Ihre GKE-Knoten auszuführen:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/monitoring.metricWriter
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/monitoring.viewer
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/logging.logWriter
    

    Ersetzen Sie PROJECT_ID durch Ihre Google Cloud-Projekt-ID.

    Wenn Ihr Cluster private Images aus Artifact Registry abruft, fügen Sie außerdem die Rolle roles/artifactregistry.reader hinzu:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/artifactregistry.reader
    

Metadatenverbergung

Die GKE-Metadatenverbergung schützt einige potenziell vertrauliche Systemmetadaten vor Nutzerarbeitslasten, die in Ihrem Cluster ausgeführt werden.

Ab Kubernetes Version 1.9.3 können Sie Metadaten verbergen. Sie verhindern dadurch den Zugriff von Nutzer-Pods auf bestimmte VM-Metadaten für Clusterknoten wie Kubelet-Anmeldedaten und VM-Instanzinformationen. Die Metadatenverbergung schützt insbesondere vor dem Zugriff auf kube-env, das Kubelet-Anmeldedaten enthält, sowie auf das Instanzidentitätstoken der VM.

Die Metadatenverbergung schirmt den Clustermetadatenserver mit einer Firewall vor Traffic von Nutzer-Pods ab. Diese Pods werden nicht auf HostNetwork ausgeführt. Dadurch sind nur sichere Abfragen möglich. Die Firewall verhindert, dass Nutzer-Pods Kubelet-Anmeldedaten für Berechtigungsausweitungsangriffe oder die VM-Identität für Instanzausweitungsangriffe verwenden.

Sie können die Metadatenverbergung nur aktivieren, wenn Sie einen neuen Cluster erstellen oder einem vorhandenen Cluster einen neuen Knotenpool hinzufügen.

Beschränkungen

  • Die Metadatenverbergung schützt nur den Zugriff auf kube-env und die Instanzidentitätstoken des Knotens.
  • Mit der Metadatenverbergung wird nicht der Zugriff auf das Dienstkonto des Knotens beschränkt.
  • Mit der Metadatenverbergung wird nicht der Zugriff auf andere zugehörige Instanzmetadaten beschränkt.
  • Mit der Metadatenverbergung wird nicht der Zugriff auf andere Legacy-Metadaten-APIs beschränkt.

Neuen Cluster oder Knotenpool mit Metadatenverbergung erstellen

Nachdem Sie ein Dienstkonto erstellt haben, können Sie mit dem gcloud-Befehlszeilentool einen neuen Cluster erstellen, wobei die Metadatenverbergung aktiviert ist.

Führen Sie den folgenden Befehl aus, um einen Cluster mit aktivierter Metadatenverbergung zu erstellen:

gcloud beta container clusters create CLUSTER_NAME \
  --workload-metadata-from-node=SECURE \
  --service-account=$NODE_SA_EMAIL

Ersetzen Sie dabei CLUSTER_NAME durch den Namen des neuen Clusters.

Das Flag --workload-metadata-from-node hat folgende Werte:

  • SECURE: Metadatenverbergung aktivieren.
  • EXPOSED oder UNSPECIFIED: Metadatenverbergung deaktivieren

Metadaten eines Identitätstokens prüfen, die vor der Arbeitslast eines Clusters verborgen sind

Wenn Sie Metadaten verbergen, sollte es nicht möglich sein, über das Instanzidentitätstoken des Knotens eine Signatur anzufordern. Sie können prüfen, ob Nutzer bei Anfragen ausdrücklich über verborgene Metadaten informiert werden. Führen Sie dazu den Befehl curl in einem Pod aus.

curl -H "Metadata-Flavor: Google" \
'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://www.example.com'

Die entsprechende Ausgabe sieht etwa so aus:

This metadata endpoint is concealed.

Legacy-Metadaten-APIs deaktivieren und davon umstellen

Die Compute Engine-Metadatenserver-Endpunkte v0.1 und v1beta1 wurden verworfen und am 30. September 2020 eingestellt.

Informationen zum Zeitplan für die Einstellung finden Sie unter Einstellung der Metadatenserver-Endpunkte v0.1 und v1beta1.

Nächste Schritte