こんにちは!インフラやセキュリティの世界へようこそ。
初めてサーバーのログを見たり、「WAF(ワフ)」なんて聞き慣れない言葉を聞いたりすると、「なんだか難しそう……」「自分に扱えるかな……」と不安になりますよね。でも、安心してください。セキュリティの基本は、私たちの日常生活にある「防犯」の仕組みと全く同じなんです。
今回は、AWSなどのクラウド環境でよく使われる「WAF(Web Application Firewall)」のログを読み解いて、悪さをする泥棒を自動で追い出すカッコいい仕組み(ワークフロー)を、一緒に一歩ずつ紐解いていきましょう!
—
1. 例え話でスッキリ理解!「家の鍵」と「WAFのログ分析」
まずは、私たちが普段暮らしている「お家」を想像してみてください。
頑丈な玄関ドア(=ファイアウォール)をつけておけば、大体の不審者は防げますよね。でも、泥棒の中には、郵便受けから手を入れて鍵を開けようとしたり、窓ガラスをこっそり割ろうとしたりする知恵者がいます。
インターネットの世界でも同じです。表向きは普通のホームページのフリをしてアクセスしつつ、裏では「サーバーの合鍵」を探そうと、悪意あるリクエスト(攻撃コード)を送りつけてくる輩が後を絶ちません。
ここで活躍するのが、家の中の廊下に仕掛けた「防犯カメラ」であり、リビングの「センサーライト」です。これが、クラウドの世界における WAF(Web Application Firewall) になります。
WAFは、ただの門番ではなく、「怪しい動きをする訪問客のセリフや行動」をじっと観察して記録(ログ)に残してくれる優秀な番犬です。
- 「あれ、この人、さっきから窓の隙間をバールでこじ開けようとしてるぞ!」
- 「同じ顔(IPアドレス)の人が、何度も何度も怪しい合鍵を試しているぞ!」
こうした防犯カメラの映像(=WAFログ)をチェックして、「この顔の人は出入り禁止!」とリスト(ブロックリスト)を更新し、二度と敷居を跨げないようにする。これが今回お話しする「WAFのログ分析と自動ブロックの仕組み」なんです。
—
2. 攻撃者はどうやって侵入を試みるの?(メカニズムとヘッダーのキホン)
では、実社会の泥棒はどんな手口を使うのでしょうか?そして、私たちはどこを見れば彼らを特定できるのでしょうか?
Webの世界では、攻撃者はブラウザ(ChromeやSafariなど)のふりをして、次のような危険な呪文(攻撃コード)をURLや入力フォームに混ぜて送ってきます。
一番有名なのが、ホームページの裏側のデータベースを乗っ取る SQLインジェクション や、画面に変なプログラムを表示させる XSS(クロスサイトスクリプティング) と呼ばれる手口です。例えば、検索窓に 1' OR '1'='1 のような文字列をこっそり忍ばせます。
ここで、WAFのログ(防犯カメラの記録)には、次のような大切な情報が残ります。
1. クライアントIPアドレス: 訪問者がどこからやってきたのか(例: 203.0.113.50)
2. User-Agent(ユーザーエージェント): 訪問者がどんな「乗り物(ブラウザやツール)」に乗ってきたのか
3. リクエストURI: 家のどの部屋(どのページ)を覗き見ようとしたのか
特に User-Agent に注目してください。通常の人間なら Mozilla/5.0 (Windows NT 10.0; Win64; x64)... のような綺麗な名前が書かれていますが、攻撃用ロボット(ボット)の場合、ここが不自然に空っぽだったり、怪しい攻撃ツールの名前(例: sqlmap など)が堂々と書かれていたりします。
「おや、この乗り物、どう見ても怪しい泥棒専用の車だな」と気づくのが、ログ分析の第一歩です。
—
3. 泥棒を自動で追い出す!CloudWatchとLambdaで作る防衛網
手動で毎日ログを眺めて「あ、こいつ怪しいからブロックしよう」とポチポチ設定するのは、正直言って人間には大変すぎますよね。私たちエンジニアは怠け者(=効率化の天才)であるべきです!
そこで、「怪しいログが見つかったら、自動的に防犯センサーが働いて、自動でブロックリストを更新してくれる仕組み」を作ってみましょう。
全体像としては、次のような流れになります。
1. WAFが攻撃を検知する
2. ログがCloudWatch LogsやS3にたまにいく
3. Amazon EventBridge(またはLambda)がそれを検知して分析する
4. 「このIPは危険だ!」と判断したら、自動でWAFのIPset(ブロックリスト)に追加する
言葉だけだと難しそうですが、実際に動かすための「心臓部」となるコード(AWS Lambdaで動かすPythonスクリプト)のサンプルを見てみましょう。実務でそのまま参考にできるよう、日本語のコメントをたっぷり添えておきますね。
import json
import boto3
# AWS WAFのクライアントを初期化します(東京リージョンなどの設定に合わせて変更してください)
wafv2 = boto3.client('wafv2', region_name='ap-northeast-1')
# あらかじめ作成しておいたブロックリスト(IP Set)の情報
# ※実際には環境変数などからIDやARNを取得するように設計します
IP_SET_ID = 'あなたのIPセットのID'
IP_SET_NAME = 'MyBlockedIPs'
SCOPE = 'REGIONAL' # CloudFrontの場合は 'CLOUDFRONT' にします
def lambda_handler(event, context):
"""
WAFのログやCloudWatchからの通知を受け取り、
攻撃者のIPアドレスを自動的にブロックリストに追加する関数です。
"""
# 1. ログイベントから攻撃者のIPアドレスを抽出する(ここではサンプルとして固定値を想定)
# ※実際の現場では event の中身(CloudWatch Logs等からのデータ)をパースします。
suspicious_ip = "203.0.113.50" # 例として怪しいIPアドレス
print(f"検知された怪しいIPアドレス: {suspicious_ip} をブロックリストに追加します。")
try:
# 2. 現在のIPセット(ブロックリスト)の情報を取得する(LockTokenを取得するため)
response = wafv2.get_ip_set(
Name=IP_SET_NAME,
Scope=SCOPE,
Id=IP_SET_ID
)
lock_token = response['LockToken']
current_addresses = response['IPSet']['Addresses']
# すでにブロックリストに入っていなければ追加リストに含める
formatted_ip = f"{suspicious_ip}/32"
if formatted_ip not in current_addresses:
current_addresses.append(formatted_ip)
# 3. WAFのIPセットを更新してブロックを適用する
wafv2.update_ip_set(
Name=IP_SET_NAME,
Scope=SCOPE,
Id=IP_SET_ID,
Addresses=current_addresses,
LockToken=lock_token
)
print(f"成功: {formatted_ip} をブロックリストに追加しました。")
else:
print(f"情報: {formatted_ip} はすでにブロックリストに登録されています。")
except Exception as e:
print(f"エラーが発生しました: {str(e)}")
raise e
return {
'statusCode': 200,
'body': json.dumps('WAF automation process completed successfully.')
}
このスクリプトは、「怪しいIPアドレスを見つけて、WAFの通行止めリスト(IP Set)に /32(そのIP単体という意味です)の形式でサクッと追加する」という処理を自動で行ってくれます。
—
4. 運用時の注意点と、セキュリティ担当者のリアルな知見
さて、ここで現場のエンジニアとして、ちょっとした「泥臭い現実」もお伝えしておかなければいけません。
自動ブロックの仕組みは非常に強力ですが、「誤検知(False Positive)」には十分気をつけてください。
どういうことかと言うと、例えば社内の優秀なプログラマーや、大切な取引先のお客さんが、うっかりテストで変な文字列を入力してしまったとします。それをWAFが「お、泥棒だ!」と勘違いして自動ブロックしてしまうと、「大切なパートナー企業が自社サイトに入れなくなって大クレームに発展する」という、セキュリティ事故とは別の意味で冷や汗をかく事態が起きるのです。
これを防ぐための実務上のポイントは以下の通りです。
1. 最初は「アラートモード」から始める
最初から完全に「ブロック」するのではなく、まずは怪しい動きを検知したらSlackやメールに通知が飛ぶ「カウント(監査)モード」で運用し、本当に攻撃者かどうかを目視で確認する期間を作りましょう。
2. ホワイトリスト(例外リスト)を必ず用意する
社内のグローバルIPアドレスや、信頼できる特定のパートナー企業のIPは、絶対に自動ブロックされないような「VIP専用通路(ホワイトリスト)」をあらかじめ用意しておくことが、現場の平穏を守るコツです。
—
まとめ:一歩ずつ、強固なインフラを作っていこう
今回は、WAFのログ分析から攻撃シグネチャ(特徴)を特定し、自動でブロックルールへ反映させるワークフローについて解説しました。
最初は難しく感じたかもしれませんが、要するに「防犯カメラの映像を見て、怪しい奴の顔をメモし、自動で自動ドアの通行止めリストを更新する」というお話です。
セキュリティの対策に「これで完璧」というゴールはありません。攻撃者も日々あの手この手を変えてやってきます。でも、今回ご紹介したような自動化の仕組みを少しずつ取り入れていくことで、あなたの管理するシステムは確実に、そして泥臭く強くなっていきます。
焦らず、一歩ずつ、安全で快適なクラウドの世界を作っていきましょう!それではまた次の記事でお会いしましょう。
コメント