Collecter les journaux AWS WAF
Ce document explique comment collecter les journaux du pare-feu d'application Web (WAF) AWS en configurant un flux Google Security Operations. L'analyseur transforme les journaux au format JSON brut en un format structuré conforme au UDM Google SecOps. Il extrait des champs tels que les adresses IP, les URL, les user-agents et les détails des règles de sécurité, et les met en correspondance avec les champs UDM correspondants pour une représentation et une analyse cohérentes.
Avant de commencer
- Assurez-vous de disposer d'une instance Google SecOps.
- Assurez-vous de disposer d'un accès privilégié à AWS.
Configurer le bucket Amazon S3
- Créez un bucket Amazon S3 en suivant ce guide de l'utilisateur: Créer un bucket.
- Enregistrez le nom et la région du bucket pour une utilisation ultérieure.
- Créez un utilisateur en suivant le guide de l'utilisateur Créer un utilisateur IAM.
- Sélectionnez l'utilisateur créé.
- Sélectionnez l'onglet Informations d'identification de sécurité.
- Cliquez sur Créer une clé d'accès dans la section Clés d'accès.
- Sélectionnez Service tiers comme Cas d'utilisation.
- Cliquez sur Suivant.
- Facultatif: ajoutez une balise de description.
- Cliquez sur Créer une clé d'accès.
- Cliquez sur Download CSV file (Télécharger le fichier CSV) pour enregistrer la clé d'accès et la clé d'accès secrète pour les utiliser ultérieurement.
- Cliquez sur OK.
- Sélectionnez l'onglet Autorisations.
- Cliquez sur Ajouter des autorisations dans la section Règles d'autorisation.
- Sélectionnez Ajouter des autorisations.
- Sélectionnez Joindre directement des règles.
- Recherchez et sélectionnez la règle AmazonS3FullAccess.
- Cliquez sur Suivant.
- Cliquez sur Ajouter des autorisations.
Créer une LCA (liste de contrôle d'accès) Web WAF
Si vous n'avez pas encore configuré AWS WAF, vous devez créer une liste de contrôle d'accès (LCA) Web WAF. Pour les configurations existantes, vous pouvez passer à la procédure suivante.
- Dans la console AWS, recherchez et sélectionnez AWS WAF et Shield.
- Cliquez sur Créer une ACL Web.
- Définissez les paramètres suivants :
- Name (Nom) : attribuez un nom à la LCA (par exemple,
my-waf-web-acl
). - Région: choisissez la région dans laquelle vous souhaitez appliquer le WAF.
- Métriques CloudWatch: activez la collecte de métriques pour suivre l'activité et les règles déclenchées.
- Name (Nom) : attribuez un nom à la LCA (par exemple,
- Une fois la LCA Web créée, sélectionnez celle pour laquelle vous souhaitez activer la journalisation.
Configurer la journalisation AWS WAF
- Dans la console AWS WAF, accédez à l'onglet Journalisation de votre ACL Web.
- Cliquez sur Activer la journalisation.
- Sélectionnez Amazon S3 comme destination de vos journaux.
- Choisissez le bucket S3 créé précédemment pour stocker les journaux.
- Facultatif: configurez un préfixe de journal pour organiser les journaux (par exemple,
waf-logs/
). - Cliquez sur Enregistrer.
Vérifier les autorisations du bucket S3
Assurez-vous que le bucket S3 dispose des autorisations appropriées pour qu'AWS WAF puisse écrire des journaux.
- Accédez à la console S3.
- Sélectionnez le bucket dans lequel les journaux seront stockés.
Dans l'onglet Permissions, ajoutez la stratégie de bucket suivante pour autoriser AWS WAF à écrire des journaux:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "wafv2.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::your-log-bucket-name/*" } ] }
- Cliquez sur Enregistrer.
Configurer un flux dans Google SecOps pour ingérer les journaux AWS WAF
- Accédez à SIEM Settings > Feeds (Paramètres du SIEM > Flux).
- Cliquez sur Ajouter.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Journaux AWS WAF).
- Sélectionnez Amazon S3 comme Type de source.
- Sélectionnez AWS WAF comme Type de journal.
- Cliquez sur Suivant.
Spécifiez les valeurs des paramètres d'entrée suivants:
- Region (Région) : région dans laquelle se trouve le bucket Amazon S3.
- URI S3: URI du bucket.
s3://your-log-bucket-name/waf-logs/
- Remplacez l'élément suivant :
your-log-bucket-name
: nom réel du bucket.
- Remplacez l'élément suivant :
- Un URI est: sélectionnez Répertoire ou 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.
- ID de clé d'accès: clé d'accès utilisateur ayant accès au bucket S3.
- Clé d'accès secrète: clé secrète de l'utilisateur ayant accès au bucket S3.
- Espace de noms des éléments: espace de noms des éléments.
- Libellés d'ingestion: libellé à appliquer aux événements de ce flux.
Cliquez sur Suivant.
Vérifiez la configuration de votre nouveau flux dans l'écran Finaliser, puis cliquez sur Envoyer.
Tableau de mappage UDM
Champ du journal | Mappage UDM | Logique |
---|---|---|
action | security_result.action | Si l'action est "ALLOW", définissez security_result.action sur "ALLOW" et security_result.severity sur "INFORMATIONAL". Si l'action est "BLOCK", définissez security_result.action sur "BLOCK". Si l'action est CAPTCHA et que captchaResponse.responseCode est 405, définissez security_result.action sur BLOCK et security_result.action_details sur "CAPTCHA {captchaResponse.failureReason}". |
captchaResponse.failureReason | security_result.action_details | Utilisé avec action et captchaResponse.responseCode pour déterminer security_result.action_details. |
captchaResponse.responseCode | security_result.action_details | À utiliser avec action et captchaResponse.failureReason pour déterminer security_result.action_details. |
httpRequest.clientIp | principal.ip, principal.asset.ip | Mappé directement sur principal.ip et principal.asset.ip. |
httpRequest.headers | target.hostname, target.asset.hostname, network.http.user_agent, network.http.parsed_user_agent, network.http.referral_url, target.location.country_or_region, target.resource.attribute.labels, target.user.userid | Itère sur chaque en-tête dans httpRequest.headers. Si le nom de l'en-tête est "host" ou "Host", la valeur est mappée sur target.hostname et target.asset.hostname. Si le nom de l'en-tête est "User-Agent" ou "user-agent", la valeur est mappée sur network.http.user_agent et analysée dans network.http.parsed_user_agent. Si le nom de l'en-tête est "Referer" ou "referer", la valeur est mappée sur network.http.referral_url. Si le nom de l'en-tête est "(?i)time-zone", la valeur est mappée sur target.location.country_or_region. Si le nom de l'en-tête est "authorization", la valeur est décodée, le nom d'utilisateur est extrait et mappé sur target.user.userid. Tous les autres en-têtes sont ajoutés sous forme de paires clé-valeur à target.resource.attribute.labels. |
httpRequest.httpMethod | network.http.method | Mappé directement sur network.http.method. |
httpRequest.requestId | network.session_id | Mappé directement sur network.session_id. |
httpRequest.uri | target.url | Mappé directement sur target.url. |
httpSourceId | target.resource.name | Mappé directement sur target.resource.name. |
httpSourceName | metadata.product_event_type | Mappé directement sur metadata.product_event_type. |
labels | security_result.rule_labels | Itère sur chaque étiquette de labels. Si le nom du libellé n'est pas vide, il est ajouté en tant que paire clé-valeur à security_result.rule_labels. |
nonTerminatingMatchingRules | security_result.action_details, security_result.rule_labels | Itère sur chaque règle de nonTerminatingMatchingRules. Si l'action est "ALLOW" et que l'action de la règle est "CAPTCHA", définissez security_result.action_details sur "CAPTCHA SUCCESSFUL" et ajoutez l'ID de la règle à security_result.rule_labels avec la clé "nonTerminatingCaptchaRuleName". Si l'action est "BLOCK" (BLOQUER) ou "ALLOW" (AUTORISER) et que l'action de la règle est "COUNT" (COMPTER), définissez security_result.action_details sur "COUNT RULE" (REGLE DE COMPTAGE) et ajoutez l'ID de la règle à security_result.rule_labels avec la clé "nonTerminatingCountRuleName". Si l'action est "BLOCK" ou "ALLOW" et que l'action de la règle est "CHALLENGE", définissez security_result.action_details sur "COUNT RULE" et ajoutez l'ID de la règle à security_result.rule_labels avec la clé "nonTerminatingChallengeRuleName". |
rateBasedRuleList | security_result.rule_id, security_result.rule_name, security_result.description | Si terminatingRuleType est défini sur "RATE_BASED", itère sur chaque règle de la liste rateBasedRuleList. Si terminatingRuleId correspond au nom de la règle, l'ID, le nom et la description de la règle sont mappés respectivement sur security_result.rule_id, security_result.rule_name et security_result.description. |
responseCodeSent | network.http.response_code | Mappé directement sur network.http.response_code et converti en entier. |
ruleGroupList | intermediary.labels, security_result.rule_id, security_result.rule_name, security_result.description, security_result.detection_fields | Itère sur chaque groupe de règles de ruleGroupList. L'ID du groupe de règles est ajouté en tant que paire clé-valeur à intermediary.labels. Si terminatingRuleType est "MANAGED_RULE_GROUP" et que terminatingRuleId correspond à l'ID du groupe de règles, l'ID, le nom et la description de la règle sont mappés respectivement sur security_result.rule_id, security_result.rule_name et security_result.description. Si terminatingRuleType est "GROUP", l'ID de la règle de fin est extrait et mappé sur security_result.rule_name et security_result.description. L'ID du groupe de règles de fin est ajouté à security_result.rule_labels avec la clé "terminatingRuleGroupName". Si terminatingRuleType est défini sur "REGULAR", l'action de la règle de fin est extraite et ajoutée aux champs security_result.detectionavec la clé "terminatingRuleAction{index}". |
terminatingRuleId | security_result.rule_id, security_result.rule_name, security_result.description | Si terminatingRuleType est "RATE_BASED", "MANAGED_RULE_GROUP" ou "REGULAR", terminatingRuleId est mappé sur security_result.rule_id, security_result.rule_name et utilisé pour créer security_result.description. |
terminatingRuleMatchDetails | security_result.description, security_result.category_details, security_result.detection_fields | Itère sur chaque correspondance dans terminatingRuleMatchDetails. Définit security_result.description sur "Règle d'arrêt". Si le type de condition n'est pas vide, il est ajouté à security_result.category_details. Si l'emplacement n'est pas vide, il est ajouté à security_result.detection_fields avec la clé "location". Pour chaque élément de données mis en correspondance, il est ajouté à security_result.detection_fields avec la clé "matchedData". |
terminatingRuleType | security_result.rule_type | Correspond directement à security_result.rule_type. |
timestamp | metadata.event_timestamp | Converti en code temporel et mappé sur metadata.event_timestamp. |
webaclId | intermediary.resource.name | Mappé directement sur intermediary.resource.name. |
metadata.vendor_name | Définissez-le sur "AMAZON". | |
metadata.product_name | Définissez-le sur "AWS Web Application Firewall". | |
metadata.log_type | Définissez-le sur "AWS_WAF". | |
network.application_protocol | Définissez-le sur "HTTP". | |
metadata.event_type | Défini sur "NETWORK_HTTP" si httpRequest.headers contient un en-tête "host" ou "Host". Sinon, définissez-le sur "STATUS_UPDATE". |
Modifications
2024-03-14
- Amélioration de la gestion des caractères d'échappement non valides dans les messages de journal afin de garantir un formatage JSON correct.
2023-12-29
- Standardisation du mappage des informations "user-agent" sur le champ UDM approprié.
- ID utilisateur extraits de l'en-tête "authorization" dans les requêtes HTTP.
2023-12-08
- Plusieurs bugs liés au mappage de noms d'hôte, à l'extraction de l'URL cible et au traitement des règles ont été corrigés.
- Amélioration de la gestion des erreurs dans des sections spécifiques de l'analyseur.
2023-12-11
- Prise en charge d'un nouveau format de journal en introduisant un nouveau modèle Grok.
2023-08-16
- Amélioration de la mise en correspondance des actions des règles de sécurité avec le champ UDM pour les champs de détection.
2022-12-16
- Optimisation de la logique de filtrage des dates et amélioration de la gestion des données JSON non valides.
- Informations sur l'user-agent mappées à partir des en-têtes HTTP vers un champ UDM dédié.
2022-12-11
- Suppression de la logique inutile pour la gestion des journaux de messages CSV et SYSLOG.
2022-07-22
- Cela a marqué la création initiale de l'analyseur.
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.