CloudWatch の AWS WAF ログを分析する方法を教えてください。
AWS WAF ログを Amazon CloudWatch に保存しています。これらのログを分析してフィルター処理しようと考えています。
解決方法
CloudWatch で特定のログリクエストを分析およびフィルター処理するには、CloudWatch Logs Insights または CloudWatch クエリジェネレーターを使用します。
CloudWatch Logs Insights を使用して AWS WAF アクセスログを分析する
CloudWatch Logs Insights は、CloudWatch コンソールまたは AWS WAF コンソールの CloudWatch Logs Insights タブから使用できます。
AWS WAF からの操作
次の手順を実行します。
- AWS WAF コンソールを開きます。
- ナビゲーションペインの [AWS WAF] で、[ウェブ ACL] を選択します。
- [リージョン] で、ウェブアクセスコントロールリスト (ウェブ ACL) を含む AWS リージョンを選択します。
注: ウェブ ACL が Amazon CloudFront 用に設定されている場合は、[グローバル] を選択します。 - ウェブ ACL を選択します。
- ページ上部のタブから、CloudWatch Logs Insights に移動します。
- クエリエディタで、クエリを入力します。クエリ構文を使用してクエリを設計します。[よく使用するクエリ] リストからクエリを選択することもできます。
- [クエリを実行] を選択します。
- 結果を表示するには、ナビゲーションペインで [ログ] を選択します。
CloudWatch から
次の手順を実行します。
- CloudWatch コンソールを開きます。
- ナビゲーションペインの [ログ] で、[Logs Insights] を選択します。
- [ロググループの選択] で、クエリするロググループをリストから 1 つ以上選択します。または、[ロググループを参照] を選択し、クエリを選択します。
- (オプション) クエリする期間の時間範囲を選択します。
- クエリ構文を使用してクエリを設計します。
- 結果を表示するには、[クエリの実行] を選択します。
特定の情報をフィルター処理するには、次のサンプルクエリを使用します。
上位クライアント IP アドレス
保護対象リソースにリクエストを行っている上位のクライアント IP アドレスをカウントするには、次のクエリを実行します。
fields httpRequest.clientIp | stats count(*) as requestCount by httpRequest.clientIp | sort requestCount desc
上位の国
保護対象リソースにリクエストを送信した元である上位の国をカウントするには、次のクエリを実行します。
stats count(*) as RequestCount by httpRequest.country as Country | sort RequestCount desc
上位のホスト
保護対象リソースへのリクエストを行った元である上位ホストヘッダーをカウントするには、次のクエリを実行します。
parse @message /\"name\":\"[Hh]ost\",\"value\":\"(?Host[^\"]*)\"/ | stats count(*) as RequestCount by Host | sort RequestCount desc
上位のメソッド
保護対象リソースへのリクエストを行うために使用された上位の HTTP メソッドをカウントするには、次のクエリを実行します。
stats count(*)as RequestCount by httpRequest.httpMethod as Method | sort RequestCount desc
上位のユーザーエージェント
保護対象リソースにリクエストを行った元である上位のユーザーエージェントをカウントするには、次のクエリを実行します。
parse @message /\"name\":\"[Uu]ser\-[Aa]gent\",\"value\":\"(?UserAgent[^\"]*)\"/ | stats count(*) as RequestCount by UserAgent | sort RequestCount desc
トップ URI パス
保護対象リソースのうち、最もアクセス数の多い URI パスを一覧表示するには、次のクエリを実行します。
fields httpRequest.uri | stats count(*) as uriVisits by httpRequest.uri | sort uriVisits desc | limit 50
上位の終了ルール
ログ内の上位の終了ルールをカウントするには、次のクエリを実行します。
stats count(*) as RequestCount by terminatingRuleId | sort RequestCount desc
ブロックされたリクエストをフィルター処理する
ブロックされたすべてのリクエストと、それらの終了ルール、URI パス、クライアント IP アドレスをフィルター処理するには、次のクエリを実行します。
fields @timestamp, httpRequest.clientIp as ClientIP, httpRequest.uri as URI, terminatingRuleId as rule | filter action = "BLOCK" | sort @timestamp desc
ホストで絞り込む
特定のホストヘッダー値でログを絞り込むには、次のクエリを実行します。
fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.uri as URI | parse @message /\{"name":"[Hh]ost\",\"value":\"(?Host[^\"]*)\"/ | filter Host = "www.example.com"
注: www.example.com は、お使いのホスト名に置き換えてください。
特定のユーザーエージェントでフィルター処理する
特定のユーザーエージェントでログを絞り込むには、次のクエリを実行します。
fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.httpMethod as Method,httpRequest.uri as URI | parse @message /\"name\":\"[Hh]ost\",\"value\":\"(?Host[^\"]*)\"/ | parse @message /\"name\":\"[Uu]ser\-[Aa]gent\",\"value\":\"(?UserAgent[^\"]*)\"/ | filter @message like "Postman" | display Rule, action, Country, ClientIP, Method, URI, Host, UserAgent | sort action, URI desc
注: Postman は、実際のユーザーエージェントに置き換えてください。
POST リクエストをフィルター処理する
POST リクエストをフィルター処理するには、次のクエリを実行します。
fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.httpMethod as Method, httpRequest.uri as URI | parse @message /\"name\":\"[Hh]ost\",\"value\":\"(?Host[^\"]*)\"/ | parse @message /\"name\":\"[Uu]ser\-[Aa]gent\",\"value\":\"(?UserAgent[^\"]*)\"/ | filter httpRequest.httpMethod ="POST" | display Rule, action, Country, ClientIP, Method, URI, Host, UserAgent | sort @timestamp desc
国で絞り込む
特定の国からの発信ではないリクエストを除外するには、次のクエリを実行します。
fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.uri as URI | parse @message /\"name\":\"[Hh]ost\",\"value\":\"(?Host[^\"]*)\"/ | parse @message /\"name\":\"[Uu]ser\-[Aa]gent\",\"value\":\"(?UserAgent[^\"]*)\"/ | filter Country != "US" | sort Country, action desc
注: **US ** は、除外する国コードに置き換えてください。
レートベースのルールでブロックされたリクエストをフィルター処理する
レートベースのルールによってブロックされたリクエストをフィルター処理するには、次のクエリを実行します。
fields @timestamp, httpRequest.clientIp as ClientIP, httpRequest.uri as URI, terminatingRuleId as rule, httpRequest.country as Country | filter action = "BLOCK" | filter terminatingRuleType = "RATE_BASED" | sort @timestamp desc
クロスサイトスクリプティング (XSS) または SQL インジェクション
カスタムルールまたは AWS マネージドルールグループの終了ルールで XSS または SQL インジェクションの原因となるパターンを特定するには、次のクエリを実行します。クエリは、タイムスタンプ、クライアント IP アドレス、発信元の国、マッチ詳細、リクエスト ID を含むエントリを返します。
fields @timestamp | parse @message ',"terminatingRuleMatchDetails":[*],' as terminatingRuleMatchData | filter (terminatingRuleMatchData like /XSS/ or terminatingRuleMatchData like /SQL/) | display @timestamp, httpRequest.clientIp, httpRequest.country, terminatingRuleMatchData, httpRequest.requestId
ルールグループ内の特定のルールによってカウントされたリクエストをフィルター処理する
ルールグループ内の特定のルールによってカウントされた後に、デフォルトアクションによって終了したリクエストをフィルター処理するには、次のクエリを実行します。
fields @timestamp | filter (@message like 'excludedRules":[{"exclusionType":"EXCLUDED_AS_COUNT","ruleId":"NoUserAgent_HEADER"}]}' and @message like 'terminatingRuleId":"Default_Action"') | parse @message '"ruleId":*}]}' as ruleMatchDetails | display @timestamp, httpRequest.clientIp, httpRequest.country, ruleMatchDetails, httpRequest.requestId
注: ruleId は、お使いのルール ID に置き換えてください。
無効な CAPTCHA が行われたリクエストをフィルター処理する
無効な CAPTCHA が行われた上位 100 件のリクエストをフィルター処理するには、次のクエリを実行します。このクエリは、リクエストが行われた時刻、IP アドレス、リクエスト ID、レスポンスコード、メッセージ全体を返します。
fields @timestamp, httpRequest.clientIp, httpRequest.requestId, captchaResponse.failureReason, @message | filter captchaResponse.failureReason ='TOKEN_MISSING' | sort @timestamp desc | limit 100
注: 100 は、フィルター処理するリクエストの数に置き換えてください。
CloudWatch クエリジェネレータを使用して AWS WAF アクセスログを分析する
生成 AI を使用してアクセスログを分析するには、CloudWatch でクエリジェネレータを実行します。
関連するコンテンツ
- 質問済み 1年前lg...
- 質問済み 4ヶ月前lg...
- 質問済み 2年前lg...
- AWS公式更新しました 6ヶ月前
- AWS公式更新しました 3年前