Ausgehenden Traffic vom API-Server einschränken

Sie können die Sicherheit Ihrer GKE-Steuerungsebene (Google Kubernetes Engine) verbessern, indem Sie die externen IP-Adressen der VM-Instanzen (Virtual Machine) der Steuerungsebene deaktivieren. In diesem Dokument wird Sicherheitstechnikern gezeigt, wie sie den ausgehenden Traffic vom Kubernetes API-Server steuern und potenzielle Unterbrechungen von Admission-Webhooks vermeiden können.

Sie sollten bereits mit Folgendem vertraut sein:

Einschränkungsstufen

Sie können beim Erstellen oder Aktualisieren eines Clusters eine der folgenden Einschränkungsstufen angeben:

  • Kein Traffic (NONE): Deaktivieren Sie die externe IP-Adresse jeder VM-Instanz der Steuerungsebene und leiten Sie den gesamten ausgehenden API-Server-Traffic an ein Black Hole weiter. Diese Einschränkung hat folgende Auswirkungen:
    • GKE blockiert direkten Egress-Traffic vom API-Server zu Admission-Webhook-Servern, die außerhalb des Clusters ausgeführt werden. Alle Admission-Webhooks, die eine URL oder IP-Adresse verwenden, um den Webhook-Server zu kontaktieren, sind betroffen.
    • GKE blockiert jeglichen direkten ausgehenden Traffic vom API-Server zu externen Diensten, einschließlich des Internets undGoogle Cloud -Diensten. Der Traffic für die GKE-Authentifizierung und zu Systemkomponenten wie dem Metadatenserver ist davon nicht betroffen.
    • Andere Arten von ausgehendem Traffic, z. B. kritischer Systemtraffic oder Traffic von Ihren Knoten, sind davon nicht betroffen.
    • GKE verwendet eine ValidatingAdmissionPolicy, um die Erstellung oder Aktualisierung von ValidatingWebhookConfigurations oder MutatingWebhookConfigurations abzulehnen, die das Feld clientConfig.url verwenden.
  • Gesamter Traffic (VIA_CONTROL_PLANE): Die externe IP-Adresse jeder Steuerungsebeneninstanz wird beibehalten und der API-Server kann die IP-Adresse für ausgehenden Traffic verwenden. Diese Option ist die Standardeinstellung in GKE.

Beschränkungen

Wenn Sie ausgehenden Traffic deaktivieren, indem Sie die Einschränkungsstufe auf NONE festlegen, kann der Cluster keine privat verwendeten öffentlichen IP-Adressen (PUPI-Adressen) verwenden.

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, 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 update ab. In früheren gcloud CLI-Versionen werden die Befehle in diesem Dokument möglicherweise nicht unterstützt.
  • Sie benötigen einen GKE Autopilot- oder Standardcluster mit Version 1.35.1-gke.1396000 oder höher. Sie können auch einen Autopilot-Cluster erstellen.
  • Wenn Sie externe Webhook-Server haben, prüfen Sie, ob Sie eine Dienstreferenz verwenden, um diese Server zu kontaktieren. Wenn Sie den ausgehenden Traffic vom API-Server deaktivieren, schlagen alle Ihre Webhooks fehl, die eine URL verwenden, um den Webhook-Server zu kontaktieren. Von GKE verwaltete Webhooks sind nicht betroffen.

Ausgehenden Traffic vom API-Server anpassen

Sie können den Grad der Einschränkung für ausgehenden Traffic vom API-Server anpassen, wenn Sie einen Cluster erstellen oder aktualisieren. Verwenden Sie das Flag --control-plane-egress, um einen vorhandenen Cluster zu aktualisieren:

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --control-plane-egress=CONTROL_PLANE_EGRESS_MODE

Ersetzen Sie Folgendes:

  • CLUSTER_NAME: Der Name Ihres Clusters.
  • CONTROL_PLANE_LOCATION: Die Region oder Zone der Steuerungsebene Ihres Clusters, z. B. us-central1 oder us-central1-a.
  • CONTROL_PLANE_EGRESS_MODE: Das Einschränkungsniveau für ausgehenden Traffic von Ihrem API-Server. Verwenden Sie einen der folgenden Werte:
    • NONE: Deaktivieren Sie die externe IP-Adresse Ihrer VM-Instanzen der Steuerungsebene und blockieren Sie den gesamten nicht kritischen Egress-Traffic vom API-Server. GKE verhindert die Erstellung neuer Webhook-Konfigurationen, die das Feld clientConfig.url verwenden.
    • VIA_CONTROL_PLANE: Behalten Sie die externe IP-Adresse der VM-Instanzen der Steuerungsebene bei und lassen Sie ausgehenden Traffic vom API-Server zu. Dies ist der Standardwert.

