Présentation de la journalisation des règles de pare-feu

La journalisation des règles de pare-feu vous permet de réaliser des audits, des vérifications et des analyses sur les effets de vos règles de pare-feu. Par exemple, vous pouvez déterminer si une règle de pare-feu conçue pour refuser le trafic fonctionne comme prévu. La journalisation des règles de pare-feu est également utile si vous devez déterminer le nombre de connexions affectées par une règle de pare-feu donnée.

Vous activez la journalisation des règles de pare-feu individuellement pour chaque règle de pare-feu dont vous souhaitez journaliser les connexions. Cette option est disponible pour toute règle de pare-feu, indépendamment de l'action de la règle (autorisation (allow) ou refus (deny)) et de la direction du trafic visé (entrée ou sortie).

Lorsque vous activez la journalisation pour une règle de pare-feu, Google Cloud crée une entrée appelée enregistrement de connexion chaque fois que la règle autorise ou refuse du trafic. Vous pouvez consulter ces enregistrements dans Cloud Logging et exporter les journaux vers n'importe quelle destination compatible avec l'exportation Cloud Logging.

Chaque enregistrement de connexion contient les adresses IP source et de destination, le protocole et les ports, la date et l'heure, ainsi qu'une référence à la règle de pare-feu appliquée au trafic.

La journalisation des règles de pare-feu est disponible pour les règles de pare-feu VPC et les stratégies de pare-feu hiérarchiques.

Pour en savoir plus sur l'affichage des journaux, reportez-vous à la page Utiliser la journalisation des règles de pare-feu.

Spécifications

La journalisation des règles de pare-feu obéit aux spécifications suivantes :

Exemples de journalisation

Une entrée de journal est générée à chaque application d'une règle de pare-feu pour laquelle la journalisation est activée. D'un point de vue global, un flux de paquets donné peut générer plusieurs entrées de journal. Cependant, du point de vue d'une VM donnée, une seule entrée de journal au plus peut être générée si la journalisation est activée pour la règle de pare-feu applicable à ce flux.

Les exemples suivants illustrent le fonctionnement des journaux de pare-feu.

Exemple avec refus de trafic sortant

Dans cet exemple :

  • On considère le trafic entre les instances de VM du réseau VPC example-net hébergé dans le projet example-proj.
  • Les deux instances de VM sont les suivantes :
    • VM1 située dans la zone us-west1-a, ayant l'adresse IP 10.10.0.99 dans le sous-réseau west-subnet (région us-west1).
    • VM2 située dans la zone us-east1-a, ayant l'adresse IP 10.20.0.99 dans le sous-réseau east-subnet (région us-east1).
  • Règle A : une règle de pare-feu refusant le trafic sortant cible toutes les instances du réseau, pour le trafic à destination de 10.20.0.99 (VM2) et circulant sur le port TCP 80.
    • La journalisation est activée pour cette règle.
  • Règle B : une règle de pare-feu autorisant le trafic entrant cible toutes les instances du réseau, pour le trafic en provenance de 10.10.0.99 (VM1) et circulant sur le port TCP 80.
    • La journalisation est également activée pour cette règle.

Vous pouvez utiliser les commandes gcloud suivantes pour créer les règles de pare-feu :

  • Règle A : règle de refus du trafic sortant du port TCP 80, applicable à toutes les instances, à destination de 10.20.0.99 :

    gcloud compute firewall-rules create rule-a \
        --network example-net \
        --action deny \
        --direction egress \
        --rules tcp:80 \
        --destination-ranges 10.20.0.99/32 \
        --priority 10 \
        --enable-logging
    
  • Règle B : règle d'autorisation du trafic entrant sur le port TCP 80, applicable à toutes les instances, en provenance de 10.10.0.99 :

    gcloud compute firewall-rules create rule-b \
        --network example-net \
        --action allow \
        --direction ingress \
        --rules tcp:80 \
        --source-ranges 10.10.0.99/32 \
        --priority 10 \
        --enable-logging
    
Connexion de la VM1 vers la VM2 (cliquez pour agrandir)
Connexion de la VM1 vers la VM2 (cliquez pour agrandir)

Supposons que la VM1 tente de se connecter à la VM2 sur le port TCP 80. Les règles de pare-feu suivantes sont enregistrées dans le journal :

  • Une entrée de journal pour la règle A, observée du point de vue de la VM1, est générée lorsque la VM1 tente de se connecter à 10.20.0.99 (VM2).
  • Étant donné que la règle A bloque le trafic, la règle B n'est jamais prise en compte. Par conséquent, aucune entrée de journal n'est consignée pour la règle B du point de vue de la VM2.

