AWS WAFログの有効化とログ解析の基本をわかりやすく解説
生徒
「先生、AWS WAFって攻撃をブロックする仕組みはわかるんですが、その結果を確認する方法ってあるんですか?」
先生
「いい質問ですね。AWS WAF(ウェブ アプリケーション ファイアウォール)はログを有効化することで、どんなリクエストがブロックされたのか、どんなルールに一致したのかを記録できます。ログ解析を行えば、攻撃の傾向を把握して次の対策に活かせますよ。」
生徒
「なるほど!ログを取らないと、実際にどんな攻撃が来ているのか見えないんですね。」
先生
「その通りです。それでは、AWS WAFのログの有効化と基本的な解析の流れを見ていきましょう。」
1. AWS WAFログとは?役割と記録される内容
AWS WAFログ(読み方:エーダブリューエス ワフ ログ)とは、Webサイトやアプリへのアクセス(リクエスト)に対して、WAFが「通したのか」「ブロックしたのか」という判断の結果を記録した活動日記のようなものです。
セキュリティ対策において、ログは「誰が、いつ、どこから、何をしたか」を証明する重要な証跡となります。AWS WAFログを有効にすると、以下のようなJSON形式(データを記述するための形式)でリクエストの詳細が出力されます。プログラミング未経験の方でも、項目の意味を知るだけで攻撃の予兆を察知できるようになります。
ログデータのサンプルイメージ(JSON形式)
{
"timestamp": 1706751600000,
"action": "BLOCK",
"terminatingRuleId": "AWS-AWSManagedRulesCommonRuleSet",
"httpRequest": {
"clientIp": "192.0.2.1",
"uri": "/admin/login",
"args": "id=1' OR '1'='1",
"httpMethod": "POST",
"userAgent": "Mozilla/5.0 (Evil-Bot/1.0)"
}
}
このサンプルを詳しく見てみましょう。たとえば"action": "BLOCK"はWAFが攻撃を防いだことを示し、"clientIp"は攻撃者の住所にあたるIPアドレス、"args"には不正なプログラムを送り込もうとした形跡が見て取れます。
ログを確認することで、「特定の国からの攻撃が増えている」「特定のログインページが狙われている」といった具体的な被害状況を可視化し、より強固な防御設定へと改善することが可能になります。
2. ログを有効化する方法
AWS WAFのログはデフォルトでは保存されません。手動で有効化する必要があります。手順の流れは次の通りです。
- AWSマネジメントコンソールにログイン
- WAFのWeb ACL(ウェブ アクセス コントロール リスト)を選択
- 「Logging and metrics(ログとメトリクス)」を開く
- ログの保存先を設定(通常はAmazon Kinesis Data Firehoseを使用)
- 保存先としてS3(エススリー、ストレージサービス)やCloudWatch Logs(クラウドウォッチ ログス)を指定
- 設定を保存して有効化
これで、WAFが処理したリクエストごとの詳細なログがS3やCloudWatchに保存されます。
3. ログに含まれる情報
ログには多くの情報が記録されますが、初心者がまず注目すべきは以下の項目です。
- timestamp(タイムスタンプ):いつアクセスがあったか
- action(アクション):ブロック、許可、カウントのどれか
- ruleId(ルールID):どのルールに一致したか
- sourceIP(送信元IP):リクエスト元のIPアドレス
- uri(ユーリアールアイ):どのページにアクセスしようとしたか
これらを分析すれば、特定のIPから不自然に大量アクセスがあるのか、特定の攻撃パターンが頻発しているのかがわかります。
4. ログ解析の基本
ログ解析の目的は、攻撃の傾向を見抜き、防御ルールを最適化することです。例えば、以下のような視点で分析します。
- どのIPアドレスから攻撃が多いか
- どのルールが頻繁にトリガーされているか
- 正規のユーザーが誤ってブロックされていないか
これらをチェックすることで、ブラックリストやホワイトリストを見直したり、カスタムルールの条件を調整する判断ができます。
5. 代表的なログの保存先
AWS WAFログは以下のようなサービスと組み合わせて使います。
- Amazon S3:読み方はエススリー。ログを長期保存するのに便利
- Amazon CloudWatch Logs:リアルタイム監視やアラート通知に使える
- Kinesis Data Firehose:ログをS3やElasticsearchなどにストリーム配信できる
初心者はまずS3に保存して手動で確認する方法から始め、その後CloudWatchやダッシュボードによる可視化に挑戦すると理解が深まります。
6. 初心者向けの運用のコツ
いきなりすべてのログを詳細に解析する必要はありません。最初は「ブロックされた件数」と「特定のIPの動き」に注目するだけで十分です。
例えば、毎日のログをチェックして「特定のIPから何千回もアクセスがあった」「同じルールが毎日トリガーされている」といった特徴を見つけましょう。その情報をもとに新しいルールを作成したり、不要なアクセスを遮断する対策につなげることができます。
まとめ
AWS WAF(ウェブ・アプリケーション・ファイアウォール)の運用において、ログの有効化と解析は、単なる記録以上の意味を持ちます。それは、デジタル空間における自社サイトの「防衛白書」を作成する作業に似ています。本記事を通じて、WAFがどのようにリクエストを裁き、その結果がどのようにデータとして蓄積されるのか、その一連の流れをご理解いただけたかと思います。
ログ管理の重要性とセキュリティ向上のサイクル
セキュリティ対策において最も避けなければならないのは、「何が起きているか分からない」という不透明な状態です。AWS WAFのログをAmazon S3やCloudWatch Logsに集約することで、攻撃者の意図や手法が可視化されます。 例えば、特定の脆弱性を狙ったSQLインジェクション攻撃が急増している場合、ログを確認すれば、どのURIに対して、どのようなペイロード(攻撃コード)が送られているかを具体的に特定できます。これにより、単に「ブロックして終わり」ではなく、アプリケーション側のコード修正や、WAFのカスタムルールによるピンポイントな遮断といった、より高度な二次対策が可能になります。
実践!PythonによるWAFログ解析の自動化サンプル
S3に蓄積されたJSON形式のWAFログは、手動で一つずつ確認するには膨大な量になります。実務では、Pythonなどのプログラミング言語を用いて、特定の条件(例えばActionがBLOCKのものだけ)を抽出するスクリプトを作成するのが一般的です。 以下に、AWS SDKであるBoto3を想定した、ログ抽出のイメージコードを紹介します。
import json
# WAFのログ(S3からダウンロードしたJSON想定)を解析する関数
def analyze_waf_logs(log_file_path):
with open(log_file_path, 'r') as f:
for line in f:
# WAFログは1行1JSON形式が多い
log_data = json.loads(line)
# ブロックされた通信のみを抽出して表示
if log_data.get('action') == 'BLOCK':
timestamp = log_data.get('timestamp')
source_ip = log_data.get('httpRequest').get('clientIp')
uri = log_data.get('httpRequest').get('uri')
rule_id = log_data.get('terminatingRuleId')
print(f"【警告】ブロック検知: 日時:{timestamp}, IP:{source_ip}, URI:{uri}, ルール:{rule_id}")
# 実行例
# analyze_waf_logs('waf_access_log.json')
コマンドラインでのログ確認方法
AWS CLIを使用して、現在のWAF Web ACLの設定状況を確認したり、ログ設定が正しく反映されているかを確認するコマンドも覚えておくと便利です。
aws wafv2 get-logging-configuration --resource-arn arn:aws:wafv2:ap-northeast-1:123456789012:regional/webacl/MyWebACL/a1b2c3d4
{
"LoggingConfiguration": {
"ResourceArn": "arn:aws:wafv2:ap-northeast-1:123456789012:regional/webacl/MyWebACL/a1b2c3d4",
"LogDestinationConfigs": [
"arn:aws:kinesis:ap-northeast-1:123456789012:deliverystream/aws-waf-logs-stream"
]
}
}
運用のステップアップ:可視化ツールの活用
ログを溜める仕組みができたら、次は「可視化」に挑戦しましょう。Amazon Athena(アテナ)を使えば、S3上のログに対して標準的なSQLを使ってクエリを投げることができます。 例えば、「直近24時間で最もブロックされたIPアドレスのトップ10」を出すSQLは以下のようになります。
SELECT
httprequest.clientip,
count(*) as count
FROM
waf_logs
WHERE
action = 'BLOCK'
GROUP BY
httprequest.clientip
ORDER BY
count DESC
LIMIT 10;
このように、ログをデータとして扱うことで、場当たり的な対応から、データに基づいた戦略的なセキュリティ運用へと昇華させることができます。AWS WAFの導入はゴールではなく、ログを基にした継続的な改善のスタートラインなのです。 インフラエンジニアやWeb開発者にとって、この「ログを読む力」は、サイバー攻撃からシステムを守り抜くための最強の武器となるでしょう。
生徒
「先生、まとめを読んでログの大切さが身に沁みました。単に守るだけじゃなくて、中身を分析して次に繋げるのがプロの仕事なんですね。」
先生
「その通り!攻撃者の動きをログで追うのは、まるで名探偵が足跡を辿るようなものです。Pythonのサンプルコードを見てもらいましたが、自動化すれば日々のチェックも楽になりますよ。」
生徒
「AthenaでSQLを使って解析するっていうのも、凄く効率が良さそうです。でも、ログが大量になると料金も気になります…。」
先生
「鋭いですね。全てのログを保存するとコストが嵩むので、重要なログだけをサンプリングしたり、保持期間を決めたりするのが運用のコツです。S3のライフサイクルポリシーを活用して、古いログは自動で削除するか、安価なストレージクラスに移動させるように設定しましょう。」
生徒
「なるほど。コストとセキュリティのバランスを取りながら運用していくのが大事なんですね。まずは自分の環境でログを出すところからやってみます!」
先生
「その意気です。実際にBLOCKログの中に自分の知っているIPがあったりすると、一気に実感が湧きますよ。頑張ってくださいね。」