Beschränkung des ausgehenden Traffics überprüfen

So prüfen Sie, ob GKE ausgehenden Traffic von Ihrem API-Server blockiert:

  • Clusterkonfiguration prüfen:

    gcloud container clusters describe CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --format='value(controlPlaneEgress)'
    

    Die Ausgabe ist eine der folgenden:

    • NONE: Ausgehender Traffic ist eingeschränkt.
    • VIA_CONTROL_PLANE: Ausgehender Traffic ist nicht eingeschränkt.
  • Wenn Sie die Auswirkungen Ihrer Änderungen auf neue Webhooks überprüfen möchten, erstellen Sie eine Webhook-Konfiguration, in der das Feld clientConfig.url verwendet wird:

    cat <<EOF | kubectl apply -f -
    apiVersion: admissionregistration.k8s.io/v1
    kind: MutatingWebhookConfiguration
    metadata:
      name: test-webhook-config
    webhooks:
    - name: my-webhook.example.com
      clientConfig:
        url: "https://my-webhook.example.com:9443/my-webhook-path"
    

    Die Ausgabe sieht etwa so aus:

    ValidatingAdmissionPolicy 'gke-restrict-webhook-url' denied request: Egress
    traffic from the API server through the control plane is disabled. As a
    result, direct API server calls to external webhook servers are blocked.
    To connect to external webhooks, update any webhook configurations that use
    clientConfig.url to use clientConfig.service instead.
    

    Diese Ausgabe weist darauf hin, dass eine GKE-ValidatingAdmissionPolicy verhindert, dass Sie Webhook-Konfigurationen mit dem Feld clientConfig.url erstellen oder aktualisieren. Wenn Sie die ValidatingAdmissionPolicy löschen, können Sie die Konfiguration erstellen oder aktualisieren, aber Zulassungsanfragen erreichen den Webhook-Server nicht.

  • Um die Auswirkungen Ihrer Änderungen auf vorhandene Webhooks im Cluster zu prüfen, versuchen Sie, eine direkte Anfrage an eine IP-Adresse außerhalb des Clusters zu senden:

    1. Aktivieren Sie API_SERVER-Logs für Ihren Cluster.
    2. Löschen Sie die gke-restrict-webhook-url ValidatingAdmissionPolicy:

      kubectl delete validatingadmissionpolicy gke-restrict-webhook-url
      

      Wenn Sie die ValidatingAdmissionPolicy löschen, können Sie Webhook-Konfigurationen mit dem Feld clientConfig.url erstellen oder aktualisieren. Der Cluster erstellt die ValidatingAdmissionPolicy automatisch neu. Diese Umgehung ist also nur vorübergehend.

    3. Geben Sie im Feld clientConfig.url einer ValidatingWebhookConfiguration oder MutatingWebhookConfiguration eine IP-Adresse oder URL an, an die Anfragen gesendet werden sollen. Sie können einen Beispielwert wie http://example.com oder 203.0.113.100 verwenden.

    4. Prüfen Sie die API-Server-Logs auf eine Fehlermeldung wie die folgende:

      Error from server (InternalError): error when creating "STDIN":
        Internal error occurred: failed calling webhook
        WEBHOOK_NAME": failed to call
        webhook: Post "WEBHOOK_URL":
        proxyconnect tcp: dial tcp: lookup master-internet-access-unavailable.localhost
        on 169.254.169.254:53: no such host
      

      Diese Ausgabe weist darauf hin, dass Zulassungsanfragen den Webhook-Server nicht über die Server-IP-Adresse oder ‑URL erreichen können, obwohl die ValidatingAdmissionPolicy gelöscht wurde.

Nachdem Sie die externen IP-Adressen Ihrer VM-Instanzen der Steuerungsebene deaktiviert haben, blockiert GKE Traffic zu allen Webhooks, die eine URL verwenden, um externe Webhook-Server zu kontaktieren. Sie müssen das Feld clientConfig.service in Ihrer Webhook-Konfiguration verwenden, um einen alternativen Pfad für Ihren API-Server einzurichten. Weitere Informationen finden Sie unter Externe Webhook-Konfiguration.

Nächste Schritte