Collecter les journaux Azure WAF
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
- Dans la console Azure, recherchez Comptes de stockage.
- Cliquez sur Créer.
- 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.
- Cliquez sur Examiner et créer.
- Examinez l'aperçu du compte, puis cliquez sur Créer.
- 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.
- Cliquez sur Afficher à côté de key1 ou key2.
- Cliquez sur Copier dans le presse-papiers pour copier la clé.
- Enregistrez la clé dans un endroit sûr pour pouvoir l'utiliser ultérieurement.
- Sur la page Présentation du compte de stockage, sélectionnez le sous-menu Points de terminaison dans Paramètres.
- 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
. - 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
- Connectez-vous au portail Azure à l'aide de votre compte privilégié.
- Accédez à Règles de pare-feu d'application Web (WAF) et sélectionnez un WAF à surveiller.
- Sélectionnez Surveillance> Paramètres de diagnostic.
- Cliquez sur + Ajouter un paramètre de diagnostic.
- Attribuez un nom descriptif au paramètre de diagnostic.
- Sélectionnez allLogs.
- Cochez la case Archiver dans un compte de stockage comme destination.
- Spécifiez l'abonnement et le compte de stockage.
- 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 :
- Accédez à Paramètres SIEM> Flux.
- Cliquez sur Add New Feed (Ajouter un flux).
- Sur la page suivante, cliquez sur Configurer un seul flux.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Journaux Azure WAF).
- Sélectionnez Microsoft Azure Blob Storage comme Type de source.
- Sélectionnez Azure WAF comme Type de journal.
- Cliquez sur Suivant.
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
)
- Remplacez l'élément suivant :
- 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.
- URI Azure : URL du point de terminaison du blob.
Cliquez sur Suivant.
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
)
- Remplacez l'élément suivant :
- 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.