CloudWatch の AWS WAF ログを分析する方法を教えてください。
AWS WAF ログを Amazon CloudWatch に保存しています。これらのログを分析してフィルター処理しようと考えています。
解決方法
CloudWatch で特定のログリクエストを分析およびフィルター処理するには、CloudWatch Logs Insights または CloudWatch クエリジェネレーターを使用します。
CloudWatch Logs Insights を使用して AWS WAF アクセスログを分析する
CloudWatch Log Insights は、CloudWatch コンソール内または AWS WAF の [Log Insights] タブで使用できます。
AWS WAF から
次の手順を実行します。
- AWS WAF コンソールを開きます。
- ナビゲーションペインで [AWS WAF] を選択してから、[ウェブ ACL] を選択します。
- [リージョン] で、ウェブアクセスコントロールリスト (ウェブ ACL) を含む AWS リージョンを選択します。
注: ウェブ ACL が Amazon CloudFront 用に設定されている場合は、[グローバル] を選択します。 - ウェブ ACL を選択します。
- ナビゲーションペインで、[Log Insights] を選択します。
- クエリするロググループを選択します。
- クエリエディターで、クエリを入力します。クエリ構文を使用してクエリを設計します。[よく使用するクエリ] リストからクエリを選択することもできます。
- [クエリを実行] を選択します。
- 結果を表示するには、ナビゲーションペインで [ログ] を選択します。
CloudWatch から
次の手順を実行します。
- CloudWatch コンソールを開きます。
- ナビゲーションペインで [ログ] を選択してから、[Log Insights] を選択します。
- [ロググループの選択] で、クエリするロググループをドロップダウンリストから 1 つ以上選択します。または、[ロググループを参照] を選択し、クエリを選択します。
- (オプション) クエリする期間の時間範囲を選択します。
- クエリ構文を使用してクエリを設計します。
- 結果を表示するには、[クエリの実行] を選択します。
以下のサンプルクエリを使用すると、CloudWatch Logs Insights から特定の情報を除外できます。
上位クライアント 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":\"(?[^"}]*)/ |stats count(*) as RequestCount by Host | sort RequestCount desc
上位のメソッド
ログにアクセスする上位のメソッドをカウントするには、次のクエリを実行します。
stats count(*)as RequestCount by httpRequest.httpMethod as Method | sort RequestCount desc
上位のユーザーエージェント
ログにアクセスした上位のユーザーエージェントをカウントするには、次のクエリを実行します。
parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?[^"}]*)/ | stats count(*) as RequestCount by UserAgent | sort RequestCount desc
上位の終了ルール
ログ内の上位の終了ルールをカウントするには、次のクエリを実行します。
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":\"(?[^"}]*)/ | 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":\"(?[^"}])/ | parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?[^"}])/ | filter @message like "{jndi:ldap" | sort action, URI desc
注: {jndi:ldap. は、目的の文字列で置き換えてください。
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":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?[^"}]*)/ | parse @message /\{"name":"[Hh]ost\",\"value":\"(?[^"}]*)/ | filter httpRequest.httpMethod ="POST" | display Rule, action, Country, ClientIP, Method, URI, Host, UserAgent | sort Rule, action desc
国で絞り込む
特定の国からの発信ではないリクエストを除外するには、次のクエリを実行します。
fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.uri as URI | parse @message /\{"name":"[Hh]ost\",\"value":\"(?[^"}]*)/ | parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?[^"}]*)/ | 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 のクエリジェネレータを実行します。
関連するコンテンツ
- 質問済み 2年前lg...
- 質問済み 2ヶ月前lg...
- 質問済み 8ヶ月前lg...
- 質問済み 1年前lg...
- AWS公式更新しました 3年前