L'enregistrement de journal de pare-feu est généré dans l'exemple suivant.

Champ Valeurs
connection src_ip=10.10.0.99
src_port=[EPHEMERAL_PORT]
dest_ip=10.20.0.99
dest_port=80
protocol=tcp
disposition DENIED
rule_details reference = "network:example-net/firewall:rule-a"
priority = 10
action = DENY
destination_range = 10.20.0.99/32
ip_port_info = tcp:80
direction = egress
instance project_id="example-proj"
instance_name=VM1
region=us-west1
zone=us-west1-a
vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=west-subnet
remote_instance project_id="example-proj"
instance_name=VM2
region=us-east1
zone=us-east1-a
remote_vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=east-subnet
remote_location Aucune information Ce champ n'est utilisé que si la destination se situe en dehors de votre réseau VPC.

Exemple avec autorisation du trafic sortant et autorisation du trafic entrant

Dans cet exemple :

  • On considère le trafic entre les instances de VM du réseau VPC example-net hébergé dans le projet example-proj.
  • Les deux instances de VM sont les suivantes :
    • VM1 située dans la zone us-west1-a, ayant l'adresse IP 10.10.0.99 dans le sous-réseau west-subnet (région us-west1).
    • VM2 située dans la zone us-east1-a, ayant l'adresse IP 10.20.0.99 dans le sous-réseau east-subnet (région us-east1).
  • Règle A : une règle de pare-feu autorisant le trafic sortant cible toutes les instances du réseau, pour le trafic à destination de 10.20.0.99 (VM2) et circulant sur le port TCP 80.
    • La journalisation est activée pour cette règle.
  • Règle B : une règle de pare-feu autorisant le trafic entrant cible toutes les instances du réseau, pour le trafic en provenance de 10.10.0.99 (VM1) et circulant sur le port TCP 80.
    • La journalisation est également activée pour cette règle.

Vous pouvez utiliser les commandes gcloud suivantes pour créer les deux règles de pare-feu :

  • Règle A : règle d'autorisation du trafic sortant du port TCP 80, applicable à toutes les instances, à destination de 10.20.0.99 (VM2) :

    gcloud compute firewall-rules create rule-a \
        --network example-net \
        --action allow \
        --direction egress \
        --rules tcp:80 \
        --destination-ranges 10.20.0.99/32 \
        --priority 10 \
        --enable-logging
    
  • Règle B : règle d'autorisation du trafic entrant sur le port TCP 80, applicable à toutes les instances, en provenance de 10.10.0.99 (VM1) :

    gcloud compute firewall-rules create rule-b \
        --network example-net \
        --action allow \
        --direction ingress \
        --rules tcp:80 \
        --source-ranges 10.10.0.99/32 \
        --priority 10 \
        --enable-logging
    
Connexion de la VM1 vers la VM2 (cliquez pour agrandir)
Connexion de la VM1 vers la VM2 (cliquez pour agrandir)

Supposons que la VM1 tente de se connecter à la VM2 sur le port TCP 80. Les règles de pare-feu suivantes sont enregistrées dans le journal :

  • Une entrée de journal pour la règle A, observée du point de vue de la VM1, est générée lorsque la VM1 tente de se connecter à 10.20.0.99 (VM2).
  • Une entrée de journal pour la règle B, observée du point de vue de la VM2, est générée car la VM2 autorise les connexions entrantes en provenance de 10.10.0.99 (VM1).

L'enregistrement de journal de pare-feu rapporté par la VM1 est généré dans l'exemple suivant.

Champ Valeurs
connection src_ip=10.10.0.99
src_port=[EPHEMERAL_PORT]
dest_ip=10.20.0.99
dest_port=80
protocol=tcp
disposition ALLOWED
rule_details reference = "network:example-net/firewall:rule-a"
priority = 10
action = ALLOW
destination_range = 10.20.0.99/32
ip_port_info = tcp:80
direction = egress
instance project_id="example-proj"
instance_name=VM1
region=us-west1
zone=us-west1-a
vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=west-subnet
remote_instance project_id="example-proj"
instance_name=VM2
region=us-east1
zone=us-east1-a
remote_vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=east-subnet
remote_location Aucune information Ce champ n'est utilisé que si la destination se situe en dehors de votre réseau VPC.

L'enregistrement de journal de pare-feu rapporté par la VM2 est généré dans l'exemple suivant.

