Restreindre le trafic sortant du serveur d'API

Vous pouvez améliorer la sécurité de votre plan de contrôle Google Kubernetes Engine (GKE) en désactivant les adresses IP externes des instances de machines virtuelles (VM) du plan de contrôle. Ce document explique aux ingénieurs en sécurité comment contrôler le trafic sortant du serveur d'API Kubernetes et comment éviter les perturbations potentielles des webhooks d'admission.

Vous devez déjà connaître les éléments suivants :

Niveaux de restriction

Vous pouvez spécifier l'un des niveaux de restriction suivants lorsque vous créez ou mettez à jour un cluster :

  • Aucun trafic (NONE) : désactivez l'adresse IP externe de chaque instance de VM du plan de contrôle et acheminez tout le trafic sortant du serveur d'API vers un trou noir. Ce niveau de restriction a les effets suivants :
    • GKE bloque le trafic sortant direct du serveur d'API vers les serveurs de webhook d'admission qui s'exécutent en dehors du cluster. Tous les webhooks d'admission qui utilisent une URL ou une adresse IP pour contacter le serveur de webhook sont concernés.
    • GKE bloque tout trafic sortant direct du serveur d'API vers des services externes, y compris Internet et Google Cloud services. Le trafic destiné à l'authentification GKE et aux composants système tels que le serveur de métadonnées n'est pas affecté.
    • Les autres types de trafic sortant, tels que le trafic système critique ou le trafic provenant de vos nœuds, ne sont pas affectés.
    • GKE utilise une ValidatingAdmissionPolicy pour refuser la création ou la mise à jour de ValidatingWebhookConfigurations ou de MutatingWebhookConfigurations qui utilisent le champ clientConfig.url.
  • Tout le trafic (VIA_CONTROL_PLANE) : conservez l'adresse IP externe de chaque instance du plan de contrôle et laissez le serveur d'API utiliser l'adresse IP pour le trafic sortant. Cette option est la valeur par défaut dans GKE.

Limites

Si vous désactivez le trafic sortant en définissant le niveau de restriction sur NONE, le cluster ne peut pas utiliser d'adresses IP publiques utilisées en mode privé (PUPI).

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

  • Activez l'API Google Kubernetes Engine.
  • Activer l'API Google Kubernetes Engine
  • Si vous souhaitez utiliser la Google Cloud CLI pour cette tâche, installez et initialisez la gcloud CLI. Si vous avez déjà installé la gcloud CLI, obtenez la dernière version en exécutant la commande gcloud components update. Il est possible que les versions antérieures de la gcloud CLI ne permettent pas d'exécuter les commandes de ce document.
  • Assurez-vous de disposer d'un cluster GKE Autopilot ou standard exécutant la version 1.35.1-gke.1396000 ou ultérieure. Vous pouvez également créer un cluster Autopilot.
  • Si vous disposez de serveurs de webhook externes, vérifiez que vous utilisez une référence de service pour les contacter. Lorsque vous désactivez le trafic sortant du serveur d'API, tous vos webhooks qui utilisent une URL pour contacter le serveur de webhook échouent. Les webhooks gérés par GKE ne sont pas affectés.

Personnaliser le trafic sortant du serveur d'API

Vous pouvez personnaliser le niveau de restriction du trafic sortant du serveur d'API lorsque vous créez ou mettez à jour un cluster. Pour mettre à jour un cluster existant, utilisez l'indicateur --control-plane-egress :

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

Remplacez les éléments suivants :

  • CLUSTER_NAME : nom du cluster
  • CONTROL_PLANE_LOCATION : région ou zone de votre plan de contrôle de cluster, par exemple us-central1 ou us-central1-a
  • CONTROL_PLANE_EGRESS_MODE : niveau de restriction du trafic sortant de votre serveur d'API Utilisez l'une des valeurs suivantes :
    • NONE: désactivez l'adresse IP externe de vos instances de VM du plan de contrôle et bloquez tout le trafic sortant non critique du serveur d'API. GKE empêche la création de configurations de webhook qui utilisent le champ clientConfig.url.
    • VIA_CONTROL_PLANE: conservez l'adresse IP externe des instances de VM du plan de contrôle et autorisez le trafic sortant du serveur d'API. Il s'agit de la valeur par défaut.

Vérifier la restriction du trafic sortant

Pour vérifier si GKE bloque le trafic sortant de votre serveur d'API, utilisez l'une des méthodes suivantes :

  • Vérifiez la configuration de votre cluster :

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

    Le résultat est l'un des suivants :

    • NONE : le trafic sortant est limité.
    • VIA_CONTROL_PLANE : le trafic sortant n'est pas limité.
  • Pour vérifier l'effet de vos modifications sur les nouveaux webhooks, essayez de créer une configuration de webhook qui utilise le champ clientConfig.url :

    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"
    

    Le résultat ressemble à ce qui suit :

    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.
    

    Ce résultat indique qu'une ValidatingAdmissionPolicy GKE vous empêche de créer ou de mettre à jour des configurations de webhook avec le champ clientConfig.url. Si vous supprimez la ValidatingAdmissionPolicy, vous pouvez créer ou mettre à jour la configuration, mais les requêtes d'admission n'atteindront pas le serveur de webhook.

  • Pour vérifier l'effet de vos modifications sur les webhooks existants dans le cluster, essayez d'envoyer une requête directe à une adresse IP en dehors du cluster :

    1. Activez API_SERVER les journaux pour votre cluster.
    2. Supprimez la ValidatingAdmissionPolicy gke-restrict-webhook-url :

      kubectl delete validatingadmissionpolicy gke-restrict-webhook-url
      

      Lorsque vous supprimez la ValidatingAdmissionPolicy, vous pouvez créer ou mettre à jour des configurations de webhook avec le champ clientConfig.url. Le cluster recrée automatiquement la ValidatingAdmissionPolicy. Ce contournement est donc temporaire.

    3. Dans le champ clientConfig.url d'une ValidatingWebhookConfiguration ou d'une MutatingWebhookConfiguration, spécifiez une adresse IP ou une URL à laquelle envoyer des requêtes. Vous pouvez utiliser un exemple de valeur, tel que http://example.com ou 203.0.113.100.

    4. Recherchez dans les journaux du serveur d'API un message d'erreur semblable à celui-ci :

      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
      

      Ce résultat indique que même si la ValidatingAdmissionPolicy est supprimée, les requêtes d'admission ne peuvent pas atteindre un serveur de webhook à l'aide de l'adresse IP ou de l'URL du serveur.

Après avoir désactivé les adresses IP externes de vos instances de VM du plan de contrôle, GKE bloque le trafic vers tous les webhooks qui utilisent une URL pour contacter des serveurs de webhook externes. Vous devez utiliser le champ clientConfig.service dans votre configuration de webhook pour configurer un autre itinéraire à utiliser par votre serveur d'API. Pour en savoir plus, consultez la section Configuration de webhook externe.

Étape suivante