Utiliser VPC Service Controls

VPC Service Controls est une fonctionnalité de Google Cloud qui vous permet de configurer un périmètre sécurisé pour vous protéger contre l'exfiltration de données. Ce guide vous explique comment utiliser VPC Service Controls avec Cloud Functions pour renforcer la sécurité de vos fonctions.

Pour en savoir plus sur les limites connues de cette intégration, consultez la documentation de VPC Service Controls.

Configuration au niveau de l'organisation

Pour utiliser VPC Service Controls avec Cloud Functions, vous devez configurer un périmètre de service et des règles d'administration au niveau de l'organisation. Cette configuration garantit que les vérifications VPC Service Controls s'appliquent lors de l'utilisation de Cloud Functions et que les développeurs peuvent uniquement déployer des fonctions conformes aux règles de VPC Service Controls.

Configurer un périmètre VPC Service Controls

Pour configurer un périmètre de service, vous avez besoin des rôles Lecteur d'organisation (roles/resourcemanager.organizationViewer) et Éditeur Access Context Manager (roles/accesscontextmanager.policyEditor).

Suivez le Guide de démarrage rapide de VPC Service Controls pour effectuer les actions suivantes :

  1. Créer un périmètre de service
  2. Ajouter un ou plusieurs projets au périmètre

  3. Restreindre l'API Cloud Functions

Une fois le périmètre de service configuré, tous les appels vers l'API Cloud Functions sont vérifiés pour confirmer qu'ils proviennent du même périmètre.

Facultatif : Activer l'accès au périmètre pour les ordinateurs de développement

Comme les vérifications de VPC Service Controls s'appliquent pour l'API, les appels Cloud Functions vers celle-ci échouent, sauf s'ils proviennent du périmètre de service. Ainsi, pour gérer les fonctions avec l'API Cloud Functions, l'UI de Cloud Functions dans Cloud Console ou l'outil de ligne de commande gcloud, choisissez l'une des options suivantes :

  • Utilisez une machine dans le périmètre de VPC Service Controls. Par exemple, vous pouvez utiliser une VM Compute Engine ou une machine sur site connectée à votre réseau VPC via VPN.

  • Autorisez les développeurs de la fonction à accéder au périmètre. Par exemple, vous pouvez créer des niveaux d'accès qui permettent d'accéder au périmètre en fonction de l'adresse IP ou de l'identité de l'utilisateur. Pour plus d'informations, consultez la page Autoriser l'accès aux ressources protégées depuis l'extérieur d'un périmètre.

Configurer des règles d'administration

Pour gérer les règles d'administration, vous avez besoin du rôle Administrateur des règles d'administration (roles/orgpolicy.policyAdmin).

Pour respecter les règles de VPC Service Controls et vous protéger contre l'exfiltration des données, définissez les règles d'administration ci-dessous. Elles contrôlent les paramètres réseau autorisables pour Cloud Functions dans le périmètre de service.

Limiter les paramètres d'entrée autorisés

La règle d'administration cloudfunctions.allowedIngressSettings contrôle les paramètres d'entrée que les développeurs sont autorisés à utiliser pour Cloud Functions. Définissez cette règle d'administration pour que les développeurs n'utilisent que la valeur ALLOW_INTERNAL_ONLY :

Console

  1. Accédez à la page des règles Paramètres d'entrée autorisés dans Cloud Console :

    Accéder à la règle d'administration

  2. Cliquez sur Modifier.

  3. Sur la page Modifier, sélectionnez Personnaliser.

  4. Sous Application des règles, sélectionnez Remplacer.

  5. Sous Valeurs de règles, sélectionnez Personnalisé.

  6. Sous Type de règle, sélectionnez Autoriser.

  7. Sous Valeurs personnalisées, saisissez ALLOW_INTERNAL_ONLY.

  8. Cliquez sur Enregistrer.

gcloud

Exécutez la commande gcloud beta resource-manager org-policies allow :

gcloud beta resource-manager org-policies allow \
  cloudfunctions.allowedIngressSettings ALLOW_INTERNAL_ONLY \
  --organization ORGANIZATION_ID

ORGANIZATION_ID est l'ID de votre organisation.

Une fois cette règle d'administration en place, toutes les fonctions doivent utiliser la valeur ALLOW_INTERNAL_ONLY pour leurs paramètres d'entrée. Ainsi, les fonctions HTTP ne peuvent accepter que le trafic provenant d'un réseau VPC situé dans le périmètre du service. Les déploiements de fonctions qui spécifient une valeur différente échoueront.

Exiger un connecteur VPC

La règle d'administration cloudfunctions.requireVPCConnector détermine si un connecteur d'accès au VPC sans serveur est requis pour les fonctions. Définissez cette règle d'administration pour appliquer cette contrainte :

