如何在 CloudWatch 中分析 AWS WAF 日志?
我将 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 中
完成以下步骤:
- 打开 AWS WAF 控制台。
- 在导航窗格中的 AWS WAF 下,选择 Web ACLs(Web ACL)。
- 对于 Region(区域),选择包含您的 Web 访问控制列表 (Web ACL) 的 AWS 区域。
**注意:**如果该 Web ACL 为 Amazon CloudFront 设置,则选择 Global(全球)。 - 选择您的 Web ACL。
- 从页面顶部的选项卡中,导航到 CloudWatch Logs Insights。
- 在 Query editor(查询编辑器)中,输入您的查询。使用查询语法来设计查询。您也可以从 Most frequently used queries(最常用查询)列表中选择查询。
- 选择 Run query(运行查询)。
- 要查看结果,请在导航窗格中选择 Logs(日志)。
在 CloudWatch 中
完成以下步骤:
- 打开 CloudWatch 控制台。
- 在导航窗格中的 Logs(日志)下,选择 Logs Insights。
- 对于 Select log group(s)(选择日志组),从列表中选择一个或多个要查询的日志组。或者,选择 Browse log groups(浏览日志组),然后选择您的查询。
- (可选)为要查询的时间段选择时间范围。
- 使用查询语法来设计查询。
- 要查看结果,请选择 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 官方已更新 6 个月前
- AWS 官方已更新 8 个月前
- AWS 官方已更新 3 年前
- AWS 官方已更新 1 个月前