Champ Valeurs
connection src_ip=10.10.0.99
src_port=[EPHEMERAL_PORT]
dest_ip=10.20.0.99
dest_port=80
protocol=tcp
disposition ALLOWED
rule_details reference = "network:example-net/firewall:rule-b"
priority = 10
action = ALLOW
source_range = 10.10.0.99/32
ip_port_info = tcp:80
direction = ingress
instance project_id="example-proj"
instance_name=VM2
region=us-east1
zone=us-east1-a
vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=east-subnet
remote_instance project_id="example-proj"
instance_name=VM1
region=us-west1
zone=us-west1-a
remote_vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=west-subnet
remote_location Aucune information Ce champ n'est utilisé que si la destination se situe en dehors de votre réseau VPC.

Exemple de trafic entrant depuis Internet

Dans cet exemple :

  • On considère le trafic provenant d'un système situé en dehors du réseau VPC example-net, à destination d'une instance de VM sur ce réseau. Ce réseau est hébergé dans le projet example-proj.
  • Le système situé sur Internet possède l'adresse IP 203.0.113.114.
  • La VM1 située dans la zone us-west1-a possède l'adresse IP 10.10.0.99 dans le sous-réseau west-subnet (région us-west1).
  • Règle C : une règle de pare-feu autorisant le trafic entrant cible toutes les instances du réseau, pour le trafic en provenance de n'importe quelle adresse IP (0.0.0.0/0) et circulant sur le port TCP 80.
    • La journalisation est activée pour cette règle.
  • Règle D : une règle de pare-feu refusant le trafic sortant cible toutes les instances du réseau, pour le trafic à destination de n'importe quelle adresse IP (0.0.0.0/0), quel que soit le protocole.
    • La journalisation est également activée pour cette règle.

Vous pouvez utiliser les commandes gcloud suivantes pour créer les règles de pare-feu :

  • Règle C : règle d'autorisation du trafic entrant sur le port TCP 80, applicable à toutes les instances, en provenance de n'importe quelle source :

    gcloud compute firewall-rules create rule-c \
        --network example-net \
        --action allow \
        --direction ingress \
        --rules tcp:80 \
        --source-ranges 0.0.0.0/0 \
        --priority 10 \
        --enable-logging
    
  • Règle D : règle de refus du trafic sortant, quel que soit le protocole, applicable à toutes les instances, quelle que soit la destination :

    gcloud compute firewall-rules create rule-d \
        --network example-net \
        --action deny \
        --direction egress \
        --rules all \
        --destination-ranges 0.0.0.0/0 \
        --priority 10 \
        --enable-logging
    
Connexion depuis Internet vers la VM (cliquez pour agrandir)
Connexion depuis Internet vers la VM (cliquez pour agrandir)

Supposons que le système ayant l'adresse IP 203.0.113.114 tente de se connecter à la VM1 sur le port TCP 80. Cela déclenche les événements suivants :

  • Une entrée de journal pour la règle C, observée du point de vue de la VM1, est générée lorsque la VM1 accepte du trafic en provenance de 203.0.113.114.
  • Malgré la règle D, la VM1 est autorisée à répondre à la requête entrante car le pare-feu est configuré avec des règles Google Cloud avec état. Si une requête entrante est autorisée, aucune règle de sortie ne peut bloquer les réponses établies.
  • Comme la règle D ne s'applique pas, elle n'est jamais prise en compte et ne fait donc l'objet d'aucune entrée de journal.

L'enregistrement de journal de pare-feu est généré dans l'exemple suivant.

Champ Valeurs
connection src_ip=203.0.113.114
src_port=[EPHEMERAL_PORT]
dest_ip=10.10.0.99
dest_port=80
protocol=tcp
disposition ALLOWED
rule_details reference = "network:my-vpc/firewall:rule-c"
priority = 10
action = ALLOW
source_range = 0.0.0.0/0
ip_port_info = tcp:80
direction = ingress
instance project_id="example-proj"
instance_name=VM1
region=us-west1
zone=us-west1-a
vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=west-subnet
remote_location continent
country
region
city

Format des journaux de pare-feu

Conformément aux spécifications, une entrée de journal est créée dans Cloud Logging pour chaque règle de pare-feu pour laquelle la journalisation est activée, du moment que cette règle s'applique au trafic entrant ou sortant d'une instance de VM. Les enregistrements de journal sont inclus dans le champ de charge utile JSON d'un objet Logging LogEntry.

Les enregistrements de journal contiennent des champs de base, qui constituent les principaux champs de chaque enregistrement de journal, ainsi que des champs de métadonnées qui ajoutent des informations supplémentaires. Vous pouvez déterminer si les champs de métadonnées sont inclus. Si vous les omettez, vous pouvez économiser sur les coûts de stockage.

