通过 http 标头搜索 Athena AWS WAF 日志

问题描述

我已将 AWS WAF 日志记录设置为 S3,并按照文档 ( https://docs.aws.amazon.com/athena/latest/ug/waf-logs.html ) 中的描述创建了一个 Athena 表

但是,http 标头存储为 array<struct<name: string,value: string>> 而不是地图(出于正当理由)。我想写一个

这样的查询

select headers.user-agent,headers.if-none-match from waf_logs where something;

if-none-match 可能出现也可能不出现在标题列表中。

使用 CROSS JOIN UNnesT(httprequest.headers) 不起作用,因为这会创建多行。使用地图符号不起作用,因为它是结构数组,而不是地图。

互联网上有很多关于如何设置表格的页面,但没有多少提供实际查询的工作示例,而且我找不到关于如何通过嵌套属性进行查询页面

我非常感谢任何建议。谢谢!

解决方法

这是一个 WAF 查询,它应该可以解决请求标头的问题:

WITH waf_data AS (
  SELECT
    waf.action as action,waf.httprequest.clientip as clientip,waf.httprequest.country as country,map_agg(f.name,f.value) AS kv
  FROM "waf_logs" waf,UNNEST(waf.httprequest.headers) AS t(f)
  GROUP BY 1,2,3 
)
SELECT
  waf_data.action,waf_data.clientip,waf_data.country,waf_data.kv['Host'] AS host,waf_data.kv['User-Agent'] as UserAgent,waf_data.kv['Cookie'] as cookie
FROM waf_data
WHERE waf_data.kv['Host'] like 'waf_alb.us-east-2.elb.amazonaws.com'
LIMIT 10;