Comment analyser les journaux AWS WAF dans CloudWatch ?

Lecture de 7 minute(s)
0

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 :

  1. Ouvrez la console AWS WAF.
  2. Dans le volet de navigation, sous AWS WAF, sélectionnez Listes ACL Web.
  3. 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.
  4. Sélectionnez votre liste ACL Web.
  5. Dans les onglets situés en haut de la page, accédez à CloudWatch Logs Insights.
  6. 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.
  7. Sélectionnez Exécuter la requête.
  8. Pour consulter vos résultats, dans le volet de navigation, sélectionnez Journaux.

Depuis CloudWatch

Procédez comme suit :

  1. Ouvrez la console CloudWatch.
  2. Dans le volet de navigation, sous Journaux, sélectionnez Logs Insights.
  3. 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.
  4. (Facultatif) Choisissez une plage de temps pour la période que vous souhaitez interroger.
  5. Utilisez la syntaxe de requête pour concevoir vos requêtes.
  6. 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.

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 4 mois