Welche Optionen habe ich, um in CloudWatch oder Amazon S3 gespeicherte AWS-WAF-Protokolle zu analysieren?

Lesedauer: 7 Minute
0

Ich speichere meine AWS-WAF-Protokolle in Amazon CloudWatch, Amazon Simple Storage Solution (Amazon S3) oder Amazon S3 als Ziel für meinen Amazon-Kinesis-Data-Firehose-Lieferdatenstrom. Welche Optionen habe ich, um meine AWS-WAF-Zugriffsprotokolle zu analysieren?

Auflösung

Um bestimmte Protokollanforderungen zu analysieren und zu filtern, verwenden Sie Amazon CloudWatch Logs Insights for CloudWatch-Protokolle oder Amazon Athena für Amazon-S3-Protokolle.

Analysieren von AWS-WAF-Zugriffsprotokollen mit CloudWatch-Logs-Insights

  1. Öffnen Sie die Amazon-CloudWatch-Konsole.
  2. Wählen Sie im Navigationsbereich Logs und dann Log Insights aus.
  3. Wählen Sie unter Protokollgruppe(n) auswählen eine oder mehrere abzufragende Protokollgruppen aus, die aus AWS-WAF-Zugriffsprotokollen bestehen.
  4. (Optional) Wählen Sie einen Zeitraum für den Zeitraum, den Sie abfragen möchten.
  5. Verwenden Sie Abfragesyntax zum Entwerfen.
  6. Wählen Sie Ausführen, um die Ergebnisse für die Protokollgruppe anzuzeigen.

Dies sind Beispielabfragen, mit denen Sie bestimmte Informationen für CloudWatch Logs Insights herausfiltern können:

Nach einer bestimmten Zeichenfolge filtern

Führen Sie diese Abfrage aus, um das Protokoll basierend auf einer bestimmten Zeichenfolge zu filtern:
Hinweis: Ersetzen Sie string {jndi:ldap. durch die Zeichenfolge, die Sie suchen möchten.

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 "{jndi:ldap"
| sort action, URI desc

Nach Host filtern

Führen Sie diese Abfrage aus, um nach Host zu filtern:
Hinweis: Ersetzen Sie den Host-Wert www.example.com durch den Host, den Sie suchen möchten.

parse @message /\{"name":"[Hh]ost\",\"value":\"(?<Host>[^"}]*)/
| filter Host = "www.example.com"
| fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.uri as URI

Nach POST-Anfragen filtern

Führen Sie diese Abfrage aus, um POST-Anfragen zu isolieren:

parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?<UserAgent>[^"}]*)/
| parse @message /\{"name":"[Hh]ost\",\"value":\"(?<Host>[^"}]*)/
| fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.httpMethod as Method, httpRequest.uri as URI, httpRequest.requestId as RequestID
| filter httpRequest.httpMethod ="POST"
| display Rule, action, Country, ClientIP, Method, URI, Host, UserAgent, RequestID
| sort Rule, action desc

Nach UserAgent filtern

Führen Sie diese Abfrage aus, um nach UserAgent zu filtern:
Hinweis: Ersetzen Sie User-Agent-Value durch Ihren UserAgent-Wert**.**

parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?<UserAgent>[^"}]*)/
| filter UserAgent like "<User-Agent-Value>"
| fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.uri as URI

Filteranfragen, die nicht aus einem Land stammen

Führen Sie diese Abfrage aus, um Anfragen zu filtern, die nicht aus einem bestimmten Land stammen:

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

Filter für Cross-Site-Scripting oder SQL-Injection

Führen Sie diese Abfrage aus, um nach Cross-Site-Scripting oder SQL-Injektion zu filtern:

fields @timestamp, terminatingRuleId, action, httpRequest.clientIp as ClientIP, httpRequest.country as Country, terminatingRuleMatchDetails.0.conditionType as ConditionType, terminatingRuleMatchDetails.0.location as Location, terminatingRuleMatchDetails.0.matchedData.0 as MatchedData
| filter ConditionType in["XSS","SQL_INJECTION"]

Zeitreihen basierend auf einer Kündigungsregel

Führen Sie diese Abfrage aus, um eine Zeitreihe basierend auf einer Abbruchregel zu filtern:

#Time Series by Terminating Rule
filter terminatingRuleId = "AWS-AWSManagedRulesCommonRuleSet"
| stats count(*) as requestCount by bin(30m)

Fassen Sie blockierte Anfragen nach ClientIP, Land, URI und Regel zusammen

Führen Sie diese Abfrage aus, um blockierte Anfragen nach ClientIP, Land, URI und Regel zusammenzufassen:

fields httpRequest.clientIp as ClientIP, httpRequest.country as Country, httpRequest.uri as URI, terminatingRuleId as Rule
| filter action = "BLOCK"
| stats count(*) as RequestCount by Country, ClientIP, URI, Rule
| sort RequestCount desc

Beste Client-IPs

Führen Sie diese Abfrage aus, um die besten Client-IPs zu zählen:

stats count(*) as RequestCount by httpRequest.clientIp as ClientIP
| sort RequestCount desc

Beste Länder

Führen Sie diese Abfrage aus, um die besten Länder zu zählen:

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

Beste Hosts

Führen Sie diese Abfrage aus, um die besten Hosts zu zählen:

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

Beste Methoden

Führen Sie diese Abfrage aus, um die besten Methoden zu zählen:

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

Häufigste Regeln zum Beenden

Führen Sie diese Abfrage aus, um die häufigsten Regeln zum Beenden zu zählen:

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

Beste UserAgents

Führen Sie diese Abfrage aus, um die besten UserAgents zu zählen:

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

Anforderung wurde nicht durch Default_Action oder Regeln mit Aktion ALLOW beendet

Führen Sie diese Abfrage aus, um nach Anforderungen zu filtern, die nicht durch eine Default_Action beendet wurden, oder Regeln mit Aktion ALLOW:

fields @timestamp, terminatingRuleId, action, @message
| filter terminatingRuleId != 'Default_Action' and action != 'ALLOW'
| sort @timestamp desc

Anfrage mit ungültigem Captcha-Token

Führen Sie diese Abfrage aus, um nach Anforderungen mit einem ungültigen Captcha-Token zu filtern:

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

Blockierung nach ratenbasierter Regel anfordern

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

fields @timestamp, httpRequest.clientIp, terminatingRuleId, httpRequest.country,@message
| filter terminatingRuleType ="RATE_BASED" ## and webaclId = "arn:aws:wafv2:us-east-1:xxxxxxxx:regional/webacl/waf-test/abcdefghijkl" ## uncomment to filter for specific WebACL
| sort requestCount desc

Alle von AWS Bot Control (ABC) erkannten Anforderungen filtern

Führen Sie diese Abfrage aus, um alle von ABC erkannten Anforderungen zu filtern:

fields @timestamp, @message
|filter @message like 'awswaf:managed:aws:bot-control'
| parse @message '"labels":[*]' as Labels
| sort @timestamp desc

Analysieren von AWS-WAF-Zugriffsprotokollen mit Amazon Athena

Sie können die AWS-WAF-Zugriffsprotokollierung direkt in einem Amazon-S3-Bucket aktivieren. Oder Sie können den Amazon Kinesis Data Firehose-Lieferstream verwenden, um Ihre AWS-WAF-Zugriffsprotokolle an einen Amazon S3-Bucket zu übermitteln. Informationen zum Speichern von Protokollen in Amazon S3 finden Sie unter Wie konfiguriere ich die umfassende AWS WAF-Protokollierung zum Speichern von Protokollen in Amazon S3?

Wenn sich Ihre Zugriffsprotokolle im Amazon-S3-Bucket befinden, erstellen Sie die AWS-WAF-Tabelle, um Amazon Athena zum Abfragen von Protokollen und Filtern verschiedener Details zu verwenden.

Diese Abfragen sind Beispiele, die Sie zum Abfragen von AWS-WAF-Protokollen mit Athena verwenden können:

Blockierte Anfragen mit AWS-WAF-Regelinformationen

Führen Sie diese Athena-Abfrage aus, um alle blockierten Anfragen mit der AWS-WAF-Regel aufzulisten:

SELECT timestamp,
    action,
    httpsourcename,
    httpsourceid,
    httprequest.requestID,
    httprequest.clientip,
    webaclid,
    terminatingruleid,
    terminatingruletype,
    rulegrouplist,
    terminatingrulematchdetails
FROM "wafv2"."waf_logs"
WHERE ("action" LIKE 'BLOCK')

Benutzer-Agent anfragen

Führen Sie diese Athena-Abfrage aus, um den Benutzer-Agent anzufordern:
Hinweis: Ersetzen Sie User-Agent durch Ihren UserAgent-Wert.

select n.value, count(n.value) as count
from waf_logs
cross join
unnest(
  cast(
    httprequest.headers as ARRAY(ROW(name VARCHAR, value VARCHAR))
    )
  ) as x(n)
where n.name = 'User-Agent'
group by n.value
ORDER BY count(n.value) DESC

URI anfragen

Führen Sie diese Athena-Abfrage aus, um den Anfrage-URI zu überprüfen:

SELECT
"httprequest"."uri"
, "count"(*) "count"
FROM
  waf_logs
WHERE ("action" LIKE 'BLOCK')
GROUP BY "httprequest"."uri"
ORDER BY "count" DESC

Blockierte Anfragen basierend auf ClientIP zählen

Führen Sie diese Athena-Abfrage aus, um die Anzahl der blockierten Anfragen basierend auf ClientIP und Land anzuzeigen:

SELECT
  "httprequest"."clientip"
, "count"(*) "count"
, "httprequest"."country"
FROM
waf_logs
WHERE ("action" LIKE 'BLOCK')
GROUP BY "httprequest"."clientip", "httprequest"."country"
ORDER BY "count" DESC

Anzahl der Anfragen anzeigen

Führen Sie diese Athena-Abfrage aus, um die Anzahl der Anfragen anzuzeigen:

SELECT 
  "httprequest"."clientip"
, "count"(*) "count"
,"httprequest"."country"
FROM
 waf_logs
WHERE ("action" LIKE
'BLOCK')
GROUP BY
"httprequest"."clientip", "httprequest"."country"
ORDER BY "count" DESC

Weitere Beispiele für Athena-Abfragen finden Sie unter Beispielabfragen für AWS-WAF-Protokolle.


AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren