Appeler un point de terminaison privé conforme à VPC Service Controls

Vous pouvez cibler un point de terminaison privé pour les appels HTTP à partir de l'exécution de votre workflow à l'aide du registre de services de l'Annuaire des services avec Workflows. En créant un point de terminaison privé dans un réseau cloud privé virtuel (VPC), vous pouvez le rendre conforme à VPC Service Controls.

VPC Service Controls offre une couche de sécurité supplémentaire, indépendamment du Identity and Access Management (IAM). Tandis que les stratégies IAM permettent un contrôle d'accès précis basé sur l'identité, VPC Service Controls offre une sécurité périmétrique basée sur le contexte plus étendue, et permet par exemple de contrôler la sortie des données au-delà du périmètre.

  • L'annuaire des services est un registre de services qui stocke des informations sur les services réseau enregistrés, y compris leur nom, leur emplacement et leurs attributs. Quelle que soit leur infrastructure, vous pouvez enregistrer des services automatiquement et en capturer les détails. Vous pouvez ainsi découvrir, publier et connecter des services à grande échelle pour tous vos points de terminaison de service.

  • Un réseau VPC fournit la connectivité pour vos instances de machine virtuelle (VM) et vous permet de créer des points de terminaison privés dans votre réseau VPC à l'aide d'adresses IP internes. Les appels HTTP vers une ressource réseau VPC sont envoyés via un réseau privé, tout en appliquant IAM et VPC Service Controls.

  • VPC Service Controls est une fonctionnalité de Google Cloud qui vous permet de configurer un périmètre de service et de créer une limite de transfert de données. Vous pouvez utiliser VPC Service Controls avec des workflows pour protéger vos services et réduire le risque d'exfiltration de données.

Ce document explique comment enregistrer une VM dans un réseau VPC en tant que point de terminaison de l'Annuaire des services. Vous pouvez ainsi fournir un nom de service de l'annuaire des services à votre workflow. L'exécution de votre workflow utilise les informations récupérées dans le registre de services pour envoyer la requête HTTP appropriée, sans sortir vers un réseau public.

Ce diagramme offre une vue d'ensemble:

Envoi d'une requête HTTP à un numéro de port sur une instance de VM à l'aide d'informations de l'Annuaire des services

En règle générale, vous devez effectuer les tâches suivantes :

  1. Accordez des autorisations à l'agent de service Cloud Workflows afin qu'il puisse afficher les ressources de l'annuaire des services et accéder aux réseaux VPC à l'aide de l'annuaire des services.
  2. Créez un réseau VPC pour fournir des fonctionnalités de mise en réseau.
  3. Créez une règle de pare-feu VPC afin de pouvoir autoriser ou refuser le trafic vers ou depuis des instances de VM sur votre réseau VPC.
  4. Créez une instance de VM dans le réseau VPC. Une instance de VM Compute Engine est une machine virtuelle hébergée sur l'infrastructure de Google. Les termes instance Compute Engine, instance de VM et VM sont synonymes et sont utilisés de manière interchangeable.
  5. Déployez une application sur la VM. Vous pouvez exécuter une application sur votre instance de VM et vérifier que le trafic est diffusé comme prévu.
  6. Configurez l'annuaire des services pour que l'exécution de votre workflow puisse appeler un point de terminaison de l'annuaire des services.

  7. Créez et déployez votre workflow. La valeur private_service_name de votre workflow spécifie le point de terminaison de l'Annuaire des services que vous avez enregistré à l'étape précédente.

Accorder des autorisations à l'agent de service Cloud Workflows

