Comment analyser les journaux AWS WAF dans CloudWatch ?
Je stocke mes journaux AWS WAF dans Amazon CloudWatch. Je souhaite analyser et filtrer ces journaux.
Résolution
Pour analyser et filtrer des requêtes de journaux spécifiques dans CloudWatch, utilisez CloudWatch Logs Insights ou le générateur de requête CloudWatch.
Utiliser CloudWatch Log Insights pour analyser les journaux d'accès AWS WAF
Vous pouvez utiliser CloudWatch Logs Insights à partir de la console CloudWatch ou de l'onglet CloudWatch Logs Insights de la console AWS WAF.
À partir d’AWS WAF
Procédez comme suit :
- Ouvrez la console AWS WAF.
- Dans le volet de navigation, sous AWS WAF, sélectionnez Listes ACL Web.
- Pour Région, sélectionnez la région AWS qui contient votre liste de contrôle d'accès Web (liste ACL Web).
Remarque : Si votre liste ACL Web est configurée pour Amazon CloudFront, sélectionnez Global. - Sélectionnez votre liste ACL Web.
- Dans les onglets situés en haut de la page, accédez à CloudWatch Logs Insights.
- Dans l'Éditeur de requête, saisissez votre requête. Utilisez la syntaxe de requête pour concevoir vos requêtes. Vous pouvez également sélectionner des requêtes dans la liste des Requêtes les plus fréquemment utilisées.
- Sélectionnez Exécuter la requête.
- Pour consulter vos résultats, dans le volet de navigation, sélectionnez Journaux.
Depuis CloudWatch
Procédez comme suit :
- Ouvrez la console CloudWatch.
- Dans le volet de navigation, sous Journaux, sélectionnez Logs Insights.
- Pour Sélectionner un ou des groupes de journaux, sélectionnez un ou plusieurs groupes de journaux à interroger dans la liste. Vous pouvez également sélectionner Parcourir les groupes de journaux, puis sélectionner votre requête.
- (Facultatif) Choisissez une plage de temps pour la période que vous souhaitez interroger.
- Utilisez la syntaxe de requête pour concevoir vos requêtes.
- Pour consulter vos résultats, sélectionnez Exécuter la requête.
Pour filtrer des informations spécifiques, utilisez les exemples de requêtes suivants :
Principales adresses IP des clients
Pour compter les principales adresses IP des clients qui adressent des requêtes à votre ressource protégée, exécutez la requête suivante :
fields httpRequest.clientIp | stats count(*) as requestCount by httpRequest.clientIp | sort requestCount desc
Principaux pays
Pour compter les principaux pays à partir desquels les requêtes sont envoyées à votre ressource protégée, exécutez la requête suivante :
stats count(*) as RequestCount by httpRequest.country as Country | sort RequestCount desc
Principaux hôtes
Pour compter les principaux en-têtes d'hôtes qui adressent des requêtes à votre ressource protégée, exécutez la requête suivante :
parse @message /\"name\":\"[Hh]ost\",\"value\":\"(?Host[^\"]*)\"/ | stats count(*) as RequestCount by Host | sort RequestCount desc
Principales méthodes
Pour compter les principales méthodes HTTP utilisées pour envoyer des requêtes à votre ressource protégée, exécutez la requête suivante :
stats count(*)as RequestCount by httpRequest.httpMethod as Method | sort RequestCount desc
Principaux agents utilisateur
Pour compter les principaux agents utilisateur qui adressent des requêtes à votre ressource protégée, exécutez la requête suivante :
parse @message /\"name\":\"[Uu]ser\-[Aa]gent\",\"value\":\"(?UserAgent[^\"]*)\"/ | stats count(*) as RequestCount by UserAgent | sort RequestCount desc
Principaux chemins URI
Pour répertorier les chemins URI les plus visités sur vos ressources protégées, exécutez la requête suivante :
fields httpRequest.uri | stats count(*) as uriVisits by httpRequest.uri | sort uriVisits desc | limit 50
Principales règles de résiliation
Pour compter les principales règles de résiliation dans vos journaux, exécutez la requête suivante :
stats count(*) as RequestCount by terminatingRuleId | sort RequestCount desc
Filtrer les requêtes bloquées
Pour filtrer toutes les requêtes bloquées, ainsi que la règle de résiliation, le chemin URI et l’adresse IP client respectifs, exécutez la requête suivante :
fields @timestamp, httpRequest.clientIp as ClientIP, httpRequest.uri as URI, terminatingRuleId as rule | filter action = "BLOCK" | sort @timestamp desc
Filtrer par hôte
Pour filtrer vos journaux en fonction d'une valeur d’en-tête d’hôte spécifique, exécutez la requête suivante :
fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.uri as URI | parse @message /\{"name":"[Hh]ost\",\"value":\"(?Host[^\"]*)\"/ | filter Host = "www.example.com"
Remarque : Remplacez www.example.com par le nom de votre hôte.
Filtre pour un agent utilisateur spécifique
Pour filtrer vos journaux en fonction d'un agent utilisateur spécifique, exécutez la requête suivante :
fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.httpMethod as Method,httpRequest.uri as URI | parse @message /\"name\":\"[Hh]ost\",\"value\":\"(?Host[^\"]*)\"/ | parse @message /\"name\":\"[Uu]ser\-[Aa]gent\",\"value\":\"(?UserAgent[^\"]*)\"/ | filter @message like "Postman" | display Rule, action, Country, ClientIP, Method, URI, Host, UserAgent | sort action, URI desc
Remarque : Remplacez Postman par votre agent utilisateur.
Filtrer sur les requêtes POST
Pour filtrer les requêtes POST, exécutez la requête suivante :
fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.httpMethod as Method, httpRequest.uri as URI | parse @message /\"name\":\"[Hh]ost\",\"value\":\"(?Host[^\"]*)\"/ | parse @message /\"name\":\"[Uu]ser\-[Aa]gent\",\"value\":\"(?UserAgent[^\"]*)\"/ | filter httpRequest.httpMethod ="POST" | display Rule, action, Country, ClientIP, Method, URI, Host, UserAgent | sort @timestamp desc
Filtrer par pays
Pour filtrer les requêtes qui ne proviennent pas d'un pays spécifique, exécutez la requête suivante :
fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.uri as URI | parse @message /\"name\":\"[Hh]ost\",\"value\":\"(?Host[^\"]*)\"/ | parse @message /\"name\":\"[Uu]ser\-[Aa]gent\",\"value\":\"(?UserAgent[^\"]*)\"/ | filter Country != "US" | sort Country, action desc
Remarque : Remplacez USA par le code pays que vous souhaitez filtrer.
Filtrer les requêtes bloquées par des règles fréquentielles
Pour filtrer les requêtes bloquées en fonction d’une règle fréquentielle, exécutez la requête suivante :
fields @timestamp, httpRequest.clientIp as ClientIP, httpRequest.uri as URI, terminatingRuleId as rule, httpRequest.country as Country | filter action = "BLOCK" | filter terminatingRuleType = "RATE_BASED" | sort @timestamp desc
Scripts inter-site (XSS) ou injection SQL
Pour trouver des schémas qui provoquent une injection XSS ou SQL dans la règle de résiliation d'une règle personnalisée ou d'un groupe de règles gérées par AWS, exécutez la requête suivante. La requête renvoie des entrées avec un horodatage, l'adresse IP du client, le pays d'origine, les détails de la correspondance et l'ID de la requête :
fields @timestamp | parse @message ',"terminatingRuleMatchDetails":[*],' as terminatingRuleMatchData | filter (terminatingRuleMatchData like /XSS/ or terminatingRuleMatchData like /SQL/) | display @timestamp, httpRequest.clientIp, httpRequest.country, terminatingRuleMatchData, httpRequest.requestId
Filtrer les requêtes comptabilisées selon une règle spécifique dans un groupe de règles
Pour filtrer les requêtes qui sont comptabilisées selon une règle spécifique dans un groupe de règles, puis résiliées par l'action par défaut, exécutez la requête suivante :
fields @timestamp | filter (@message like 'excludedRules":[{"exclusionType":"EXCLUDED_AS_COUNT","ruleId":"NoUserAgent_HEADER"}]}' and @message like 'terminatingRuleId":"Default_Action"') | parse @message '"ruleId":*}]}' as ruleMatchDetails | display @timestamp, httpRequest.clientIp, httpRequest.country, ruleMatchDetails, httpRequest.requestId
Remarque : Remplacez ruleId par votre ID de règle.
Filtrer les requêtes avec un CAPTCHA non valide
Pour filtrer les 100 principales requêtes avec un CAPTCHA non valide, exécutez la requête suivante. Cette requête renvoie l'heure à laquelle la requête a été effectuée, l'adresse IP, l'ID de la requête, le code de réponse et l'intégralité du message :
fields @timestamp, httpRequest.clientIp, httpRequest.requestId, captchaResponse.failureReason, @message | filter captchaResponse.failureReason ='TOKEN_MISSING' | sort @timestamp desc | limit 100
Remarque : Remplacez 100 par le nombre de requêtes que vous souhaitez filtrer.
Utiliser le générateur de requête CloudWatch pour analyser les journaux d'accès AWS WAF
Pour utiliser l'IA générative afin d'analyser vos journaux d'accès, exécutez le générateur de requête dans CloudWatch.
Contenus pertinents
- Réponse acceptéedemandé il y a 2 moislg...
- demandé il y a 18 jourslg...
- demandé il y a 8 moislg...
- demandé il y a 6 moislg...
- demandé il y a un moislg...
- AWS OFFICIELA mis à jour il y a 2 mois
- AWS OFFICIELA mis à jour il y a 7 mois
- AWS OFFICIELA mis à jour il y a 7 mois
- AWS OFFICIELA mis à jour il y a 7 mois