查询 AWS WAF 日志 - Amazon Athena
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

查询 AWS WAF 日志

AWS WAF 日志包含您的 Web ACL 所分析的流量相关信息,例如 AWS WAF 从 AWS 资源收到请求的时间,有关请求的详细信息,以及每个请求所匹配的规则的操作。

您可以为 AWS WAF 日志启用访问日志记录,将其保存到 Amazon S3,并在 Athena 中查询日志。有关启用 AWS WAF 日志以及有关日志记录结构的更多信息,请参阅 AWS WAF 开发人员指南 中的 记录 Web ACL 流量信息

记录您保存这些日志的 Amazon S3 存储桶。

为 AWS WAF 日志创建表

创建 AWS WAF 表

  1. 将以下 DDL 语句复制并粘贴到 Athena 控制台中。修改用于存储日志的 Amazon S3 存储桶的 LOCATION

    此查询使用 Hive JSON SerDe。AWS Glue 爬网程序在分析 AWS WAF 日志时建议表格式和 SerDe。

    CREATE EXTERNAL TABLE `waf_logs`( `timestamp` bigint, `formatversion` int, `webaclid` string, `terminatingruleid` string, `terminatingruletype` string, `action` string, `terminatingrulematchdetails` array< struct< conditiontype:string, location:string, matcheddata:array<string> > >, `httpsourcename` string, `httpsourceid` string, `rulegrouplist` array<string>, `ratebasedrulelist` array< struct< ratebasedruleid:string, limitkey:string, maxrateallowed:int > >, `nonterminatingmatchingrules` array< struct< ruleid:string, action:string > >, `httprequest` struct< clientip:string, country:string, headers:array< struct< name:string, value:string > >, uri:string, args:string, httpversion:string, httpmethod:string, requestid:string > ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'paths'='action,formatVersion,httpRequest,httpSourceId,httpSourceName,nonTerminatingMatchingRules,rateBasedRuleList,ruleGroupList,terminatingRuleId,terminatingRuleMatchDetails,terminatingRuleType,timestamp,webaclId') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://athenawaflogs/WebACL/'
  2. 在 Athena 控制台中运行查询。查询完成后,Athena 注册 waf_logs 表,使其中的数据可用于查询。

AWS WAF 日志的示例查询

以下查询计算 RATE_BASED 终止规则阻止某个 IP 地址的次数。

SELECT COUNT(httpRequest.clientIp) as count, httpRequest.clientIp FROM waf_logs WHERE terminatingruletype='RATE_BASED' AND action='BLOCK' GROUP BY httpRequest.clientIp ORDER BY count LIMIT 100;

以下查询针对来自属于爱尔兰 (IE) IP 地址的请求,计算请求到达但被 RATE_BASED 终止规则阻止的次数。

SELECT COUNT(httpRequest.country) as count, httpRequest.country FROM waf_logs WHERE terminatingruletype='RATE_BASED' AND httpRequest.country='IE' GROUP BY httpRequest.country ORDER BY count LIMIT 100;

以下查询计算请求被阻止的次数,并按照 WebACL、RuleId、ClientIP 和 HTTP 请求 URI 对结果分组。

SELECT COUNT(*) AS count, webaclid, terminatingruleid, httprequest.clientip, httprequest.uri FROM waf_logs WHERE action='BLOCK' GROUP BY webaclid, terminatingruleid, httprequest.clientip, httprequest.uri ORDER BY count DESC LIMIT 100;

以下查询计算特定终止规则 ID 匹配的次数 (WHERE terminatingruleid='e9dd190d-7a43-4c06-bcea-409613d9506e')。然后,查询按照 WebACL、操作、ClientIP 和 HTTP 请求 URI 对结果分组。

SELECT COUNT(*) AS count, webaclid, action, httprequest.clientip, httprequest.uri FROM waf_logs WHERE terminatingruleid='e9dd190d-7a43-4c06-bcea-409613d9506e' GROUP BY webaclid, action, httprequest.clientip, httprequest.uri ORDER BY count DESC LIMIT 100;