Collecter les journaux Cloudflare

Compatible avec :

Ce document explique comment ingérer des journaux Cloudflare dans Google Security Operations à l'aide d'un webhook (destination HTTP) ou de Google Cloud Storage. Cloudflare génère des données opérationnelles sous la forme de journaux pour DNS, les requêtes HTTP, les événements de pare-feu, l'audit, Zero Trust et CASB. Cette intégration vous permet d'envoyer ces journaux à Google SecOps pour analyse et surveillance.

Avant de commencer

Assurez-vous de remplir les conditions suivantes :

  • Instance Google SecOps.
  • Compte Cloudflare Enterprise avec Logpush activé.
  • Pour la méthode Webhook : accès privilégié à la console Google Cloud.
  • Pour la méthode GCS : accès privilégié à Google Cloud Storage.

Méthode 1 : Configurer l'exportation des journaux Cloudflare à l'aide d'un webhook (destination HTTP)

Cette méthode vous permet de diffuser les journaux Cloudflare directement vers Google Security Operations sans stockage intermédiaire, ce qui réduit les coûts et simplifie la configuration.

Configurer un flux Webhook dans Google SecOps

  1. Accédez à Paramètres SIEM > Flux.
  2. Cliquez sur Add New Feed (Ajouter un flux).
  3. Cliquez sur Configurer un flux unique.
  4. Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Cloudflare Webhook).
  5. Sélectionnez Webhook comme type de source.
  6. Sélectionnez Cloudflare comme type de journal.
  7. Cliquez sur Suivant.
  8. Spécifiez les valeurs des paramètres d'entrée suivants :
    • Délimiteur de fractionnement : \n.
    • Espace de noms de l'élément : espace de noms de l'élément.
    • Libellés d'ingestion : libellé à appliquer aux événements de ce flux.
  9. Cliquez sur Suivant.
  10. Vérifiez la configuration de votre nouveau flux sur l'écran Finaliser, puis cliquez sur Envoyer.
  11. Cliquez sur Générer une clé secrète pour générer une clé secrète permettant d'authentifier ce flux.
  12. Copiez et enregistrez la clé secrète, car vous ne pourrez plus l'afficher.
  13. Accédez à l'onglet Détails.
  14. Copiez l'URL du point de terminaison du flux à partir du champ Informations sur le point de terminaison.
  15. Cliquez sur OK.

Créer une clé API pour le flux Webhook

  1. Accédez à la page Identifiants de la console Google Cloud.
  2. Sélectionnez votre projet (celui associé à votre instance Google SecOps).
  3. Cliquez sur Créer des identifiants > Clé API.
  4. Cliquez sur Modifier la clé API.
  5. Sous Restrictions relatives aux API, sélectionnez Restreindre la clé.
  6. Dans le menu déroulant Sélectionner des API, recherchez et sélectionnez API Chronicle.
  7. Cliquez sur Enregistrer.
  8. Copiez la valeur de la clé API.

