すこぶる.net

技術系備忘録など

AWS CloudWatch Logs Insights WAF

【CloudWatch Log Insights】WAFのログからUser-Agentを抽出する方法

投稿日:

AWS WAF のログからUser-Agent(ユーザーエージェント)を抽出して分析したい

AWS WAF のログを CLoudWatch Log Insights で分析した際に、User-Agent (ユーザーエージェント)の抽出に苦労したので、躓いた点と解決までの流れを記したいと思います。

まず、以下のクエリでどのようなログが出ているかを確認してみます。

 

WAFのログ(一部マスキングしています)

少し見づらいですが、httpRequest.headers.3 に今回取得したい User-Agent (ユーザーエージェント)が格納されていることが分かります。

  • httpRequest.headers.3.name: User-Agent
  • httpRequest.headers.3.value: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4240.193 Safari/537.36

目的のログの値は確認できましたが、ここで気になる点があります。
それは、httpRequest.headers.1, httpRequest.headers.2, httpRequest.headers.3 … と複数 httpRequest.headers が存在することです。
他のログを確認したところ、どうやら必ず httpRequest.headers.3 に User-Agent (ユーザーエージェント)が入っているわけではないようです。
httpRequest.clientIp のように決まったフィールドに入っていればよいのですが、User-Agent (ユーザーエージェント) や Host などの情報は httpRequest.headers に順不同に入れられています。

解決策

では、CloudWatch Log Insights で分析する際に、どのようにして WAF のログから User-Agent (ユーザーエージェント)を取得して使用するかを記します。

実は、 @message を parse することで取得が可能です。以下は @message の一部です。

 

では、 @timestamp, httpRequest.clientIp, httpRequest.contry と User-Agent を取得してみます。

 

注意点として、“User-Agent”, “user-agent” 大文字小文字を区別する必要があり、どちらか一方がログに入っていることがあります。
そのため以下のように、”User-Agent”, “user-agent” 別々に抽出し ua1, ua2 に格納します。どちらか一方は値が空になるため coalesce を使用して ua に格納します。
更に今回は、IP、 User-Agent ごとにどのくらい WAF に検知されていれるかカウントしてみます。

 

まとめ

CloudWatch Log Insights で WAF のログを分析し、IP と User-Agent ごとにどのくらい検知されているかカウントするところまでやってみました。
初めは User-Agent をうまく抽出することに悩み、更にそれぞれ “User-Agent” と “user-agent” のように大文字小文字の違いがありどのようにパースするかにも苦労しました。
この記事が誰かの役に立てば幸いです。

-AWS, CloudWatch Logs Insights, WAF
-, , ,

執筆者:

関連記事

【Nginx】Amazon S3へリバースプロキシ

Nginx から Amazon S3 へリバースプロキシ 今回は Nginx から Amazon S3 へリバースプロキシする方法について触れたいと思います。 ( 以前はプライベートな S3 へのリバ …

【AWS WAF】複数の特定パスだけ除外して Rate-based rule を設定する方法

AWS WAF を使って複数の特定のページ(パス)を除外した Rate-based rule を設定する方法 CloudFront や ALB に対して WAF をアタッチして Rate-based …

VPCエンドポイントのゲートウェイエンドポイントとは

概要 前回 VPCエンドポイントのインターフェイスエンドポイントを VPCピアリングを用いることで集約し、コストを削減する記事を上げました。 今回はゲートウェイタイプを利用するメリットや、利用するとど …

【AWS Lightsail】データベースのタイムゾーン変更方法

Amazon Lightsail のデータベースのタイムゾーン変更方法について Amazon Lightsail のデーターベースを使っているときに、time_zone を UTC から Asia/T …

DNSの多段CNAMEとRoute53のエイリアスレコードとは

多段 CNAME とは 多段 CNAME とは、 DNS において、 CNAME レコードに別の CNAME レコードを登録することです。 具体的には以下のようなレコードを多段 CNAME といいます …