Clustermetadaten schützen

Übersicht

GKE verwendet Instanzmetadaten, um Knoten-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.

Vorbereitung

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

Mit den folgenden Methoden können Sie die gcloud-Einstellungen festlegen:

  • Verwenden Sie gcloud init, wenn Sie die Standardeinstellungen ansehen möchten.
  • Verwenden Sie gcloud config, um Ihre Projekt-ID, Zone und Region individuell festzulegen.

gcloud init verwenden

Wenn Sie die Fehlermeldung One of [--zone, --region] must be supplied: Please specify location erhalten, führen Sie diesen Abschnitt aus.

  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 gcloud 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.

gcloud config verwenden

  • Legen Sie Ihre standardmäßige Projekt-ID fest:
    gcloud config set project project-id
  • Wenn Sie mit zonalen Clustern arbeiten, legen Sie die Compute-Standardzone fest:
    gcloud config set compute/zone compute-zone
  • Wenn Sie mit regionalen Clustern arbeiten, legen Sie die Standardregion für Compute Engine fest:
    gcloud config set compute/region compute-region
  • Aktualisieren Sie gcloud auf die neueste Version:
    gcloud components update

Knotendienstkonto konfigurieren

Da die Dienstkonto-Anmeldedaten jedes Knotens weiterhin den Arbeitslasten zur Verfügung stehen, konfigurieren Sie ein Dienstkonto, das nur über die erforderlichen Mindestberechtigungen verfügt. Verknüpfen Sie anschließend dieses Dienstkonto mit Ihrem Knoten. So können Angreifer die Schutzmaßnahmen von GKE für Metadaten nicht umgehen, indem sie die Compute Engine API für den direkten Zugriff auf die Knoteninstanzen verwenden.

Verwenden Sie kein Dienstkonto mit der Berechtigung compute.instances.get, der Rolle Compute-Instanzadministrator oder ähnlichen Berechtigungen. Sie ermöglichen dadurch potenziellen Angreifern, Instanzmetadaten über die Compute Engine API abzurufen. Als Best Practice wird empfohlen, die Berechtigungen einer Knoten-VM nicht durch Zugriffsbereiche, sondern mithilfe von Dienstkontoberechtigungen zu beschränken. Weitere Informationen finden Sie in der Dokumentation zu Dienstkonten von Compute Engine.

Wenn Sie kein Knotendienstkonto haben, können Sie mit folgenden Befehlen eines erstellen:

export NODE_SA_NAME=gke-node-sa
gcloud iam service-accounts create $NODE_SA_NAME \
  --display-name "Node Service Account"
export NODE_SA_EMAIL=$(gcloud iam service-accounts list --format='value(email)' \
  --filter='displayName:Node Service Account')

Führen Sie die folgenden Befehle aus, um Ihr Dienstkonto mit den erforderlichen Rollen und Berechtigungen zu konfigurieren. PROJECT ist Ihre Projekt-ID:

export PROJECT=$(gcloud config get-value project)

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

Wenn Ihr Cluster private Images aus Container Registry abruft, fügen Sie außerdem die Rolle storage.objectViewer hinzu:

gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/storage.objectViewer

Legacy-Metadaten-APIs deaktivieren und davon umstellen

Metadatenserver-Endpunkte von Compute Engine v1beta1 und v0.1 sind veraltet und sollen eingestellt werden. Sorgen Sie dafür, dass alle Anfragen für die Verwendung des v1-Endpunkts aktualisiert werden.

Der Instanzmetadatenserver von Compute Engine gibt die Legacy-Endpunkte v0.1 und v1beta1 frei, die keine Metadatenabfrage-Header erzwingen. Dieses Feature in den v1-APIs erschwert potenziellen Angreifern das Abrufen von Instanzmetadaten. Wenn Sie diese Legacy-APIs nicht unbedingt benötigen, empfehlen wir, sie zu deaktivieren.

Im nächsten Abschnitt wird Folgendes beschrieben:

  • Ermitteln, welche Knoten auf die veralteten Endpunkte zugreifen. Wenn Knoten die veralteten Endpunkte verwenden, müssen Sie diese Knoten migrieren.

  • Erstellen eines neuen Clusters oder Knotenpools, wobei die Legacy-Metadatenserver-Endpunkte für diese Knoten deaktiviert sind.

Knoten identifizieren, die Legacy-Metadatenserver-Endpunkte verwenden

Mit dem Tool check-legacy-endpoint-access können Sie ermitteln, welcher Ihrer Kubernetes Engine-Knoten die Legacy-Metadatenserver-Endpunkte verwendet. Wenn Sie es auf Ihren Cluster anwenden protokolliert das Tool alle 5 Minuten alle Anfragen an die v0.1- und v1beta1-Endpunkte durch Ihre Knoten. Das Tool kann auch zum Identifizieren, Debugging und Überprüfen der Nutzung der Legacy-Endpunkte in Kubernetes Engine verwendet werden.

