Collecter les journaux Azure WAF

Compatible avec :

Ce document explique comment exporter les journaux Azure Web Application Firewall (WAF) vers Google Security Operations à l'aide d'un compte de stockage Azure. L'analyseur gère les journaux au format JSON et les transforme en UDM. Il traite les journaux contenant un tableau records en itérant sur chaque enregistrement et en mappant des champs spécifiques aux propriétés UDM. Si le tableau records est absent, l'analyseur gère le journal comme un événement unique, en extrayant et en mappant les champs en conséquence.

Avant de commencer

Assurez-vous de remplir les conditions préalables suivantes :

  • Instance Google SecOps
  • Un locataire Azure actif
  • Accès privilégié à Azure

Configurer un compte de stockage Azure

  1. Dans la console Azure, recherchez Comptes de stockage.
  2. Cliquez sur Créer.
  3. Spécifiez les valeurs des paramètres d'entrée suivants :
    • Abonnement : sélectionnez l'abonnement.
    • Groupe de ressources : sélectionnez le groupe de ressources.
    • Région : sélectionnez la région.
    • Performances : sélectionnez les performances (standard recommandé).
    • Redondance : sélectionnez la redondance (GRS ou LRS recommandé).
    • Nom du compte de stockage : saisissez un nom pour le nouveau compte de stockage.
  4. Cliquez sur Examiner et créer.
  5. Examinez l'aperçu du compte, puis cliquez sur Créer.
  6. Sur la page Présentation du compte de stockage, sélectionnez le sous-menu Clés d'accès dans Sécurité et mise en réseau.
  7. Cliquez sur Afficher à côté de key1 ou key2.
  8. Cliquez sur Copier dans le presse-papiers pour copier la clé.
  9. Enregistrez la clé dans un endroit sûr pour pouvoir l'utiliser ultérieurement.
  10. Sur la page Présentation du compte de stockage, sélectionnez le sous-menu Points de terminaison dans Paramètres.
  11. Cliquez sur Copier dans le presse-papiers pour copier l'URL du point de terminaison Blob service (Service Blob). Par exemple, https://<storageaccountname>.blob.core.windows.net.
  12. Enregistrez l'URL du point de terminaison dans un endroit sûr pour une utilisation ultérieure.

Configurer l'exportation de journaux pour les journaux Azure WAF

  1. Connectez-vous au portail Azure à l'aide de votre compte privilégié.
  2. Accédez à Règles de pare-feu d'application Web (WAF) et sélectionnez un WAF à surveiller.
  3. Sélectionnez Surveillance> Paramètres de diagnostic.
  4. Cliquez sur + Ajouter un paramètre de diagnostic.
    • Attribuez un nom descriptif au paramètre de diagnostic.
  5. Sélectionnez allLogs.
  6. Cochez la case Archiver dans un compte de stockage comme destination.
    • Spécifiez l'abonnement et le compte de stockage.
  7. Cliquez sur Enregistrer.

Configurer des flux

Il existe deux points d'entrée différents pour configurer les flux dans la plate-forme Google SecOps :

  • Paramètres SIEM> Flux
  • Plate-forme de contenu > Packs de contenu

Configurer des flux à partir de Paramètres SIEM > Flux

Pour configurer plusieurs flux pour différents types de journaux dans cette famille de produits, consultez Configurer des flux par produit.

