查询 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

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

    注意

    SerDe 期望 Amazon S3 中的 WAF 日志中的每条 JSON 记录都位于单行文本中,并且不使用行终止字符分隔记录中的字段。如果 WAF 日志 JSON 文本是漂亮的打印格式,则当您在创建表后尝试对其进行查询时,可能会收到错误消息 HIVE_CURSOR_ERROR: Row is not a valid JSON Object (HIVE_CURSOR_ERROR: 行不是有效的 JSON 对象)

    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;