Führen Sie die folgenden Schritte aus, um das Tool "check-legacy-endpoint-access" einzurichten:

  1. Führen Sie in jedem Ihrer Cluster den folgenden Befehl aus:

    kubectl apply -f \
    https://raw.githubusercontent.com/GoogleCloudPlatform\
    /k8s-node-tools/master/check-legacy-endpoint-access/check-legacy-endpoint-access.yaml
  2. Fragen Sie die Logs ab, die mit den Nutzungsdaten des Legacy-Endpunkts erfasst wurden. Führen Sie dazu in jedem Cluster den folgenden Befehl aus:

    kubectl -n kube-system logs -l \
    app=check-legacy-endpoint-access | grep "access count"

Sie können auch die in Stackdriver Logging gesammelten Logs anzeigen.

  1. Rufen Sie in der Cloud Console die Seite Cloud Logging > Logs (Loganzeige) auf:

    Loganzeige aufrufen

  2. Wenden Sie folgenden Filter an:

    resource.type="container"
    resource.labels.namespace_id="kube-system"
    logName:"/check-legacy-endpoint-access"

    Zur gefilterten Ansicht

  3. Nachdem Sie die Knoten identifiziert haben, müssen die Prozesse identifiziert werden, die diese Endpunkte verwenden. Eine Anleitung zum Identifizieren der Prozesse finden Sie unter Prozesse identifizieren.

  4. Migrieren Sie diese Prozesse, um den Metadatenserver-Endpunkt v1 zu verwenden. Eine Anleitung zum Migrieren von Compute Engine-Knoten und Informationen zu Unterschieden bei den Endpunkten finden Sie unter Zu v1-Metadatenserver-Endpunkt migrieren.

  5. Entfernen Sie das Daemonset check-legacy-endpoint-access:

    kubectl delete daemonset check-legacy-endpoint-access -n kube-system

Neuen Knotenpool bei deaktivierten Legacy-Metadaten-APIs erstellen

Nachdem Sie ein Dienstkonto erstellt haben, können Sie mit dem gcloud-Befehlszeilentool einen neuen Knotenpool oder einen Standardknotenpool in einem neuen Cluster mit deaktivierten Legacy-Metadaten-APIs erstellen.

Verwenden Sie das Flag --metadata disable-legacy-endpoints=true, um einen neuen Knotenpool mit deaktivierten Legacy-Metadaten-APIs zu erstellen. Beispiel:

gcloud container node-pools create pool-name \
  --service-account=$NODE_SA_EMAIL \
  --metadata disable-legacy-endpoints=true

Einen neuen Cluster können Sie, ebenfalls bei deaktivierten Legacy-Metadaten-APIs, im Standardknotenpool mit demselben Flag erstellen. Beispiel:

gcloud container clusters create cluster-name \
  --service-account=$NODE_SA_EMAIL \
  --metadata disable-legacy-endpoints=true

Vorhandenen Cluster zum Deaktivieren von Legacy-Metadaten-APIs aktualisieren

Nachdem Sie einen neuen Knotenpool bei deaktivierten Legacy-Metadaten-APIs erstellt haben, können Sie einen vorhandenen Cluster aktualisieren, um ihn zu verwenden. Folgen Sie dazu der Anleitung zum Migrieren von Knotenpools.

Deaktivierung von Legacy-Metadaten-APIs prüfen

Wenn die Legacy-Instanzmetadaten-APIs deaktiviert sind, wird bei Anfragen an die Metadatenserver-Endpunkte /0.1/ und /v1beta1/ der Fehler 403 Forbidden zurückgegeben.

Sie können prüfen, ob die Legacy-Metadaten-APIs deaktiviert wurden. Führen Sie dazu den Befehl curl in einem Pod aus:

root@pod-name# curl -H 'Metadata-Flavor: Google' \
'http://metadata.google.internal/computeMetadata/v1/instance/attributes/disable-legacy-endpoints'
true
root@pod-name# curl 'http://metadata.google.internal/computeMetadata/v1beta1/instance/id'
... Error 403 (Forbidden) ... Legacy metadata endpoint accessed: /computeMetadata/v1beta1/instance/id Legacy metadata endpoints are disabled. Please use the /v1/ endpoint. ...

Metadatenverbergung

Die Funktion zur Metadatenverbergung von GKE 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.

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 in Ihrem Shell- oder Terminalfenster 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 \
  --metadata disable-legacy-endpoints=true \
  [additional parameters and flags omitted]

Dabei gilt:

  • cluster-name ist der Name des Clusters, der erstellt werden soll.
  • --workload-metadata-from-node ist auf SECURE eingestellt. Durch Festlegen des Flags auf EXPOSED oder UNSPECIFIED wird die Metadatenverbergung deaktiviert.

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.

root@pod-name# curl -H "Metadata-Flavor: Google" \
'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://www.example.com'
This metadata endpoint is concealed.