Pour configurer un seul flux :

  1. Accédez à Paramètres SIEM> Flux.
  2. Cliquez sur Add New Feed (Ajouter un flux).
  3. Sur la page suivante, cliquez sur Configurer un seul flux.
  4. Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Journaux Azure WAF).
  5. Sélectionnez Microsoft Azure Blob Storage comme Type de source.
  6. Sélectionnez Azure WAF comme Type de journal.
  7. Cliquez sur Suivant.
  8. Spécifiez les valeurs des paramètres d'entrée suivants :

    • URI Azure : URL du point de terminaison du blob.
      • ENDPOINT_URL/BLOB_NAME
        • Remplacez l'élément suivant :
          • ENDPOINT_URL : URL du point de terminaison du blob (https://<storageaccountname>.blob.core.windows.net)
          • BLOB_NAME : nom du blob (par exemple, <logname>-logs)
    • L'URI est : sélectionnez le TYPE d'URI en fonction de la configuration du flux de journaux (Fichier unique | Répertoire | Répertoire incluant des sous-répertoires).
    • Options de suppression de la source : sélectionnez l'option de suppression en fonction de vos préférences d'ingestion.

    • Clé partagée : clé d'accès à Azure Blob Storage.

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

Configurer des flux depuis le Hub de contenu

Indiquez les valeurs des champs suivants :

  • URI Azure : URL du point de terminaison du blob.
    • ENDPOINT_URL/BLOB_NAME
      • Remplacez l'élément suivant :
        • ENDPOINT_URL : URL du point de terminaison du blob (https://<storageaccountname>.blob.core.windows.net)
        • BLOB_NAME : nom du blob (par exemple, <logname>-logs)
  • L'URI est : sélectionnez le TYPE d'URI en fonction de la configuration du flux de journaux (Fichier unique | Répertoire | Répertoire incluant des sous-répertoires).
  • Options de suppression de la source : sélectionnez l'option de suppression en fonction de vos préférences d'ingestion.
  • Clé partagée : clé d'accès à Azure Blob Storage.

Options avancées

  • Nom du flux : valeur préremplie qui identifie le flux.
  • Type de source : méthode utilisée pour collecter les journaux dans Google SecOps.
  • Espace de noms de l'élément : espace de noms associé au flux.
  • Libellés d'ingestion : libellés appliqués à tous les événements de ce flux.

Table de mappage UDM

Champ de journal Mappage UDM Logique
backendPoolName additional.fields[?key=='backendPoolName'].value.string_value La valeur est extraite du champ backendPoolName du journal brut.
backendSettingName additional.fields[?key=='backendSettingName'].value.string_value La valeur est extraite du champ backendSettingName du journal brut.
category metadata.product_event_type La valeur est extraite du champ category du journal brut.
EventEnqueuedUtcTime additional.fields[?key=='EventEnqueuedUtcTime'].value.string_value La valeur est extraite du champ EventEnqueuedUtcTime du journal brut lorsque le champ records existe.
EventProcessedUtcTime additional.fields[?key=='EventProcessedUtcTime'].value.string_value La valeur est extraite du champ EventProcessedUtcTime du journal brut lorsque le champ records existe.
operationName additional.fields[?key=='operationName'].value.string_value La valeur est extraite du champ operationName du journal brut.
properties.action additional.fields[?key=='action'].value.string_value La valeur est extraite du champ properties.action du journal brut lorsque le champ records existe.
properties.action security_result.action_details La valeur est extraite du champ properties.action du journal brut lorsque le champ records n'existe pas.
properties.clientIP, properties.clientIp principal.asset.ip, principal.ip La valeur est extraite du champ properties.clientIP ou properties.clientIp du journal brut, en privilégiant clientIP.
properties.clientPort principal.port La valeur est extraite du champ properties.clientPort du journal brut.
properties.clientResponseTime principal.resource.attribute.labels[?key=='Client Response Time'].value La valeur est extraite du champ properties.clientResponseTime du journal brut lorsque le champ records n'existe pas.
properties.details.data additional.fields[?key=='Properties data'].value.string_value La valeur est extraite du champ properties.details.data du journal brut lorsque le champ records existe.
properties.details.file principal.process.file.full_path La valeur est extraite du champ properties.details.file du journal brut lorsque le champ records n'existe pas.
properties.details.matches[].matchVariableName, properties.details.matches[].matchVariableValue additional.fields[?key.startsWith('%{idx} ')].value.string_value La valeur est extraite du tableau properties.details.matches du journal brut. Le key de l'UDM est construit à l'aide de l'index (idx) et de matchVariableName. Le value est extrait de matchVariableValue.
properties.details.message metadata.description La valeur est extraite du champ properties.details.message du journal brut après suppression des barres obliques inverses et des guillemets.
properties.details.msg metadata.description La valeur est extraite du champ properties.details.msg du journal brut lorsque le champ records existe.
properties.httpMethod network.http.method La valeur est extraite du champ properties.httpMethod du journal brut.
properties.httpStatus network.http.response_code La valeur est extraite du champ properties.httpStatus du journal brut.
properties.httpVersion network.application_protocol Si le champ properties.httpVersion contient HTTP, la valeur HTTP est attribuée.
properties.host, properties.hostname, properties.originalHost principal.asset.hostname, principal.hostname La valeur est extraite de properties.originalHost, properties.host ou properties.hostname, en respectant cet ordre de priorité.
properties.policyId security_result.detection_fields[?key=='policyId'].value La valeur est extraite du champ properties.policyId du journal brut.
properties.policyMode security_result.detection_fields[?key=='policyMode'].value La valeur est extraite du champ properties.policyMode du journal brut lorsque le champ records existe.
properties.policy additional.fields[?key=='Properties policy'].value.string_value La valeur est extraite du champ properties.policy du journal brut lorsque le champ records existe.
properties.receivedBytes network.received_bytes La valeur est extraite du champ properties.receivedBytes du journal brut.
properties.requestUri target.url La valeur est extraite du champ properties.requestUri du journal brut.
properties.ruleId security_result.rule_id La valeur est extraite du champ properties.ruleId du journal brut.
properties.ruleName security_result.rule_name La valeur est extraite du champ properties.ruleName du journal brut lorsque le champ records existe.
properties.ruleName, ruleSetType security_result.rule_name La valeur est extraite du champ properties.ruleName ou, s'il est vide, du champ ruleSetType dans le journal brut lorsque le champ records n'existe pas.
properties.ruleSetVersion security_result.detection_fields[?key=='ruleSetVersion'].value La valeur est extraite du champ properties.ruleSetVersion du journal brut.
properties.sentBytes network.sent_bytes La valeur est extraite du champ properties.sentBytes du journal brut.
properties.serverResponseLatency additional.fields[?key=='Server Response Latency'].value.string_value La valeur est extraite du champ properties.serverResponseLatency du journal brut lorsque le champ records n'existe pas.
properties.serverRouted target.asset.ip, target.ip, target.port L'adresse IP et le port sont extraits du champ properties.serverRouted.
properties.sslCipher network.tls.cipher La valeur est extraite du champ properties.sslCipher du journal brut.
properties.sslClientCertificateIssuerName network.tls.server.certificate.issuer La valeur est extraite du champ properties.sslClientCertificateIssuerName du journal brut.
properties.sslProtocol network.tls.version La valeur est extraite du champ properties.sslProtocol du journal brut.
properties.timeTaken additional.fields[?key=='Properties Timetaken'].value.string_value La valeur est extraite du champ properties.timeTaken du journal brut lorsque le champ records n'existe pas.
properties.trackingReference additional.fields[?key=='trackingReference'].value.string_value La valeur est extraite du champ properties.trackingReference du journal brut lorsque le champ records existe.
properties.transactionId network.session_id La valeur est extraite du champ properties.transactionId du journal brut.
properties.userAgent network.http.user_agent La valeur est extraite du champ properties.userAgent du journal brut.
properties.WAFEvaluationTime additional.fields[?key=='Properties WAFEvaluationTime'].value.string_value La valeur est extraite du champ properties.WAFEvaluationTime du journal brut lorsque le champ records n'existe pas.
properties.WAFMode additional.fields[?key=='Properties WAFMode'].value.string_value La valeur est extraite du champ properties.WAFMode du journal brut lorsque le champ records n'existe pas.
rec.category metadata.product_event_type La valeur est extraite du champ rec.category du journal brut lorsque le champ records existe.
rec.operationName additional.fields[?key=='operationName'].value.string_value La valeur est extraite du champ rec.operationName du journal brut lorsque le champ records existe.
rec.properties.clientIP, rec.properties.clientIp principal.asset.ip, principal.ip La valeur est extraite du champ rec.properties.clientIP ou rec.properties.clientIp du journal brut, en privilégiant clientIP lorsque le champ records existe.
rec.properties.clientPort principal.port La valeur est extraite du champ rec.properties.clientPort du journal brut lorsque le champ records existe.
rec.properties.host principal.asset.hostname, principal.hostname La valeur est extraite du champ rec.properties.host du journal brut lorsque le champ records existe.
rec.properties.policy additional.fields[?key=='Properties policy'].value.string_value La valeur est extraite du champ rec.properties.policy du journal brut lorsque le champ records existe.
rec.properties.requestUri target.url La valeur est extraite du champ rec.properties.requestUri du journal brut lorsque le champ records existe.
rec.properties.ruleName security_result.rule_name La valeur est extraite du champ rec.properties.ruleName du journal brut lorsque le champ records existe.
rec.properties.trackingReference additional.fields[?key=='trackingReference'].value.string_value La valeur est extraite du champ rec.properties.trackingReference du journal brut lorsque le champ records existe.
rec.resourceId target.resource.id La valeur est extraite du champ rec.resourceId du journal brut lorsque le champ records existe.
rec.time metadata.event_timestamp La valeur est extraite du champ rec.time du journal brut lorsque le champ records existe.
resourceId target.resource.id La valeur est extraite du champ resourceId du journal brut lorsque le champ records n'existe pas.
timeStamp metadata.event_timestamp La valeur est extraite du champ timeStamp du journal brut lorsque le champ records n'existe pas.
N/A metadata.event_type La valeur est définie sur NETWORK_CONNECTION si le principal (nom d'hôte ou adresse IP du client) et l'adresse IP de destination sont présents. Elle est définie sur STATUS_UPDATE si un compte principal est présent, mais que l'adresse IP de destination est manquante. Sinon, la valeur par défaut est GENERIC_EVENT ou la valeur du champ event_type.
N/A metadata.log_type La valeur est codée en dur sur AZURE_WAF.
N/A metadata.product_name La valeur est codée en dur sur Azure WAF Logs.
N/A metadata.vendor_name La valeur est codée en dur sur Microsoft.
N/A security_result.action La valeur est définie sur ALLOW si properties.action est Matched, et sur BLOCK si properties.action est Block.

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