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

所要時間3分
0

AWS WAF ログを Amazon CloudWatch に保存しています。これらのログを分析してフィルター処理しようと考えています。

解決方法

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

CloudWatch Logs Insights を使用して AWS WAF アクセスログを分析する

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

AWS WAF から

次の手順を実行します。

  1. AWS WAF コンソールを開きます。
  2. ナビゲーションペインで [AWS WAF] を選択してから、[ウェブ ACL] を選択します。
  3. [リージョン] で、ウェブアクセスコントロールリスト (ウェブ ACL) を含む AWS リージョンを選択します。
    注: ウェブ ACL が Amazon CloudFront 用に設定されている場合は、[グローバル] を選択します。
  4. ウェブ ACL を選択します。
  5. ナビゲーションペインで、[Log Insights] を選択します。
  6. クエリするロググループを選択します。
  7. クエリエディターで、クエリを入力します。クエリ構文を使用してクエリを設計します。[よく使用するクエリ] リストからクエリを選択することもできます。
  8. [クエリを実行] を選択します。
  9. 結果を表示するには、ナビゲーションペインで [ログ] を選択します。

CloudWatch から

次の手順を実行します。

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

以下のサンプルクエリを使用すると、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 のクエリジェネレータを実行します。

コメントはありません

関連するコンテンツ