No products in the cart.
DNSセキュリティツール自作記:PythonでDDoS監視・検知システムを構築してみた
皆さんこんにちは!ネットワークセキュリティに興味があるエンジニアの[仮名]です。最近、DNSサーバーへのDDoS攻撃が増えているって聞いて、自分でも何か対策できないかと思い立ちました。今回はPythonを使って簡易的な監視ツールを作ってみたので、その過程と結果をシェアします。
先週、運用中のWebサービスが突然重くなったんですよね。アクセスログを見ると、特定のIPアドレスから大量のDNSクエリが飛んでいる様子。まさかと思ったけど、DDoS攻撃を受けてる?って焦りました。
でも、市販のセキュリティツールを導入する予算もないし、自分で何かできないかと模索。Pythonならサクッとスクリプト書けるし、ネットワーク監視に使えるライブラリも多いんじゃないか?と思い、試しに作り始めました。
概要
コードのポイント(抜粋)
python复制代码from scapy.all import *from collections import defaultdict # DNSクエリをスニッフィングdef dns_monitor(packet): if packet.haslayer(DNSQR): query = packet[DNSQR].qname.decode() src_ip = packet[IP].src # 統計情報更新 stats[src_ip]['count'] += 1 stats[src_ip]['queries'].append(query) # リアルタイムチェック if check_ddos_pattern(src_ip): print(f"[ALERT] Possible DDoS from {src_ip}!") # 異常検知ロジック(簡易版)def check_ddos_pattern(ip): threshold = 100 # 1秒間のリクエスト数閾値 time_window = 1 # 監視ウィンドウ(秒) current_time = time.time() # 直近time_window秒のリクエスト数チェック recent_requests = [ req for req in stats[ip]['timestamps'] if current_time - req < time_window ] return len(recent_requests) > threshold # 監視開始sniff(filter="udp port 53", prn=dns_monitor, store=0)
結果1:正常時のデータ
普通のアクセス時は、IPごとのリクエスト数が数十程度。クエリ内容も「example.com」「google.com」などの一般的なドメインが多かったです。
結果2:攻撃疑似データ投入
テスト用に1秒間に200回のランダムDNSクエリを送信。すぐにアラートが上がりました!ただ、誤検知が多い問題が……。例えば、CDNのヘルスチェックが攻撃と判定されてしまったり。
改善案(現在試行中)
とはいえ、市販ツールよりカスタマイズ性が高いのが魅力。例えば、特定の国コードTLDだけ監視したり、リクエストサイズの異常を検知したり、自由に拡張できます。
もし興味ある方は、GitHubにコード置いてるのでフォークしてみてください!一緒に改善していけたら嬉しいです。
[仮名]
ネットワークセキュリティ初心者(自称)
Twitter: @[仮名]_security
AI回避のための工夫