Certains services Google Cloud disposent d'agents de service qui permettent aux services d'accéder à vos ressources. Si une API nécessite un agent de service, Google le crée après l'activation et l'utilisation de l'API.

  1. Lorsque vous déployez un workflow pour la première fois, l'agent de service Cloud Workflows est automatiquement créé avec le format suivant:

    service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com

    Vous pouvez créer manuellement le compte de service dans un projet sans workflow à l'aide de la commande suivante:

    gcloud beta services identity create \
        --service=workflows.googleapis.com \
        --project=PROJECT_ID

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

  2. Pour afficher les ressources de l'annuaire des services, attribuez le rôle Lecteur de l'annuaire des services (servicedirectory.viewer) au projet à l'agent de service Workflows:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com \
        --role=roles/servicedirectory.viewer

    Remplacez PROJECT_NUMBER par votre numéro de projet Google Cloud. Vous pouvez trouver le numéro de votre projet sur la page Bienvenue de la console Google Cloud ou en exécutant la commande suivante :

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'
  3. Pour accéder aux réseaux VPC à l'aide de l'annuaire des services, attribuez le rôle de service autorisé Private Service Connect (roles/servicedirectory.pscAuthorizedService) au projet à l'agent de service Workflows:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com \
        --role=roles/servicedirectory.pscAuthorizedService

Créer un réseau VPC

Un réseau VPC est une version virtuelle d'un réseau physique, mise en œuvre au sein du réseau de production de Google Il fournit une connectivité à vos instances de VM Compute Engine.

Vous pouvez créer un réseau VPC en mode automatique ou en mode personnalisé. Chaque nouveau réseau que vous créez doit posséder un nom unique au sein d'un même projet.

Par exemple, la commande suivante crée un réseau VPC en mode automatique:

gcloud compute networks create NETWORK_NAME \
    --subnet-mode=auto

Remplacez NETWORK_NAME par le nom que vous souhaitez donner au réseau VPC.

Pour en savoir plus, consultez la page Créer et gérer des réseaux VPC.

Créer une règle de pare-feu VPC

Les règles de pare-feu VPC vous permettent d'autoriser ou de refuser le trafic depuis et vers des instances de VM dans un réseau VPC en fonction du numéro de port, du tag ou du protocole.

Les règles de pare-feu VPC sont définies au niveau du réseau et s'appliquent seulement au réseau sur lequel elles ont été créées. Cependant, le nom que vous sélectionnez pour chacune d'elles doit être unique au projet.

Par exemple, la commande suivante crée une règle de pare-feu pour un réseau VPC spécifié et autorise le trafic entrant provenant de n'importe quelle adresse IPv4, 0.0.0.0/0. La valeur du drapeau --rules all rend la règle applicable à tous les protocoles et à tous les ports de destination.

gcloud compute firewall-rules create RULE_NAME \
    --network=projects/PROJECT_ID/global/networks/NETWORK_NAME \
    --direction=INGRESS \
    --action=ALLOW \
    --source-ranges=0.0.0.0/0 \
    --rules=all

Remplacez RULE_NAME par un nom pour la règle de pare-feu.

Pour plus d'informations, consultez la section Utiliser des règles de pare-feu VPC.

Créer une instance de VM dans le réseau VPC

Les instances de VM incluent des clusters Google Kubernetes Engine (GKE), des instances de l'environnement flexible App Engine et d'autres produits Google Cloud basés sur des VM Compute Engine. Pour prendre en charge l'accès au réseau privé, une ressource réseau VPC peut être une instance de VM, une adresse IP Cloud Interconnect ou un équilibreur de charge interne de couche 4.

Les instances Compute Engine peuvent exécuter des images publiques pour Linux et Windows Server fournies par Google, ainsi que des images personnalisées privées que vous pouvez créer ou importer à partir de vos systèmes existants. Vous pouvez également déployer des conteneurs Docker.

Vous pouvez choisir les propriétés de vos instances, telles que le nombre de processeurs virtuels et la quantité de mémoire, en utilisant un ensemble de types de machines prédéfinis ou en créant vos propres types de machines personnalisés.

