CloudWatch の AWS WAF ログを分析する方法を教えてください。
Amazon CloudWatch に保存している AWS WAF ログを分析したり、絞り込んだりしようとしています。
解決策
CloudWatch で特定の AWS WAF ログリクエストを分析したりフィルター処理したりするには、CloudWatch Logs Insights または CloudWatch クエリジェネレーターを使用します。
CloudWatch Log Insights
CloudWatch Log Insights は、CloudWatch コンソールまたは AWS WAF 内の [Log Insights] で使用できます。
AWS WAF
次の手順を実行します。
- AWS WAF コンソールを開きます。
- ナビゲーションペインで [AWS WAF] を選択します。
- [リソースと保護パック] を選択します。
- 目的の [保護パック] を選択します。
- [ダッシュボードを表示] を選択します。
- ページの下部にある [ログエクスプローラー] を開きます。
- [CloudWatch で表示] を選択します。
- [クエリエディタ] で、クエリを入力します。クエリ構文を使用してクエリを設計します。[よく使用するクエリ] リストからクエリを選択することもできます。
- [クエリを実行] を選択します。
CloudWatch
次の手順を実行します。
- CloudWatch コンソールを開きます。
- ナビゲーションペインで [ログ] を選択します。
- [Log Insights] を選択します。
- Log Insights でドロップダウン [選択基準] を開き、
- クエリするロググループを 1 つ以上選択します。または、[ロググループを参照] を選択し、目的のロググループを選択します。
- (オプション) クエリの時間範囲を選択します。
- クエリ構文を使用してクエリを設計します。
- 結果を確認するには、[クエリの実行] を選択します。
CloudWatch クエリジェネレーター
生成 AI を使用してアクセスログを分析するには、CloudWatch でクエリジェネレータを実行します。
データを検索するクエリの例
次のクエリ例を使用すると、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 インジェクションを引き起こしているパターンを特定するには、次のクエリを実行します。
fields @timestamp| parse @message ',"terminatingRuleMatchDetails":[*],' as terminatingRuleMatchData | filter (terminatingRuleMatchData like /XSS/ or terminatingRuleMatchData like /SQL/) | display @timestamp, httpRequest.clientIp, httpRequest.country, terminatingRuleMatchData, httpRequest.requestId
このクエリは、タイムスタンプ、クライアントの IP アドレス、発信元の国、一致の詳細、リクエスト ID を含むエントリを表示します。
ルールグループ内の特定のルールがカウントされたリクエストで絞り込む
ログエントリを、ルールグループ内の特定のルールがデフォルトでカウントしたり終了させたりしたリクエストで絞り込むには、次のクエリを実行します。
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 件のリクエストを絞り込むには、次のクエリを実行します。
fields @timestamp, httpRequest.clientIp, httpRequest.requestId, captchaResponse.failureReason, @message| filter captchaResponse.failureReason ='TOKEN_MISSING' | sort @timestamp desc | limit 100
注: limit 句の 100 を、フィルターするリクエストの件数に置き換えます。
このクエリは、リクエストの発生時間、IP アドレス、リクエスト ID、応答コード、およびメッセージ全体を表示します。
関連するコンテンツ
- 質問済み 4ヶ月前
- 質問済み 9ヶ月前