Configurer la destination HTTP Cloudflare Logpush

  1. Connectez-vous au tableau de bord Cloudflare.
  2. Sélectionnez le compte d'entreprise ou le domaine que vous souhaitez utiliser avec Logpush.
  3. Accédez à Données analytiques et journaux > Journaux.
  4. Cliquez sur Create a Logpush job (Créer un job Logpush).
  5. Dans Sélectionner une destination, choisissez Destination HTTP.
  6. Saisissez l'URL du point de terminaison HTTP avec les paramètres d'authentification :

    <ENDPOINT_URL>?header_X-goog-api-key=<API_KEY>&header_X-Webhook-Access-Key=<SECRET_KEY>
    

    Remplacez les éléments suivants :

    • <ENDPOINT_URL> : URL du point de terminaison du flux de Google SecOps.
    • <API_KEY> : clé API de la console Google Cloud (encodée au format URL si elle contient des caractères spéciaux).
    • <SECRET_KEY> : clé secrète du flux Webhook (encodée au format URL si elle contient des caractères spéciaux).
  7. Cliquez sur Continuer.

  8. Sélectionnez l'ensemble de données à transférer (par exemple, Requêtes HTTP, Journaux DNS, Événements de pare-feu, Journaux d'audit, Journaux Zero Trust, Résultats CASB).

  9. Configurez votre tâche Logpush :

    • Saisissez le nom de la tâche.
    • Sous Si les journaux correspondent, configurez éventuellement des filtres.
    • Dans Envoyer les champs suivants, sélectionnez les champs à inclure.
    • Choisissez le format du code temporel :
      • RFC 3339 (recommandé pour Google SecOps)
      • Unix (secondes depuis l'epoch)
      • UnixNano (nanosecondes depuis l'epoch)
    • Configurez le taux d'échantillonnage si nécessaire.
  10. Cliquez sur Envoyer pour créer la tâche Logpush.

Valider l'intégration du webhook

Une fois la configuration effectuée, les journaux devraient apparaître dans Google SecOps en quelques minutes. Pour effectuer la validation, procédez comme suit :

  1. Accédez à Investigation > Recherche SIEM.
  2. Recherchez les journaux portant le libellé d'ingestion que vous avez configuré.
  3. Vérifiez que les journaux Cloudflare sont analysés correctement.

Méthode 2 : Configurer l'exportation des journaux Cloudflare à l'aide de Google Cloud Storage

Créer un bucket Google Cloud Storage

  1. Connectez-vous à la console Google Cloud.
  2. Accédez à la page Cloud Storage > Buckets.
  3. Cliquez sur Créer.
  4. Sur la page Créer un bucket, saisissez les informations concernant votre bucket :
    • Nom : saisissez un nom unique qui répond aux exigences de dénomination des buckets (par exemple, cloudflare-data).
    • Type d'emplacement : sélectionnez un type d'emplacement et une région.
    • Pour activer l'espace de noms hiérarchique, cliquez sur la flèche d'expansion pour développer Optimiser pour les charges de travail orientées fichiers et à forte intensité de données, puis sélectionnez Activer l'espace de noms hiérarchique sur ce bucket.
  5. Cliquez sur Créer.

Accorder des autorisations Cloudflare au bucket

  1. Dans la console Cloud Storage, sélectionnez le bucket GCS (par exemple, cloudflare-data).
  2. Cliquez sur l'onglet Autorisations.
  3. Cliquez sur Accorder l'accès.
  4. Dans le champ Ajouter des comptes principaux, saisissez logpush@cloudflare-data.iam.gserviceaccount.com.
  5. Dans le menu déroulant Attribuer des rôles, sélectionnez Administrateur des objets Storage.
  6. Cliquez sur Enregistrer.

Configurer Cloudflare Logpush vers Cloud Storage

  1. Connectez-vous au tableau de bord Cloudflare.
  2. Sélectionnez le compte d'entreprise ou le domaine que vous souhaitez utiliser avec Logpush.
  3. Accédez à Données analytiques et journaux > Journaux.
  4. Cliquez sur Create a Logpush job (Créer un job Logpush).
  5. Dans Sélectionner une destination, choisissez Google Cloud Storage.
  6. Saisissez le chemin d'accès à votre bucket GCS (par exemple, cloudflare-data/logs/).
  7. Cliquez sur Continuer.

  8. Saisissez le jeton de propriété, puis cliquez sur Continuer.

  9. Sélectionnez l'ensemble de données à transférer vers l'espace de stockage.

  10. Configurez votre tâche Logpush :

    • Saisissez le nom de la tâche.
    • Sous Si les journaux correspondent, vous pouvez sélectionner les événements à inclure et/ou à supprimer de vos journaux.
    • Dans Envoyer les champs suivants, choisissez les champs à transférer.
    • Choisissez le format du code temporel :
      • RFC 3339 (recommandé pour Google SecOps)
      • Unix (secondes depuis l'epoch)
      • UnixNano (nanosecondes depuis l'epoch)
    • Configurez le taux d'échantillonnage si nécessaire.
  11. Cliquez sur Envoyer.

Configurer un flux dans Google SecOps pour ingérer les journaux Cloudflare depuis GCS

  1. Accédez à Paramètres SIEM > Flux.
  2. Cliquez sur Add New Feed (Ajouter un flux).
  3. Cliquez sur Configurer un flux unique.
  4. Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Cloudflare GCS Logs).
  5. Sélectionnez Google Cloud Storage V2 comme Type de source.
  6. Sélectionnez Cloudflare comme type de journal.
  7. Cliquez sur Obtenir un compte de service.
  8. Cliquez sur Suivant.
  9. Spécifiez les valeurs des paramètres d'entrée suivants :

    • URI du bucket Cloud Storage : URL du bucket Google Cloud Storage au format gs://my-bucket/<value>/.

    • Option de suppression de la source : sélectionnez l'option de suppression de votre choix :

      • Jamais : ne supprime jamais aucun fichier après les transferts (recommandé pour les tests).
      • Supprimer les fichiers transférés : supprime les fichiers après un transfert réussi.
      • Supprimer les fichiers transférés et les répertoires vides : supprime les fichiers et les répertoires vides après un transfert réussi.
    • Âge maximal du fichier : inclut les fichiers modifiés au cours des derniers jours. La valeur par défaut est de 180 jours.

    • Espace de noms de l'élément : espace de noms de l'élément.

    • Libellés d'ingestion : libellé à appliquer aux événements de ce flux.

  10. Cliquez sur Suivant.

  11. Vérifiez la configuration de votre nouveau flux sur l'écran Finaliser, puis cliquez sur Envoyer.

Accorder des autorisations IAM au compte de service Google SecOps

  1. Accédez à Cloud Storage > Buckets.
  2. Cliquez sur le nom du bucket (par exemple, cloudflare-data).
  3. Accédez à l'onglet Autorisations.
  4. Cliquez sur Accorder l'accès.
  5. Dans le champ Ajouter des comptes principaux, collez l'adresse e-mail du compte de service Google SecOps.
  6. Dans le menu déroulant Attribuer des rôles, sélectionnez Lecteur des objets de l'espace de stockage.
  7. Cliquez sur Enregistrer.

Table de mappage UDM

Champ du journal Mappage UDM Logique
ClientIP read_only_udm.principal.asset.ip, read_only_udm.principal.ip La valeur est extraite du champ "ClientIP".
ClientRequestHost read_only_udm.target.asset.hostname, read_only_udm.target.hostname La valeur est extraite du champ "ClientRequestHost".
ClientRequestMethod read_only_udm.network.http.method La valeur est extraite du champ ClientRequestMethod.
ClientRequestURI read_only_udm.target.url La valeur est extraite du champ ClientRequestURI. Si le champ "ClientRequestHost" n'est pas vide, la valeur est concaténée avec le champ "ClientRequestHost".
ClientSrcPort read_only_udm.principal.port La valeur est extraite du champ ClientSrcPort.
ClientRequestUserAgent read_only_udm.network.http.user_agent La valeur est extraite du champ "ClientRequestUserAgent".
ClientSSLCipher read_only_udm.network.tls.cipher La valeur est extraite du champ "ClientSSLCipher".
ClientSSLProtocol read_only_udm.network.tls.version La valeur est extraite du champ ClientSSLProtocol.
Country read_only_udm.target.location.country_or_region La valeur est extraite du champ "Pays".
CreatedAt read_only_udm.metadata.event_timestamp La valeur est extraite du champ "CreatedAt" (Créé le).
Datetime read_only_udm.metadata.event_timestamp La valeur est extraite du champ "Date/Heure".
DestinationIP read_only_udm.target.asset.ip, read_only_udm.target.ip La valeur est extraite du champ "DestinationIP".
DestinationPort read_only_udm.target.port La valeur est extraite du champ "DestinationPort".
DeviceID read_only_udm.principal.asset_id La valeur est extraite du champ "DeviceID" et est précédée de "Cloudflare:".
DeviceName read_only_udm.principal.asset.hostname, read_only_udm.principal.hostname La valeur est extraite du champ "DeviceName".
DstIP read_only_udm.target.asset.ip, read_only_udm.target.ip La valeur est extraite du champ "DstIP".
DstPort read_only_udm.target.port La valeur est extraite du champ "DstPort".
EdgeResponseBytes read_only_udm.network.received_bytes La valeur est extraite du champ "EdgeResponseBytes".
EdgeResponseStatus read_only_udm.network.http.response_code La valeur est extraite du champ EdgeResponseStatus.
EdgeServerIP read_only_udm.target.asset.ip, read_only_udm.target.ip La valeur est extraite du champ "EdgeServerIP".
Email read_only_udm.principal.user.email_addresses, read_only_udm.target.user.email_addresses La valeur est extraite du champ "Adresse e-mail".
FirewallMatchesActions read_only_udm.security_result.action La valeur est définie sur "ALLOW" si le champ FirewallMatchesAction est défini sur "allow", "Allow", "ALLOW", "skip", "SKIP" ou "Skip", sur "ALLOW_WITH_MODIFICATION" si le champ FirewallMatchesAction est défini sur "challengeSolved" ou "jschallengeSolved", sur "BLOCK" si le champ FirewallMatchesAction est défini sur "drop" ou "block", et sur "UNKNOWN_ACTION" si le champ FirewallMatchesAction n'est pas vide.
FirewallMatchesRuleIDs read_only_udm.security_result.rule_id La valeur est extraite du champ "FirewallMatchesRuleIDs".
FirewallMatchesSources read_only_udm.security_result.rule_name La valeur est extraite du champ "FirewallMatchesSources".
HTTPMethod read_only_udm.network.http.method La valeur est extraite du champ HTTPMethod.
HTTPHost read_only_udm.target.hostname La valeur est extraite du champ HTTPHost.
HTTPVersion read_only_udm.network.application_protocol La valeur est extraite du champ "HTTPVersion". Si la valeur contient "HTTP", elle est remplacée par "HTTP".
IPAddress read_only_udm.target.asset.ip, read_only_udm.target.ip La valeur est extraite du champ "IPAddress".
IsIsolated read_only_udm.about.labels, read_only_udm.security_result.about.resource.attribute.labels La valeur est extraite du champ "IsIsolated" et convertie en chaîne.
Location read_only_udm.principal.location.name La valeur est extraite du champ "Emplacement".
OriginIP read_only_udm.intermediary.ip, read_only_udm.target.asset.ip, read_only_udm.target.ip La valeur est extraite du champ "OriginIP".
OriginPort read_only_udm.target.port La valeur est extraite du champ "OriginPort".
OwnerID read_only_udm.target.user.product_object_id La valeur est extraite du champ "OwnerID".
Policy read_only_udm.security_result.rule_name La valeur est extraite du champ "Règle".
PolicyID read_only_udm.security_result.rule_id La valeur est extraite du champ "PolicyID".
PolicyName read_only_udm.security_result.rule_name La valeur est extraite du champ "PolicyName".
Protocol read_only_udm.network.ip_protocol La valeur est extraite du champ "Protocole" et convertie en majuscules.
QueryCategoryIDs read_only_udm.security_result.about.labels, read_only_udm.security_result.about.resource.attribute.labels La valeur est extraite du champ "QueryCategoryIDs".
QueryName read_only_udm.network.dns.questions.name La valeur est extraite du champ QueryName.
QueryNameReversed read_only_udm.network.dns.questions.name La valeur est extraite du champ "QueryNameReversed".
QuerySize read_only_udm.network.sent_bytes La valeur est extraite du champ "QuerySize".
QueryType read_only_udm.network.dns.questions.type La valeur est extraite du champ "QueryType". Si la valeur correspond à l'un des types d'enregistrement DNS connus, elle est mappée à sa valeur numérique correspondante. Sinon, la valeur est convertie en chaîne.
RData read_only_udm.network.dns.answers La valeur est extraite du champ "RData". Le champ "type" est converti en entier non signé.
RayID read_only_udm.metadata.product_log_id La valeur est extraite du champ "RayID".
Referer read_only_udm.network.http.referral_url La valeur est extraite du champ "Referer".
RequestID read_only_udm.metadata.product_log_id La valeur est extraite du champ RequestID.
ResolverDecision read_only_udm.security_result.summary La valeur est extraite du champ "ResolverDecision".
ResourceID read_only_udm.target.resource.id, read_only_udm.target.resource.product_object_id La valeur est extraite du champ "ResourceID".
ResourceType read_only_udm.target.resource.resource_subtype La valeur est extraite du champ ResourceType.
SNI read_only_udm.network.tls.client.server_name La valeur est extraite du champ "SNI".
SecurityAction read_only_udm.security_result.action La valeur est définie sur "ALLOW" si le champ SecurityAction ou sec_action est vide, sur "ALLOW_WITH_MODIFICATION" si le champ SecurityAction est "challengeSolved" ou "jschallengeSolved", et sur "BLOCK" si le champ SecurityAction est "drop" ou "block".
SecurityLevel read_only_udm.security_result.severity La valeur est extraite du champ "SecurityLevel" et est mappée à la valeur de gravité UDM correspondante.
SessionID read_only_udm.network.session_id La valeur est extraite du champ "SessionID".
SessionStartTime read_only_udm.metadata.event_timestamp La valeur est extraite du champ "SessionStartTime".
SourceIP read_only_udm.principal.asset.ip, read_only_udm.principal.ip, read_only_udm.src.asset.ip, read_only_udm.src.ip La valeur est extraite du champ SourceIP.
SourcePort read_only_udm.principal.port, read_only_udm.src.port La valeur est extraite du champ "SourcePort".
SrcIP read_only_udm.principal.asset.ip, read_only_udm.principal.ip La valeur est extraite du champ "SrcIP".
SrcPort read_only_udm.principal.port La valeur est extraite du champ "SrcPort".
TemporaryAccessDuration read_only_udm.network.session_duration.seconds La valeur est extraite du champ "TemporaryAccessDuration".
Timestamp read_only_udm.metadata.event_timestamp La valeur est extraite du champ "Code temporel".
Transport read_only_udm.network.ip_protocol La valeur est extraite du champ "Transport" et convertie en majuscules.
URL read_only_udm.target.url La valeur est extraite du champ "URL".
UserAgent read_only_udm.network.http.user_agent La valeur est extraite du champ "UserAgent".
UserID read_only_udm.principal.user.product_object_id La valeur est extraite du champ "UserID".
UserUID read_only_udm.target.user.product_object_id La valeur est extraite du champ UserUID.
VirtualNetworkID read_only_udm.principal.resource.product_object_id La valeur est extraite du champ "VirtualNetworkID".
WAFAction read_only_udm.security_result.about.labels, read_only_udm.security_result.about.resource.attribute.labels La valeur est extraite du champ "WAFAction".
WAFAttackScore read_only_udm.security_result.about.resource.attribute.labels La valeur est extraite du champ "WAFAttackScore".
WAFFlags read_only_udm.security_result.about.resource.attribute.labels La valeur est extraite du champ "WAFFlags".
WAFProfile read_only_udm.security_result.about.labels, read_only_udm.security_result.about.resource.attribute.labels La valeur est extraite du champ WAFProfile.
WAFRCEAttackScore read_only_udm.security_result.about.resource.attribute.labels La valeur est extraite du champ "WAFRCEAttackScore".
WAFRuleID read_only_udm.security_result.about.labels, read_only_udm.security_result.about.resource.attribute.labels, read_only_udm.security_result.threat_id La valeur est extraite du champ WAFRuleID.
WAFRuleMessage read_only_udm.security_result.rule_name, read_only_udm.security_result.threat_name La valeur est extraite du champ WAFRuleMessage.
WAFSQLiAttackScore read_only_udm.security_result.about.resource.attribute.labels La valeur est extraite du champ "WAFSQLiAttackScore".
WAFXSSAttackScore read_only_udm.security_result.about.resource.attribute.labels La valeur est extraite du champ "WAFXSSAttackScore".
ZoneID read_only_udm.additional.fields La valeur est extraite du champ "ZoneID".
read_only_udm.metadata.log_type La valeur est définie sur "CLOUDFLARE".
read_only_udm.metadata.product_name La valeur est définie sur "DNS Cloudflare Gateway" si le journal est un journal DNS, sur "HTTP Cloudflare Gateway" s'il s'agit d'un journal HTTP Gateway, sur "Audit Cloudflare" s'il s'agit d'un journal d'audit ou sur "Pare-feu d'application Web" dans le cas contraire.
read_only_udm.metadata.vendor_name La valeur est définie sur "Cloudflare".
read_only_udm.network.application_protocol La valeur est définie sur "DNS" si le journal est un journal DNS, sur "HTTP" si le champ HTTPVersion contient "HTTP", ou sur la valeur du champ Protocol convertie en majuscules si le champ Protocol n'est pas vide et n'est pas "tls" ni "TLS".
read_only_udm.network.direction La valeur est définie sur "OUTBOUND" si le champ "EgressIP" n'est pas vide.
read_only_udm.network.http.parsed_user_agent La valeur est extraite du champ UserAgent ou ClientRequestUserAgent et analysée à l'aide du filtre parseduseragent.
read_only_udm.extensions.auth.type La valeur est définie sur "MACHINE" si le champ "Action" est défini sur "login" ou "logout".
read_only_udm.metadata.event_type La valeur est définie sur "NETWORK_DNS" si le journal est un journal DNS, sur "NETWORK_CONNECTION" si le journal est un journal HTTP de passerelle, sur "USER_RESOURCE_ACCESS" si le journal est un journal d'audit et que les champs "ActorIP" et "ActorEmail" sont vides, sur "USER_RESOURCE_UPDATE_CONTENT" si le journal est un journal d'audit et que les champs "ResourceType" et "newvalue" ne sont pas vides, sur "USER_LOGIN" si le champ "Action" est défini sur "login", sur "USER_LOGOUT" si le champ "Action" est défini sur "logout", sur "USER_RESOURCE_ACCESS" si le champ "Email" n'est pas vide et correspond au format d'adresse e-mail, ou sur "NETWORK_CONNECTION" si les champs "EgressIP" et "SourceIP" ne sont pas vides ou si les champs "OriginIP" et "SourceIP" ne sont pas vides.
read_only_udm.target.file.mime_type La valeur est extraite du champ "EdgeResponseContentType".
read_only_udm.target.location.country_or_region La valeur est extraite du champ "Pays".
read_only_udm.target.resource.id La valeur est extraite du champ "AccountID" ou "ResourceID".
read_only_udm.target.resource.product_object_id La valeur est extraite du champ "AccountID", "AppUUID" ou "ResourceID".
read_only_udm.target.user.product_object_id La valeur est extraite du champ OwnerID ou UserUID.

Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.