Par exemple, la commande suivante crée une instance de VM Linux à partir d'une image publique avec une interface réseau associée au réseau VPC que vous avez créé précédemment.

  1. Créez et démarrez une instance de VM:

    gcloud compute instances create VM_NAME \
        --image-family=debian-11 \
        --image-project=debian-cloud \
        --machine-type=e2-micro \
        --network-interface network=projects/PROJECT_ID/global/networks/NETWORK_NAME

    Remplacez VM_NAME par le nom de la VM.

  2. Si vous êtes invité à confirmer la zone de l'instance, saisissez y.

    Une fois l'instance de VM créée, notez l'adresse INTERNAL_IP renvoyée.

  3. Dans Google Cloud Console, accédez à la page Instances de VM.

    Accéder à la page Instances de VM

  4. Dans la colonne Nom, cliquez sur le nom de l'instance de VM appropriée.

  5. Si la VM est en cours d'exécution, cliquez sur Arrêter pour l'arrêter.

  6. Pour modifier la VM, cliquez sur Modifier.

  7. Dans la section Networking (Réseau) > Firewalls (Pare-feu), pour autoriser le trafic HTTP ou HTTPS vers la VM, sélectionnez Allow HTTP traffic (Autoriser le trafic HTTP) ou Allow HTTPS traffic (Autoriser le trafic HTTPS).

    Pour cet exemple, cochez la case Autoriser le trafic HTTP.

    Compute Engine ajoute un tag réseau à votre VM, qui associe la règle de pare-feu à la VM. Il crée ensuite la règle de pare-feu d'entrée correspondante qui autorise tout le trafic entrant sur tcp:80 (HTTP) ou tcp:443 (HTTPS).

  8. Pour enregistrer vos modifications, cliquez sur Enregistrer.

  9. Pour redémarrer la VM, cliquez sur Démarrer/Reprendre.

Pour en savoir plus, consultez la page Créer et démarrer une instance de VM.

Déployer une application sur la VM

Pour tester la configuration réseau et vérifier que le trafic est diffusé comme prévu, vous pouvez déployer une application simple sur votre VM qui écoute sur un port.

Par exemple, les commandes suivantes créent un service Web Node.js qui écoute sur le port 3000.

  1. Établissez une connexion SSH avec votre instance de VM.

  2. Mettez à jour vos dépôts de packages :

    sudo apt update
  3. Installez NVM, Node.js et npm.

    Pour en savoir plus, consultez la section Configurer un environnement de développement Node.js.

  4. Créez un fichier package.json de manière interactive:

    npm init

    Exemple :

    {
    "name": "test",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
    "test": "hello"
    },
    "author": "",
    "license": "ISC"
    }
  5. Installez Express, un framework d'application Web pour Node.js:

    npm install express
  6. Écrivez le code de l'application de test:

    vim app.js

    L'exemple suivant crée une application qui répond aux requêtes GET vers le chemin racine (/) avec le texte "Hello, world!".

    const express = require('express');
    const app = express();
    
    app.get('/', (req, res) => {
      res.status(200).send('Hello, world!').end();
    });
    
    app.listen(3000, () => {
      console.log('Sample app listening on port 3000.');
    });

    Notez le port sur lequel l'application écoute. Le même numéro de port doit être utilisé lors de la configuration du point de terminaison pour le service Annuaire des services.

  7. Vérifiez que l'application écoute sur le port 3000:

    node app.js

Compute Engine propose différentes options de déploiement. Pour en savoir plus, consultez la page Choisir une stratégie de déploiement Compute Engine pour votre charge de travail.

Configurer l'annuaire des services

Pour permettre l'appel d'un point de terminaison privé à partir de l'exécution d'un workflow, vous devez configurer un espace de noms de l'Annuaire des services, enregistrer un service dans l'espace de noms et ajouter un point de terminaison au service.

