En utilisant AWS re:Post, vous acceptez les AWS re:Post Conditions d’utilisation

Comment analyser les journaux AWS WAF dans CloudWatch ?

Lecture de 6 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 spécifiques sur les journaux 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 Log Insights depuis la console CloudWatch ou depuis l'onglet Log Insights dans AWS WAF.

Depuis AWS WAF

Procédez comme suit :

  1. Ouvrez la console AWS WAF.
  2. Dans le volet de navigation, sélectionnez AWS WAF, puis 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 le volet de navigation, sélectionnez Logs Insights.
  6. Sélectionnez les groupes de journaux que vous souhaitez interroger.
  7. 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.
  8. Sélectionnez Exécuter la requête.
  9. 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, sélectionnez Journaux, puis Log Insights.
  3. Pour Sélectionner un ou des groupes de journaux, sélectionnez un ou plusieurs groupes de journaux à interroger dans la liste déroulante. 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.

Vous pouvez utiliser les exemples de requêtes suivants pour filtrer des informations spécifiques grâce aux informations de CloudWatch Logs.

Principales adresses IP client

Pour compter les adresses IP des principaux clients qui accèdent à vos journaux, 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 qui accèdent à vos journaux, exécutez la requête suivante :

stats count(*) as RequestCount by httpRequest.country as Country
| sort RequestCount desc

Principaux hôtes

Pour compter les meilleurs hôtes qui accèdent à vos journaux, exécutez la requête suivante :

parse @message /\{"name":"[Hh]ost\",\"value":\"(?[^"}]*)/
|stats count(*) as RequestCount by Host
| sort RequestCount desc

Principales méthodes

Pour répertorier les principales méthodes qui accèdent à vos journaux, 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 accèdent à vos journaux, exécutez la requête suivante :

parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?[^"}]*)/
| stats count(*) as RequestCount by UserAgent
| sort RequestCount desc

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'un 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":\"(?[^"}]*)/
| filter Host = "www.example.com"

Remarque : Remplacez www.example.com par le nom de votre hôte.

Filtrer sur une chaîne spécifique

Pour filtrer vos journaux selon une chaîne 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":\"(?[^"}])/
| parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?[^"}])/
| filter @message like "{jndi:ldap"
| sort action, URI desc

Remarque : Remplacez {jndi:ldap. par votre chaîne.

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":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?[^"}]*)/
| parse @message /\{"name":"[Hh]ost\",\"value":\"(?[^"}]*)/
| filter httpRequest.httpMethod ="POST"
| display Rule, action, Country, ClientIP, Method, URI, Host, UserAgent
| sort Rule, action 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":\"(?[^"}]*)/
| parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?[^"}]*)/
| 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 vos journaux en fonction des requêtes bloquées par 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 cette requête. 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 entrées de journal pour 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 cette requête :

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.