Protéger les métadonnées d'un cluster


Présentation

Google Kubernetes Engine (GKE) utilise des métadonnées d'instance pour configurer les machines virtuelles (VM) de nœuds, mais certaines de ces métadonnées sont potentiellement sensibles et doivent être protégées des charges de travail exécutées sur le cluster.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

  • Assurez-vous d'avoir activé l'API Google Kubernetes Engine.
  • Activer l'API Google Kubernetes Engine
  • Assurez-vous d'avoir installé le SDK Cloud.
  • Configurez les paramètres de l'outil de ligne de commande gcloud par défaut pour votre projet en utilisant l'une des méthodes suivantes:
    • Utilisez gcloud init si vous souhaitez suivre les étapes de définition des paramètres par défaut du projet.
    • Utilisez gcloud config pour définir individuellement l'ID, la zone et la région de votre projet.

    gcloud init

    1. Exécutez gcloud init et suivez les instructions :

      gcloud init

      Si vous utilisez SSH sur un serveur distant, utilisez l'option --console-only pour empêcher la commande d'ouvrir un navigateur :

      gcloud init --console-only
    2. Suivez les instructions pour autoriser l'outil gcloud à utiliser votre compte Google Cloud.
    3. Créez ou sélectionnez une configuration.
    4. Choisissez un projet Google Cloud.
    5. Choisissez une zone Compute Engine par défaut.
    6. Choisissez une région Compute Engine par défaut.

    gcloud config

    1. Définissez votre ID de projet par défaut :
      gcloud config set project PROJECT_ID
    2. Définissez votre région Compute Engine par défaut (par exemple, us-central1):
      gcloud config set compute/region COMPUTE_REGION
    3. Définissez votre zone Compute Engine par défaut (par exemple, us-central1-c):
      gcloud config set compute/zone COMPUTE_ZONE
    4. Mettez à jour gcloud vers la dernière version :
      gcloud components update

    En définissant des emplacements par défaut, vous pouvez éviter les erreurs dans l'outil gcloud, telles que les suivantes: One of [--zone, --region] must be supplied: Please specify location.

Configurer le compte de service des nœuds

Les identifiants du compte de service de chaque nœud continuent d'être exposés aux charges de travail. Par défaut, vos nœuds utilisent le compte de service par défaut de Compute Engine. Vous devez configurer un compte de service associé à des privilèges minimaux pour vos nœuds, plutôt que le compte de service par défaut de Compute Engine. Associez ensuite ce compte de service à vos nœuds, de sorte qu'un pirate informatique ne puisse pas contourner les protections de métadonnées de GKE en utilisant l'API Compute Engine pour accéder directement aux instances de VM sous-jacentes.

Pour en savoir plus, consultez la section Utiliser le principe du moindre privilège pour les comptes de service Google.

Pour créer un compte de service de nœud associé à des privilèges minimaux, procédez comme suit :

  1. Créez un compte de service Identity and Access Management (IAM), puis enregistrez l'adresse e-mail dans une variable d'environnement :

    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')
    

    Remplacez les éléments suivants :

    • NODE_SA_NAME: nom du nouveau compte de service de votre nœud.
    • DISPLAY_NAME : nom à afficher du nouveau compte de service.

    L'adresse e-mail du compte de service du nœud est au format NODE_SA_NAME@PROJECT_ID.iam.gserviceaccount.com.

  2. Configurez votre compte de service avec les rôles et les autorisations minimaux pour exécuter vos nœuds GKE :

    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
    

    Remplacez PROJECT_ID par l'ID de votre projet Google Cloud.

    De plus, si votre cluster extrait des images privées d'Artifact Registry, ajoutez le rôle roles/artifactregistry.reader :

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

Dissimuler des métadonnées

La dissimulation de métadonnées de GKE permet de protéger certaines métadonnées système potentiellement sensibles contre les charges de travail d'utilisateur exécutées sur votre cluster.

Dans Kubernetes version 1.9.3 ou ultérieure, vous pouvez activer la dissimulation de métadonnées pour empêcher les pods des utilisateurs d'accéder à certaines métadonnées de VM se rapportant aux nœuds de votre cluster, telles que les identifiants Kubelet et les informations sur les instances de VM. Plus précisément, la dissimulation de métadonnées protège l'accès à kube-env (qui contient les identifiants Kubelet) et au jeton d'identité d'instance.

La dissimulation de métadonnées joue le rôle de pare-feu n'autorisant que les requêtes sécurisées dans le trafic allant des pods d'utilisateur (c'est-à-dire les pods non exécutés sur HostNetwork) au serveur de métadonnées du cluster. Ce pare-feu empêche les pods d'utilisateur d'exploiter les identifiants Kubelet pour des attaques d'élévation des privilèges, ou les identifiants de la VM pour des attaques d'élévation d'instance.

Vous ne pouvez activer la dissimulation de métadonnées que lorsque vous créez un cluster ou lorsque vous ajoutez un nouveau pool de nœuds à un cluster existant.

Limites

  • La dissimulation de métadonnées ne protège l'accès qu'à kube-env et au jeton d'identité d'instance du nœud.
  • La dissimulation de métadonnées ne limite pas l'accès au compte de service du nœud.
  • La dissimulation de métadonnées ne limite pas l'accès à d'autres métadonnées d'instance associées.
  • La dissimulation de métadonnées ne limite pas l'accès à d'autres anciennes API de métadonnées.

Créer un cluster ou un pool de nœuds avec dissimulation de métadonnées

Après avoir créé un compte de service, vous pouvez créer un cluster avec la fonctionnalité de dissimulation de métadonnées activée, à l'aide de l'outil de ligne de commande gcloud.

Pour créer un cluster avec la dissimulation de métadonnées activée, exécutez la commande suivante :

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

Remplacez CLUSTER_NAME par le nom de votre nouveau cluster.

L'option --workload-metadata-from-node prend les valeurs suivantes :

  • SECURE: active la dissimulation de métadonnées.
  • EXPOSED ou UNSPECIFIED : désactive la dissimulation de métadonnées.

Vérifier que les métadonnées de jeton d'identité sont dissimulées pour la charge de travail du cluster

Lorsque vous dissimulez des métadonnées, il ne doit pas être possible de demander une signature via le jeton d'identité d'instance du nœud. Pour vous assurer que les requêtes informent explicitement les utilisateurs du fait que des métadonnées sont dissimulées, vous pouvez exécuter une commande curl depuis un pod :

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

Le résultat ressemble à ce qui suit :

This metadata endpoint is concealed.

Désactiver les anciennes API de métadonnées et effectuer une migration

Les points de terminaison du serveur de métadonnées Compute Engine v0.1 et v1beta1 sont obsolètes et ont été arrêtés le 30 septembre 2020.

Pour connaître le calendrier d'arrêt, consultez la page Abandon des points de terminaison du serveur de métadonnées v0.1 et v1beta1.

Étape suivante