スキップしてコンテンツを表示

CloudWatch の AWS WAF ログを分析する方法を教えてください。

所要時間3分
0

Amazon CloudWatch に保存している AWS WAF ログを分析したり、絞り込んだりしようとしています。

解決策

CloudWatch で特定の AWS WAF ログリクエストを分析したりフィルター処理したりするには、CloudWatch Logs Insights または CloudWatch クエリジェネレーターを使用します。

CloudWatch Log Insights

CloudWatch Log Insights は、CloudWatch コンソールまたは AWS WAF 内の [Log Insights] で使用できます。

AWS WAF

次の手順を実行します。

  1. AWS WAF コンソールを開きます。
  2. ナビゲーションペインで [AWS WAF] を選択します。
  3. [リソースと保護パック] を選択します。
  4. 目的の [保護パック] を選択します。
  5. [ダッシュボードを表示] を選択します。
  6. ページの下部にある [ログエクスプローラー] を開きます。
  7. [CloudWatch で表示] を選択します。
  8. [クエリエディタ] で、クエリを入力します。クエリ構文を使用してクエリを設計します。[よく使用するクエリ] リストからクエリを選択することもできます。
  9. [クエリを実行] を選択します。

CloudWatch

次の手順を実行します。

  1. CloudWatch コンソールを開きます。
  2. ナビゲーションペインで [ログ] を選択します。
  3. [Log Insights] を選択します。
  4. Log Insights でドロップダウン [選択基準] を開き、
  5. クエリするロググループを 1 つ以上選択します。または、[ロググループを参照] を選択し、目的のロググループを選択します。
  6. (オプション) クエリの時間範囲を選択します。
  7. クエリ構文を使用してクエリを設計します。
  8. 結果を確認するには、[クエリの実行] を選択します。

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、応答コード、およびメッセージ全体を表示します。

コメントはありません