Par exemple, les commandes suivantes créent un espace de noms, un service et un point de terminaison qui spécifient le réseau VPC et l'adresse IP interne de votre instance de VM.

  1. Créez un espace de noms :

    gcloud service-directory namespaces create NAMESPACE \
        --location=REGION

    Remplacez les éléments suivants :

    • NAMESPACE: ID de l'espace de noms ou identifiant complet de l'espace de noms.
    • REGION: région Google Cloud contenant l'espace de noms (par exemple, us-central1).
  2. Créez un service:

    gcloud service-directory services create SERVICE \
        --namespace=NAMESPACE \
        --location=REGION

    Remplacez SERVICE par le nom du service que vous créez.

  3. Configurez un point de terminaison.

    gcloud service-directory endpoints create ENDPOINT \
        --namespace=NAMESPACE \
        --service=SERVICE \
        --network=projects/PROJECT_NUMBER/locations/global/networks/NETWORK_NAME \
        --port=PORT_NUMBER \
        --address=IP_ADDRESS \
        --location=REGION

    Remplacez les éléments suivants :

    • ENDPOINT: nom du point de terminaison que vous créez.
    • PORT_NUMBER: port sur lequel le point de terminaison s'exécute (par exemple, 3000).
    • IP_ADDRESS: adresse IPv6 ou IPv4 du point de terminaison. Il s'agit de l'adresse IP interne que vous avez notée précédemment.

Pour en savoir plus, consultez les pages Configurer le répertoire de services et Configurer l'accès au réseau privé.

Créer et déployer votre workflow

Les appels d'un point de terminaison privé à partir de Workflows sont effectués via une requête HTTP. Les méthodes de requête HTTP les plus courantes disposent d'un raccourci d'appel (tel que http.get et http.post), mais vous pouvez effectuer tous types de requête HTTP en définissant le champ call sur http.request et en spécifiant le type de requête à l'aide du champ method. Pour en savoir plus, consultez la section Envoyer une requête HTTP.

  1. Créez un fichier de code source pour votre workflow:

    touch call-private-endpoint.JSON_OR_YAML

    Remplacez JSON_OR_YAML par yaml ou json en fonction du format de votre workflow.

  2. Dans un éditeur de texte, copiez le workflow suivant (qui utilise dans ce cas un protocole HTTP pour la valeur url) dans votre fichier de code source:

    YAML

    main:
      steps:
        - checkHttp:
            call: http.get
            args:
              url: http://IP_ADDRESS
              private_service_name: "projects/PROJECT_ID/locations/REGION/namespaces/NAMESPACE/services/SERVICE"
            result: res
        - ret:
            return: ${res}

    JSON

    {
      "main": {
        "steps": [
          {
            "checkHttp": {
              "call": "http.get",
              "args": {
                "url": "http://IP_ADDRESS",
                "private_service_name": "projects/PROJECT_ID/locations/REGION/namespaces/NAMESPACE/services/SERVICE"
              },
              "result": "res"
            }
          },
          {
            "ret": {
              "return": "${res}"
            }
          }
        ]
      }
    }

    La valeur private_service_name doit être une chaîne qui spécifie un nom de service de l'Annuaire des services enregistré au format suivant:

    projects/PROJECT_ID/locations/LOCATION/namespaces/NAMESPACE_NAME/services/SERVICE_NAME

  3. Déployez le workflow. À des fins de test, vous pouvez associer le compte de service Compute Engine par défaut au workflow pour représenter son identité:

    gcloud workflows deploy call-private-endpoint \
        --source=call-private-endpoint.JSON_OR_YAML \
        --location=REGION \
        --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
  4. Exécutez le workflow :

    gcloud workflows run call-private-endpoint \
        --location=REGION

    Vous devriez obtenir un résultat semblable à celui-ci:

    argument: 'null'
    duration: 0.650784403s
    endTime: '2023-06-09T18:19:52.570690079Z'
    name: projects/968807934019/locations/us-central1/workflows/call-private-endpoint/executions/4aac88d3-0b54-419b-b364-b6eb973cc932
    result: '{"body":"Hello, world!","code":200,"headers":{"Connection":"keep-alive","Content-Length":"21","Content-Type":"text/html;
    charset=utf-8","Date":"Fri, 09 Jun 2023 18:19:52 GMT","Etag":"W/\"15-NFaeBgdti+9S7zm5kAdSuGJQm6Q\"","Keep-Alive":"timeout=5","X-Powered-By":"Express"}}'
    startTime: '2023-06-09T18:19:51.919905676Z'
    state: SUCCEEDED

Étape suivante