はじめに
AWS WAFを導入し、とりあえずカウントモードで運用を始めてみたものの、ログを確認しても何が記載されているのか分からず困ったことはありませんか?
ログには多くの情報が詰まっていますが、何の手がかりもなく見るのは量が多く大変です。
本記事では、AWS WAFのログをS3バケットなどに出力している方を対象に、ログの中身を読み解くための基本を解説します。
ログの出力設定やWAF自体の導入手順については省略しますのでご了承ください。
ログファイルの中身
AWS WAFのログには、リクエストごとの詳細な情報がJSON形式で記録されています。
大まかな構成は以下の通りです:
冒頭から ruleGroupList
まで
リクエストの最終的な判定結果(ALLOW
、BLOCK
、COUNT
)や対象リソース、タイムスタンプなどが記載されています。
ruleGroupList
現在適用されている個別ルールセットごとの判定結果が記録されています。
そのルールセットのうちどの特定のルールがヒットしたかどうかを確認する際に役立ちます。
httpRequest
クライアントのIP情報、リクエストURI、HTTPヘッダーなど、リクエストの詳細情報が含まれています。
-
clientIp
: リクエスト元のIPアドレス -
-
CloudFront-Is-xx-Viewer
: リクエスト元のデバイスタイプ
-
-
headers
: HTTPリクエストヘッダー情報
labels
ルールの一致詳細や原因に関するラベルが記載されています。
カスタムルールやマネージドルールがトリガーされた際の理由を把握するために活用できます。
どこにどの情報があるか
AWS WAFのログを効率的に読み解くためには、特定の情報がどこに記録されているかを理解することが重要です。
以下、主なフィールドについて解説します。
1. 判定結果の確認
-
フィールド:
action
-
内容: WAFが最終的に下した判定(
ALLOW
、BLOCK
、COUNT
) -
利用例: ブロックされたリクエストだけを確認したい場合、
action: "BLOCK"
を条件にフィルタリングする
2. リクエストの送信元
-
フィールド:
httpRequest.clientIp
およびhttpRequest.country
- 内容: リクエスト元のIPアドレスとその地理的な発信元国
- 利用例: 不審なIPアドレスや予期しない国からのアクセスを特定する
3. マッチしたルールの詳細
-
フィールド:
ruleGroupList
- 内容: 適用されたルールセットごとに、どのルールが一致したかの情報
- 利用例: 特定のルールが過剰にトリガーされていないかを確認する
4. トリガー理由の詳細
-
フィールド:
labels
- 内容: ルール一致の詳細な理由が記載されています。
- 利用例: どの条件がルールをトリガーしたのかを深掘りする際に使用します
どういった時にどこの情報を見るか
ここでは、ユースケース別に「どの情報を確認すべきか」を具体的に解説します。
1. 不正アクセスが疑われる場合
-
確認箇所:
httpRequest.clientIp
、httpRequest.country
、httpRequest.headers
-
目的:
- 不審なIPアドレスや、地理的にあり得ない地域からのアクセスを発見
- 攻撃パターン(特定の
User-Agent
やURI
)を特定
2. 過剰ブロックが発生している場合
-
確認箇所:
action
、ruleGroupList
-
目的:
- ブロックされたリクエストを調べ、過剰に厳しいルールが適用されていないかを確認
-
labels
で詳細なトリガー理由を把握し、条件を調整
3. レート制限のトリガー確認
-
確認箇所:
rateBasedRuleList
-
目的:
- レート制限にヒットしたリクエストを特定。
- トリガーしたIPアドレスやリクエストパターンを分析し、適切な制限値を設定
終わりに
AWS WAFのログには、セキュリティの強化やアクセスパターンの可視化に役立つ多くの情報が記録されています。
本記事では、ログの基本的な読み方や、状況に応じた確認ポイントを紹介しました。
次のステップとして、一定期間のログの情報や特定のルールやラベルに一致している情報などを、Amazon Athenaなどを使って分析することも良いかと思います。
AWS WAFのログの情報を有効活用していきましょう!