使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

如何在 CloudWatch 中分析 AWS WAF 日志?

4 分钟阅读
0

我将 AWS WAF 日志存储在 Amazon CloudWatch 中。我想分析和筛选这些日志。

解决方法

要分析和筛选 CloudWatch 中的特定日志请求,可使用 CloudWatch Logs Insights 或 CloudWatch 查询生成器。

使用 CloudWatch Logs Insights 来分析 AWS WAF 访问日志

您可以通过 CloudWatch 控制台AWS WAF 控制台中的 CloudWatch Logs Insights 选项卡使用 CloudWatch Logs Insights。

在 AWS WAF 中

完成以下步骤:

  1. 打开 AWS WAF 控制台
  2. 在导航窗格中的 AWS WAF 下,选择 Web ACLs(Web ACL)。
  3. 对于 Region(区域),选择包含您的 Web 访问控制列表 (Web ACL) 的 AWS 区域。
    **注意:**如果该 Web ACL 为 Amazon CloudFront 设置,则选择 Global(全球)。
  4. 选择您的 Web ACL。
  5. 从页面顶部的选项卡中,导航到 CloudWatch Logs Insights
  6. Query editor(查询编辑器)中,输入您的查询。使用查询语法来设计查询。您也可以从 Most frequently used queries(最常用查询)列表中选择查询。
  7. 选择 Run query(运行查询)。
  8. 要查看结果,请在导航窗格中选择 Logs(日志)。

在 CloudWatch 中

完成以下步骤:

  1. 打开 CloudWatch 控制台
  2. 在导航窗格中的 Logs(日志)下,选择 Logs Insights
  3. 对于 Select log group(s)(选择日志组),从列表中选择一个或多个要查询的日志组。或者,选择 Browse log groups(浏览日志组),然后选择您的查询。
  4. (可选)为要查询的时间段选择时间范围。
  5. 使用查询语法来设计查询。
  6. 要查看结果,请选择 Run query(运行查询)。

要筛选特定信息,请使用以下示例查询:

主要客户端 IP 地址

要统计向受保护资源发送请求的主要客户端 IP 地址,请运行以下查询:

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

主要国家/地区

要统计向受保护资源发送请求的主要国家/地区,请运行以下查询:

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

主要主机

要统计向受保护资源发送请求的主要主机标头,请运行以下查询:

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

主要方法

要统计用于向受保护资源发送请求的主要 HTTP 方法,请运行以下查询:

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

主要用户代理

要统计向受保护资源发送请求的主要用户代理,请运行以下查询:

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

主要 URI 路径

要列出受保护资源上访问量最高的 URI 路径,请运行以下查询:

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

主要终止规则

要统计您的日志中的主要终止规则,请运行以下查询:

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

筛选受阻止的请求

要筛选所有受阻止的请求及其终止规则、URI 路径和客户端 IP 地址,请运行以下查询:

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

按主机筛选

要按特定主机标头值筛选日志,请运行以下查询:

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"

**注意:**将 www.example.com 替换为您的主机名称。

筛选特定的用户代理

要按特定用户代理筛选日志,请运行以下查询:

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

**注意:**将 Postman 替换为您的用户代理。

按 POST 请求进行筛选

要按 POST 请求进行筛选,请运行以下查询:

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

按国家/地区筛选

要筛选出并非来自特定国家/地区的请求,请运行以下查询:

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

**注意:**将 US 替换为要筛选掉的国家/地区代码。

筛选受基于速率的规则阻止的请求

要筛选是否有受基于速率的规则阻止的请求,请运行以下查询:

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

跨站脚本攻击 (XSS) 或 SQL 注入

要在自定义规则或 AWS 托管式规则组的终止规则中查找导致 XSS 或 SQL 注入的模式,请运行以下查询。此查询会返回带有时间戳、客户端 IP 地址、来源国家/地区、匹配详细信息和请求 ID 的条目:

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

筛选按规则组中特定规则计数的请求

要筛选由规则组中特定规则计数然后由默认操作终止的请求,请运行以下查询:

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

**注意:**将 ruleId 替换为您的规则 ID。

筛选具有无效 CAPTCHA 的请求

要筛选具有无效 CAPTCHA 的前 100 个请求,请运行以下查询。此查询会返回发出请求的时间、IP 地址、请求 ID、响应代码和整条消息:

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

**注意:**将 100 替换为要筛选的请求数。

使用 CloudWatch 查询生成器来分析 AWS WAF 访问日志

要使用生成式人工智能来分析您的访问日志,请运行 CloudWatch 中的查询生成器

AWS 官方
AWS 官方已更新 2 个月前