Wie analysiere ich AWS-WAF-Protokolle in CloudWatch?

Lesedauer: 6 Minute
0

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

Lösung

Verwenden Sie CloudWatch Logs Insights oder den CloudWatch-Abfragegenerator, um bestimmte Protokollanforderungen in CloudWatch zu analysieren und zu filtern.

Verwenden Sie CloudWatch Logs Insights, um AWS WAF-Zugriffsprotokolle zu analysieren

Sie können CloudWatch Logs Insights von der CloudWatch-Konsole oder von der Registerkarte CloudWatch Logs Insights aus in der AWS WAF-Konsole verwenden.

Von AWS WAF

Führen Sie die folgenden Schritte aus:

  1. Öffnen Sie die AWS-WAF-Konsole.
  2. Wählen Sie im Navigationsbereich unter AWS WAF die Option Web-ACLs aus.
  3. Wählen Sie als Region die AWS-Region aus, die Ihre Web-Zugriffssteuerungsliste (Web-ACL) enthält.
    Hinweis: Wenn Ihre Web-ACL für Amazon CloudFront eingerichtet ist, wählen Sie Global aus.
  4. Wählen Sie Ihre Web-ACL aus.
  5. Navigieren Sie von den Registerkarten oben auf der Seite zu CloudWatch Logs Insights.
  6. Geben Sie im Abfrage-Editor Ihre Abfrage ein. Verwenden Sie die Abfragesyntax, um Ihre Abfragen zu entwerfen. Sie können auch Abfragen aus der Liste der am häufigsten verwendeten Abfragen auswählen.
  7. Wählen Sie Abfrage ausführen aus.
  8. Um die Ergebnisse anzuzeigen, wählen Sie im Navigationsbereich Protokolle aus.

Von CloudWatch

Führen Sie die folgenden Schritte aus:

  1. Öffnen Sie die CloudWatch-Konsole.
  2. Wählen Sie im Navigationsbereich unter Protokolle die Option Logs Insights aus.
  3. Wählen Sie für Protokollgruppe(n) auswählen eine oder mehrere Protokollgruppen, die abgefragt werden sollen, aus der Liste aus. Oder wählen Sie Protokollgruppen durchsuchen, und wählen Sie dann Ihre Abfrage aus.
  4. (Optional) Wählen Sie einen Zeitbereich für den Zeitraum, den Sie abfragen möchten.
  5. Verwenden Sie die Abfragesyntax, um Ihre Abfragen zu entwerfen.
  6. Um die Ergebnisse anzuzeigen, wählen Sie Abfrage ausführen.

Verwenden Sie die folgenden Beispielabfragen, um nach bestimmten Informationen zu filtern:

Die wichtigsten Client-IP-Adressen

Führen Sie die folgende Abfrage aus, um die IP-Adressen der wichtigsten Clients zu zählen, die Anforderungen an die geschützte Ressource stellen:

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

Die wichtigsten Länder

Führen Sie die folgende Abfrage aus, um die wichtigsten Länder zu zählen, aus denen Anforderungen an die geschützte Ressource gesendet werden:

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

Die wichtigsten Hosts

Führen Sie die folgende Abfrage aus, um die wichtigsten Host-Header zu zählen, die Anforderungen an die geschützte Ressource stellen:

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

Die besten Methoden

Führen Sie die folgende Abfrage aus, um die wichtigsten HTTP-Methoden zu zählen, die für Anforderungen an die geschützte Ressource verwendet werden:

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

Die wichtigsten Benutzeragenten

Führen Sie die folgende Abfrage aus, um die wichtigsten Benutzeragenten zu zählen, die Anforderungen an die geschützte Ressource stellen:

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

Die wichtigsten URI-Pfade

Führen Sie die folgende Abfrage aus, um die am häufigsten besuchten URI-Pfade auf den geschützten Ressourcen aufzulisten:

fields httpRequest.uri
| stats count(*) as uriVisits by httpRequest.uri
| sort uriVisits desc
| limit 50

Die wichtigsten Beendigungsregeln

Führen Sie die folgende Abfrage aus, um die wichtigsten Beendigungsregeln in Ihren Protokollen zu zählen:

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

Blockierte Anforderungen filtern

Führen Sie die folgende Abfrage aus, um nach allen blockierten Anforderungen und deren Beendigungsregel, URI-Pfad und Client-IP-Adresse 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 Protokolle nach einem bestimmten Host-Header-Wert zu filtern, 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":\"(?Host[^\"]*)\"/
| filter Host = "www.example.com"

**Hinweis:Ersetzen Sie ** durch den Namen Ihres Hosts.

Filter für einen bestimmten Benutzeragenten

Um Ihre Protokolle nach einem bestimmten Benutzeragenten zu filtern, führen Sie 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\":\"(?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

**Hinweis:**Ersetzen Sie Postman durch Ihren Benutzeragenten.

POST-Anforderungen herausfiltern

Führen Sie die folgende Abfrage aus, um nach POST-Anforderungen 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\":\"[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

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\":\"(?Host[^\"]*)\"/
| parse @message /\"name\":\"[Uu]ser\-[Aa]gent\",\"value\":\"(?UserAgent[^\"]*)\"/
| filter Country != "US"
| sort Country, action desc

**Hinweis:**Ersetzen Sie US durch die Ländervorwahl, die Sie herausfiltern möchten.

Filteranforderungen, die durch ratenbasierte Regeln blockiert wurden

Führen Sie die folgende Abfrage aus, um nach Anforderungen zu filtern, die durch eine ratenbasierte Regel blockiert wurden:

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-Injection

Führen Sie die folgende Abfrage aus, um Muster zu finden, die XSS- oder SQL-Injection in der Beendigungsregel für eine benutzerdefinierte Regel oder eine Regelgruppe von AWS Managed Rules verursachen. Die Abfrage gibt Einträge mit einem Zeitstempel, einer Client-IP-Adresse, einem Ursprungsland, Übereinstimmungsdetails und der Anforderungs-ID zurück:

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

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

Führen Sie die folgende Abfrage aus, um nach Anforderungen zu filtern, die nach einer bestimmten Regel in einer Regelgruppe gezählt und dann durch die Standardaktion beendet werden:

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 Sie ruleId durch Ihre Regel-ID.

Filtern Sie Anforderungen mit einem CAPTCHA, das nicht gültig ist

Führen Sie die folgende Abfrage aus, um nach den 100 häufigsten Anforderungen mit einem ungültigen CAPTCHA zu filtern. Diese Abfrage gibt den Zeitpunkt der Anforderung, die IP-Adresse, die Anforderungs-ID, den Antwortcode und die gesamte Nachricht zurück:

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

**Hinweis:**Ersetzen Sie 100 durch die Anzahl der Anforderungen, nach denen Sie filtern möchten.

Verwenden Sie den CloudWatch-Abfragegenerator, um die AWS WAF-Zugriffsprotokolle zu analysieren

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

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 4 Monaten