因此,AWS Cloudfront WAF 日志将发送到 AWS Cloud Insights。如何搜索 httpRequest 数组的键/值对的随机放置?
示例日志如下所示:
httpRequest.headers.0.name host
httpRequest.headers.0.value www.somedomain.com
httpRequest.headers.1.name cache-control
httpRequest.headers.1.value no-cache
httpRequest.headers.2.name pragma
httpRequest.headers.2.value no-cache
httpRequest.headers.3.name accept
httpRequest.headers.3.value */*
httpRequest.headers.4.name accept-encoding
httpRequest.headers.4.value gzip, deflate
httpRequest.headers.5.name from
httpRequest.headers.5.value bingbot(at)microsoft.com
httpRequest.headers.6.name user-agent
httpRequest.headers.6.value Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
因此,一个带有 2 个哈希值的 JSON 数组。该数组中的顺序是随机的。有时用户代理将在 1 或 3 或 X 中。如何搜索与“用户代理”的“名称”字段的值相对应的“值”字段的值?即:我想搜索“bingbot”,但让它特定于匹配“用户代理”。我知道我可以对@message进行过滤以获取
bingbot
,但这看起来很昂贵并且不具体/容易出现错误点击。
好吧,所以我认为“最简单”的方法是将 @message 视为字符串并编写自己的解析规则,通过正则表达式将所需的值拉入您自己的列,然后您可以搜索/执行任何操作。
如果有人有更好的主意,我洗耳恭听。
fields @timestamp, @message
| parse @message /(?i)"name":"user-agent","value":"(?<httpRequestUserAgent>[^"]+)/
| filter action == "BLOCK"
| stats count() as httpRequestUserAgentCount by httpRequestUserAgent
| sort by httpRequestUserAgentCount desc
(?i) 将其标记为不区分大小写。
AWS 提供:
fields @timestamp, @message
| parse @message '{"name":"User-Agent","value":"*"}' as userAgent
| stats count(*) as requestCount by userAgent
| sort requestCount desc
| limit 100