Certains champs de journal acceptent des valeurs qui sont également des champs. Ces champs peuvent contenir plusieurs données dans un champ donné. Par exemple, le champ connection est au format IpConnection, qui contient l'adresse IP et les ports sources et de destination ainsi que le protocole, dans un seul champ. Ces champs sont décrits dans les tableaux ci-dessous.

Champ Description Type de champ : métadonnées de base ou facultatives
connexion IpConnection
Hachage à cinq tuples décrivant les adresses IP source et de destination, les ports source et de destination, ainsi que le protocole IP de cette connexion.
Base
disposition string
Indique si la connexion a été autorisée (ALLOWED) ou refusée (DENIED).
Base
rule_details RuleDetails
Détails de la règle appliquée à cette connexion.
Champ rule.reference Base
Autres champs de détails de la règle Metadata
instance InstanceDetails
Détails de l'instance de VM. Dans une configuration de VPC partagé, project_id correspond à l'identifiant du projet de service.
Metadata
vpc VpcDetails
Détails du réseau VPC. Dans une configuration de VPC partagé, project_id correspond à l'ID du projet hôte.
Metadata
remote_instance InstanceDetails
Si le point de terminaison distant de la connexion était une VM hébergée dans Compute Engine, ce champ contient les détails de l'instance de VM.
Metadata
remote_vpc VpcDetails
Si le point de terminaison distant de la connexion était une VM hébergée sur un réseau VPC, ce champ contient les détails du réseau.
Metadata
remote_location GeographicDetails
Si le point de terminaison distant de la connexion était externe au réseau VPC, ce champ contient les métadonnées disponibles concernant son emplacement.
Metadata

IpConnection

Champ Type Description
src_ip string Adresse IP source. Si la source est une VM Compute Engine, src_ip est l'adresse IP interne principale ou une adresse dans une plage d'adresses IP d'alias de l'interface réseau de la VM. L'adresse IP externe n'est pas affichée. La journalisation affiche l'adresse IP de la VM telle qu'elle est vue par la VM dans l'en-tête du paquet, de la même manière que si vous réalisiez un vidage TCP sur la VM.
src_port integer Port source.
dest_ip string Adresse IP de destination. Si la destination est une VM Google Cloud, dest_ip est l'adresse IP interne principale ou une adresse dans une plage d'adresses IP d'alias de l'interface réseau de la VM. L'adresse IP externe ne s'affiche pas, même si elle a été utilisée pour établir la connexion.
dest_port integer Port de destination.
protocol integer Protocole IP de la connexion.

RuleDetails

Champ Type Description
reference string Référence à la règle de pare-feu, au format :
"network:{network name}/firewall:{firewall_name}"
priority integer Priorité de la règle de pare-feu.
action string ALLOW ou DENY.
source_range[ ] string Liste des plages d'adresses sources auxquelles la règle de pare-feu s'applique.
destination_range[ ] string Liste des plages d'adresses de destination auxquelles la règle de pare-feu s'applique.
ip_port_info[ ] IpPortDetails Liste des protocoles IP et des plages de ports auxquels les règles doivent s'appliquer.
direction string Direction dans laquelle la règle de pare-feu s'applique (entrée ou sortie).
source_tag[ ] string Liste de tous les tags sources auxquels la règle de pare-feu s'applique.
target_tag[ ] string Liste de tous les tags cibles auxquels la règle de pare-feu s'applique.
source_service_account[ ] string Liste de tous les comptes de service sources auxquels la règle de pare-feu s'applique.
target_service_account[ ] string Liste de tous les comptes de service cibles auxquels la règle de pare-feu s'applique.

IpPortDetails

Champ Type Description
ip_protocol string Protocole IP auquel la règle de pare-feu s'applique. Valeur "ALL" si la règle s'applique à tous les protocoles.
port_range[ ] string Liste des plages de ports auxquels les règles doivent s'appliquer, par exemple 8080-9090.

InstanceDetails

Champ Type Description
project_id string ID du projet contenant la VM
vm_name string Nom d'instance de la VM
region string Région de la VM
zone string Zone de la VM

VpcDetails

Champ Type Description
project_id string ID du projet hébergeant le réseau.
vpc_name string Réseau sur lequel opère la VM.
subnetwork_name string Sous-réseau sur lequel opère la VM.

GeographicDetails

Champ Type Description
continent string Continent des points de terminaison externes
country string Pays des points de terminaison externes
region string Région des points de terminaison externes
city string Ville des points de terminaison externes

Étapes suivantes