AWS re:Postを使用することにより、以下に同意したことになります AWS re:Post 利用規約

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

所要時間3分
0

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 からの操作

次の手順を実行します。

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

CloudWatch から

次の手順を実行します。

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

特定の情報をフィルター処理するには、次のサンプルクエリを使用します。

上位クライアント 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 でクエリジェネレータを実行します。

AWS公式
AWS公式更新しました 3ヶ月前
コメントはありません