Console

  1. Accédez à la page de la règle Exiger un connecteur VPC dans Cloud Console :

    Accéder à la règle d'administration

  2. Cliquez sur Modifier.

  3. Sur la page Modifier, sélectionnez Personnaliser.

  4. Sous Application, sélectionnez Activé.

  5. Cliquez sur Enregistrer.

gcloud

Exécutez la commande gcloud beta resource-manager org-policies enable-enforce :

gcloud beta resource-manager org-policies enable-enforce \
  cloudfunctions.requireVPCConnector \
  --organization ORGANIZATION_ID

ORGANIZATION_ID est l'ID de votre organisation.

Une fois cette règle d'administration en place, toutes les fonctions doivent utiliser un connecteur d'accès au VPC sans serveur. Les déploiements de fonctions qui ne spécifient pas de connecteur échoueront.

Limiter les paramètres de sortie autorisés du connecteur VPC

La règle d'administration cloudfunctions.allowedVpcConnectorEgressSettings contrôle les paramètres de sortie que les développeurs sont autorisés à utiliser pour Cloud Functions. Définissez cette règle d'administration pour n'autoriser que la valeur ALL_TRAFFIC :

Console

  1. Accédez à la page de la règle Paramètres de sortie autorisés du connecteur VPC dans Cloud Console :

    Accéder à la règle d'administration

  2. Cliquez sur Modifier.

  3. Sur la page Modifier, sélectionnez Personnaliser.

  4. Sous Application des règles, sélectionnez Remplacer.

  5. Sous Valeurs de règles, sélectionnez Personnalisé.

  6. Sous Type de règle, sélectionnez Autoriser.

  7. Sous Valeurs personnalisées, saisissez ALL_TRAFFIC.

  8. Cliquez sur Enregistrer.

gcloud

Exécutez la commande gcloud beta resource-manager org-policies allow :

gcloud beta resource-manager org-policies allow \
  cloudfunctions.allowedVpcConnectorEgressSettings ALL_TRAFFIC \
  --organization ORGANIZATION_ID

ORGANIZATION_ID est l'ID de votre organisation.

Une fois cette règle d'organisation en place, toutes les fonctions doivent utiliser la valeur ALL_TRAFFIC pour leurs paramètres de sortie. Cela signifie que les fonctions doivent acheminer l'ensemble du trafic sortant via votre réseau VPC. Les déploiements de fonctions qui spécifient une valeur différente échoueront.

Configuration au niveau du projet

Pour les projets individuels au sein du périmètre de service, vous devez effectuer une configuration supplémentaire pour pouvoir utiliser VPC Service Controls.

Configurer les réseaux VPC

Pour accéder aux API et aux services de Google tout en limitant les risques d'exfiltration de données, les requêtes doivent être envoyées à la plage d'adresses IP virtuelles (VIP) restreintes, 199.36.153.4/30 (restricted.googleapis.com).

Pour chaque réseau VPC d'un projet, procédez comme suit pour bloquer le trafic sortant, à l'exception du trafic à destination de la plage VIP restreinte :

  1. Configurez des règles de pare-feu pour empêcher les données de quitter le réseau VPC :

    • Créez une règle de refus de sortie, qui bloque tout le trafic sortant.

    • Créez une règle de sortie autorisée qui permet l'acheminement du trafic vers 199.36.153.4/30 sur le port TCP 443. Vérifiez qu'elle est prioritaire sur la règle de refus de sortie que vous venez de créer. De cette façon, les sorties vers la plage VIP restreinte sont les seules autorisées.

  2. Configurez les paramètres DNS pour que l'adresse *.googleapis.com soit résolue en restricted.googleapis.com.

  3. Configurez les paramètres DNS avec un mappage d'enregistrement A *.cloudfunctions.net vers la plage d'adresses IP 199.36.153.4/30. Pour ce faire, utilisez Cloud DNS :

    gcloud dns managed-zones create ZONE_NAME \
    --visibility=private \
    --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_NAME/global/networks/default \
    --description=none \
    --dns-name=cloudfunctions.net
    
    gcloud dns record-sets transaction start --zone=ZONE_NAME
    
    gcloud dns record-sets transaction add --name=*.cloudfunctions.net. \
    --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
    --zone=ZONE_NAME \
    --ttl=300
    
    gcloud dns record-sets transaction execute --zone=ZONE_NAME
    

À ce stade, les requêtes provenant du réseau VPC :

  • ne peuvent pas quitter le réseau VPC, ce qui empêche la sortie en dehors du périmètre de service ;
  • ne peuvent atteindre que les API et les services de Google qui contrôlent VPC Service Controls, empêchant ainsi les risques d'exfiltration via les API Google.

