Direkt zum Inhalt

Wie analysiere ich AWS-WAF-Protokolle in CloudWatch?

Lesedauer: 5 Minute
0

Ich möchte meine AWS WAF-Protokolle, die ich in Amazon CloudWatch speichere, analysieren und filtern.

Lösung

Verwende CloudWatch Logs Insights oder den CloudWatch-Abfragegenerator, um bestimmte AWS-WAF-Protokollanfragen in CloudWatch zu analysieren und zu filtern.

CloudWatch Log Insights

Du kannst CloudWatch Log Insights in der CloudWatch-Konsole oder in Protokoll-Insights in AWS WAF verwenden.

AWS WAF

Führe die folgenden Schritte aus:

  1. Öffne die AWS WAF-Konsole.
  2. Wähle im Navigationsbereich AWS WAF aus.
  3. Wähle Ressourcen und Schutzpakete aus.
  4. Wähle das Schutzpaket aus.
  5. Wähle Dashboard anzeigen aus.
  6. Erweitere Protokoll-Explorer unten auf der Seite.
  7. Wähle In CloudWatch anzeigen aus.
  8. Gib im Abfrage-Editor die Abfrage ein. Verwende die Abfragesyntax, um die Abfragen zu entwerfen. Sie können auch Abfragen aus der Liste der am häufigsten verwendeten Abfragen auswählen.
  9. Wähle Abfrage ausführen aus.

CloudWatch

Führe die folgenden Schritte aus:

  1. Öffne die CloudWatch-Konsole.
  2. Wähle im Navigationsbereich Protokolle aus.
  3. Wähle Protokoll-Insights aus.
  4. Öffne unter Protokoll-Insights das Drop-down Auswahlkriterien.
  5. Wähle eine oder mehrere Protokollgruppe(n) für die Abfrage aus. Oder wähle Protokollgruppen durchsuchen und dann die Protokollgruppe aus.
  6. (Optional) Wähle einen Zeitraum für die Abfrage aus.
  7. Verwende die Abfragesyntax, um die Abfragen zu entwerfen.
  8. Um die Ergebnisse anzuzeigen, wähle Abfrage ausführen.

CloudWatch-Abfragegenerator

Um die Zugriffsprotokolle mithilfe der generativen KI zu analysieren, führe den Abfragegenerator in CloudWatch aus.

Beispielabfragen zum Durchsuchen der Daten

Verwende die folgenden Beispielabfragen, um bestimmte Informationen mit CloudWatch Logs Insights herauszufiltern.

Top-Client-IPs

Führe die folgende Abfrage aus, um die Top-Client-IPs zu zählen, die auf die Protokolle zugreifen:

fields httpRequest.clientIp| stats count(*) as requestCount by httpRequest.clientIp
| sort requestCount desc

Die wichtigsten Länder

Führe die folgende Abfrage aus, um die Länder zu zählen, die am häufigsten auf die Protokolle zugreifen:

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

Die wichtigsten Hosts

Führe die folgende Abfrage aus, um die Top-Hosts zu zählen, die auf die Protokolle zugreifen:

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

Die besten Methoden

Führe die folgende Abfrage aus, um die wichtigsten Methoden zu zählen, die auf die Protokolle zugreifen:

stats count(*)as RequestCount by httpRequest.httpMethod as Method| sort RequestCount desc

Die wichtigsten User-Agents

Führe die folgende Abfrage aus, um die wichtigsten User-Agents zu zählen, die auf die Protokolle zugreifen:

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

Die wichtigsten Beendigungsregeln

Führe die folgende Abfrage aus, um die wichtigsten Beendigungsregeln in den Protokollen zu zählen:

stats count(*) as RequestCount by terminatingRuleId| sort RequestCount desc

Nach blockierten Anfragen filtern

Führe die folgende Abfrage aus, um nach allen blockierten Anfragen und deren Beendigungsregel, URI-Pfad und Client-IP zu filtern:

fields @timestamp, httpRequest.clientIp as ClientIP, httpRequest.uri as URI, terminatingRuleId as rule| filter action = "BLOCK"
| sort @timestamp desc

Nach Host filtern

Um die Protokolle nach einem bestimmten Host zu filtern, führe die folgende Abfrage aus:

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"

Hinweis: Ersetze www.example.com durch den Namen des Hosts.

Nach einer bestimmten Zeichenfolge filtern

Um die Protokolle nach einer bestimmten Zeichenfolge zu filtern, führe die folgende Abfrage aus:

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

Hinweis: Ersetze {jndi:ldap durch deine Zeichenfolge.

Nach POST-Anfragen filtern

Führe die folgende Anfrage aus, um nach POST-Abfragen zu filtern:

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

Nach Land filtern

Um Anforderungen herauszufiltern, die nicht aus einem bestimmten Land stammen, führen Sie die folgende Abfrage aus:

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

Hinweis: Ersetze US durch die Ländervorwahl, die du herausfiltern möchtest.

Filteranfragen, die durch ratenbasierte Regeln blockiert wurden

Führe die folgende Abfrage aus, um die Protokolle zu filtern, die durch eine ratenbasierte Regel blockiert werden:

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

Cross-Site-Scripting (XSS) oder SQL-Injektion

Führe die folgende Abfrage aus, um Muster zu finden, die XSS- oder SQL-Injektion in der Beendigungsregel für benutzerdefinierte Regeln oder von AWS verwaltete Regelgruppen verursachen:

fields @timestamp| parse @message ',"terminatingRuleMatchDetails":[*],' as terminatingRuleMatchData
| filter (terminatingRuleMatchData like /XSS/ or terminatingRuleMatchData like /SQL/)
| display @timestamp, httpRequest.clientIp, httpRequest.country, terminatingRuleMatchData, httpRequest.requestId

Die Abfrage zeigt Einträge mit einem Zeitstempel, einer Client-IP-Adresse, einem Ursprungsland, Übereinstimmungsdetails und der Anfragen-ID.

Filtern nach Anfragen, die nach einer bestimmten Regel in einer Regelgruppe gezählt wurden

Führe die folgende Abfrage aus, um Protokolleinträge nach Anfragen zu filtern, die eine bestimmte Regel in einer Regelgruppe standardmäßig zählt und beendet:

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

Hinweis: Ersetzen ruleId durch deine Regel-ID.

Filtern nach Anfragen mit einem CAPTCHA, das nicht gültig ist

Führe die folgende Abfrage aus, um nach den 100 häufigsten Anfragen, mit einem ungültigen CAPTCHA zu filtern:

fields @timestamp, httpRequest.clientIp, httpRequest.requestId, captchaResponse.failureReason, @message| filter captchaResponse.failureReason ='TOKEN_MISSING'
| sort @timestamp desc
| limit 100

Hinweis: Ersetze 100 in der Limit-Klausel durch die Anzahl der Anfragen, nach denen du filtern möchtest.

Diese Abfrage zeigt den Zeitpunkt der Anfrage, die IP-Adresse, die Anfragen-ID, den Antwortcode und die gesamte Nachricht.