すこぶる.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
-, , ,

執筆者:

関連記事

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

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

NginxからプライベートのS3にリバースプロキシ

概要 Nginx から AWS にあるプライベートな S3 のバケットにリバースプロキシしたいという要件があったため、その方法をご紹介します。 AWS にある EC2 上からであれば、IAM Role …

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

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

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

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

AWS Copilot CLI で Laravel アプリケーションを Fargate にデプロイして Nginx とコンテナ間共有する

Copilot CLI で Fargate にデプロイした Laravel コンテナと Nginx コンテナのファイル共有 AWS Copilot CLI を使用して Laravel フレームワークで …