Accorder au compte de service Cloud Build l'accès au périmètre de VPC Service Controls

Cloud Functions crée votre code source dans un conteneur exécutable à l'aide de Cloud Build. Pour utiliser Cloud Functions avec VPC Service Controls, vous devez configurer un niveau d'accès pour le compte de service Cloud Build dans votre périmètre de service :

Recherchez le nom du compte de service.

Node 8 et Go 1.11

Comme la compilation est exécutée dans le projet locataire, vous devez appliquer la solution suivante :

  1. Déployez une fonction dans votre projet. Utilisez la version par défaut dans Google Cloud Console :

    Créer une fonction

  2. Attendez que le déploiement échoue, puis cliquez sur le nom de la fonction dans la liste pour accéder à la page Informations sur la fonction.

  3. Le message d'erreur "Échec du déploiement" s'affiche. Il commence par Build failed: Unable to build your function due to VPC Service Controls. Le message d'erreur contient une adresse e-mail qui correspond au nom du compte de service.

Vous pouvez également créer un script comme suit pour trouver l'adresse du compte de service à partir de la ligne de commande :

#!/bin/bash

REGION="us-central1" # Your region
CONNECTOR_NAME="test-connector" # Your VPC connector name

# Deploy and delete an HTTP-triggered function
gcloud functions deploy FUNCTION_NAME --trigger-http --runtime nodejs8 --region $REGION --ingress-settings=internal-only --egress-settings=all --vpc-connector $CONNECTOR_NAME -q
gcloud functions delete FUNCTION_NAME --region $REGION -q

# Search log entries for Cloud Build failures
LOG_ENTRIES=$(gcloud logging read "resource.type=\"audited_resource\" AND protoPayload.serviceName=\"containerregistry.googleapis.com\"" --freshness=10m)
SERVICE_ACCTS=$(echo "$LOG_ENTRIES" | grep -oE "\d+@\w+.gserviceaccount.com" | sort | uniq)

# Print out service account IDs
echo "$SERVICE_ACCTS"

FUNCTION_NAME peut être n'importe quelle fonction HTTP, telle qu'une simple fonction Hello World.

Autres environnements d'exécution

  1. Si vous utilisez Java 11, Python 3.7 ou 3.8, Node 10 ou Go 1.13, utilisez la page IAM de Google Cloud Console pour trouver le compte de service Cloud Build.

    Ouvrir la page IAM

  2. Assurez-vous que le bon projet figure dans la liste déroulante des projets.

  3. Recherchez cloudbuild.gserviceaccount.com. L'adresse e-mail au format my-project-number@cloudbuild.gserviceaccount.com est le nom du compte de service.

Accordez au compte de service l'accès au périmètre de service.

Une fois que vous disposez du nom du compte de service, suivez les instructions de la section Limiter l'accès par utilisateur ou compte de service pour créer un niveau d'accès. Suivez les instructions de la section Ajouter un niveau d'accès à un périmètre existant pour ajouter le niveau d'accès à votre périmètre de service.

Une fois que l'accès du compte de service Cloud Build est accordé au périmètre de service de VPC Service Controls, les déploiements de fonctions aboutissent.

Déployer des fonctions conformes aux règles de VPC Service Controls

Une fois VPC Service Controls configuré pour Cloud Functions, vous devez vérifier que toutes les fonctions déployées dans le périmètre de service respectent les règles d'administration spécifiées. Cela signifie que :

  • Toutes les fonctions doivent utiliser un connecteur d'accès au VPC sans serveur. Pour plus d'informations, consultez la page Se connecter à un réseau VPC.
  • Toutes les fonctions doivent autoriser uniquement le trafic provenant de sources internes. Pour plus d'informations, consultez la section Paramètres d'entrée.
  • Toutes les fonctions doivent acheminer l'intégralité du trafic sortant vers le réseau VPC. Pour plus d'informations, consultez la section Paramètres de sortie.

Les déploiements de fonctions qui ne respectent pas les critères ci-dessus échouent.

Effectuer l'audit des fonctions existantes pour assurer la conformité avec les règles de VPC Service Controls

Une fois VPC Service Controls configuré, la conformité des nouvelles fonctions créées dans les projets au sein du périmètre de service est automatiquement vérifiée. Toutefois, pour éviter toute interruption des charges de travail en cours, les fonctions existantes continuent d'être opérationnelles et peuvent ne pas être conformes aux règles d'administration.

Nous vous recommandons d'effectuer l'audit des fonctions existantes et de modifier ou de redéployer des fonctions, si nécessaire. Pour faciliter ce processus, vous pouvez créer un script qui répertorie vos fonctions à l'aide de l'API Cloud Functions et met en évidence celles qui ne spécifient pas les paramètres réseau appropriés.