「サーバーが急に重くなって、アクセスできなくなった…」これがDDoS攻撃かもしれません。大手企業だけでなく、個人サイトや小規模サービスも標的になる現代では、開発者にとってDDoS攻撃の理解と対策は必須知識です。
この記事では、攻撃の仕組みから実装可能な防御策まで、開発者が知っておくべきDDoS対策の基本をコンパクトにまとめました。
DDoS攻撃の基本知識
DDoS(Distributed Denial of Service)攻撃は、複数のコンピューターから大量のアクセスを送信してサーバーを停止させる攻撃手法です。
攻撃の仕組みと影響
基本的な攻撃フロー:
- ① ボットネット構築
・マルウェアに感染したPC群を遠隔操作
・数千〜数万台のコンピューターを制御 - ② 同時攻撃実行
・一斉に標的サーバーへリクエスト送信
・正常なアクセスと混在して検知困難 - ③ サービス停止
・サーバーリソースの枯渇
・正規ユーザーがアクセス不可に
被害の実際:
- サービス停止による機会損失
- 復旧作業のコスト
- ユーザーの信頼失墜
- ブランドイメージの悪化
主な攻撃パターン3種類
① ボリューム攻撃(Volume Attacks)
帯域幅を飽和させる攻撃:
- UDP Flood: 大量のUDPパケット送信
- ICMP Flood: pingコマンドの大量送信
- DNS Amplification: DNSサーバーを悪用した増幅攻撃
② プロトコル攻撃(Protocol Attacks)
サーバーのリソースを消費させる攻撃:
- SYN Flood: TCP接続の3-way handshakeを悪用
- Ping of Death: 巨大なパケットでシステムクラッシュ
- Smurf Attack: ブロードキャストアドレスを悪用
③ アプリケーション層攻撃(Application Layer Attacks)
Webアプリケーションを標的とした攻撃:
- HTTP Flood: 正常なHTTPリクエストの大量送信
- Slowloris: 意図的に遅いリクエストでコネクション占有
- SQL Query Flood: 重いSQLクエリでDBサーバー負荷
開発者ができる基本防御
コードレベルから実装できる防御策を見ていきましょう。
レート制限の実装
# Flask + Redis でのレート制限実装
from flask import Flask, request, jsonify
import redis
import time
app = Flask(__name__)
redis_client = redis.Redis(host='localhost', port=6379, db=0)
def rate_limit(max_requests=100, window=60):
"""レート制限デコレータ"""
def decorator(f):
def wrapper(*args, **kwargs):
client_ip = request.remote_addr
key = f"rate_limit:{client_ip}"
current_time = int(time.time())
window_start = current_time - window
# 古いエントリを削除
redis_client.zremrangebyscore(key, 0, window_start)
# 現在のリクエスト数をチェック
current_requests = redis_client.zcard(key)
if current_requests >= max_requests:
return jsonify({
"error": "Rate limit exceeded",
"retry_after": window
}), 429
# 新しいリクエストを記録
redis_client.zadd(key, {str(current_time): current_time})
redis_client.expire(key, window)
return f(*args, **kwargs)
return wrapper
return decorator
@app.route('/api/data')
@rate_limit(max_requests=50, window=60) # 1分間に50リクエスト
def get_data():
return jsonify({"data": "protected resource"})ロードバランサー設定
# Nginx でのDDoS対策設定
upstream backend {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
server {
listen 80;
server_name example.com;
# 接続数制限
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
limit_conn conn_limit_per_ip 10;
# リクエスト数制限
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;
limit_req zone=req_limit_per_ip burst=10 nodelay;
# タイムアウト設定
client_body_timeout 5s;
client_header_timeout 5s;
# 異常に大きなリクエストを拒否
client_max_body_size 1M;
large_client_header_buffers 2 1k;
location / {
# 疑わしいUser-Agentをブロック
if ($http_user_agent ~* (bot|crawler|spider)) {
return 403;
}
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# プロキシタイムアウト
proxy_connect_timeout 1s;
proxy_send_timeout 1s;
proxy_read_timeout 1s;
}
# 静的ファイルの直接配信
location /static/ {
alias /var/www/static/;
expires 30d;
}
}監視とアラート
# DDoS検知スクリプト
import psutil
import time
import smtplib
from email.mime.text import MIMEText
class DDoSMonitor:
def __init__(self, threshold_connections=1000, threshold_cpu=80):
self.threshold_connections = threshold_connections
self.threshold_cpu = threshold_cpu
self.alert_sent = False
def check_connections(self):
"""接続数チェック"""
connections = len(psutil.net_connections())
return connections
def check_cpu_usage(self):
"""CPU使用率チェック"""
return psutil.cpu_percent(interval=1)
def check_memory_usage(self):
"""メモリ使用率チェック"""
return psutil.virtual_memory().percent
def send_alert(self, message):
"""アラート送信"""
if self.alert_sent:
return
try:
msg = MIMEText(message)
msg['Subject'] = 'DDoS Attack Alert'
msg['From'] = 'monitor@example.com'
msg['To'] = 'admin@example.com'
server = smtplib.SMTP('localhost')
server.send_message(msg)
server.quit()
self.alert_sent = True
print(f"Alert sent: {message}")
except Exception as e:
print(f"Failed to send alert: {e}")
def monitor(self):
"""監視メインループ"""
while True:
connections = self.check_connections()
cpu_usage = self.check_cpu_usage()
memory_usage = self.check_memory_usage()
print(f"Connections: {connections}, CPU: {cpu_usage}%, Memory: {memory_usage}%")
# 閾値チェック
if connections > self.threshold_connections:
self.send_alert(f"High connection count detected: {connections}")
if cpu_usage > self.threshold_cpu:
self.send_alert(f"High CPU usage detected: {cpu_usage}%")
# 正常状態が続いたらアラートフラグをリセット
if connections < self.threshold_connections * 0.5 and cpu_usage < 50:
self.alert_sent = False
time.sleep(30)
# 監視開始
if __name__ == "__main__":
monitor = DDoSMonitor(threshold_connections=500, threshold_cpu=70)
monitor.monitor()クラウドサービスでの対策
クラウドプロバイダーの DDoS 対策サービスを活用しましょう。
AWS Shield とCloudFlare
# AWS Shield 設定例(CloudFormation)
AWSTemplateFormatVersion: '2010-09-09'
Resources:
# Application Load Balancer
AppLoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Type: application
Scheme: internet-facing
SecurityGroups:
- !Ref ALBSecurityGroup
Subnets:
- !Ref PublicSubnet1
- !Ref PublicSubnet2
# WAF WebACL
WebACL:
Type: AWS::WAFv2::WebACL
Properties:
Name: DDoSProtectionWebACL
Scope: REGIONAL
DefaultAction:
Allow: {}
Rules:
# Rate limiting rule
- Name: RateLimitRule
Priority: 1
Statement:
RateBasedStatement:
Limit: 2000
AggregateKeyType: IP
Action:
Block: {}
VisibilityConfig:
SampledRequestsEnabled: true
CloudWatchMetricsEnabled: true
MetricName: RateLimitRule
# IP whitelist rule
- Name: IPWhitelistRule
Priority: 2
Statement:
IPSetReferenceStatement:
Arn: !GetAtt TrustedIPSet.Arn
Action:
Allow: {}
VisibilityConfig:
SampledRequestsEnabled: true
CloudWatchMetricsEnabled: true
MetricName: IPWhitelistRule
# CloudWatch アラーム
DDoSAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: DDoSAttackDetected
AlarmDescription: Detects potential DDoS attack
MetricName: DDoSDetected
Namespace: AWS/DDoSProtection
Statistic: Sum
Period: 300
EvaluationPeriods: 1
Threshold: 1
ComparisonOperator: GreaterThanOrEqualToThreshold
AlarmActions:
- !Ref SNSTopic費用対効果の高い設定
基本対策(低コスト):
- CloudFlare Free プラン(基本的なDDoS保護)
- AWS Shield Standard(無料・自動有効)
- レート制限の実装(開発コストのみ)
高度な対策(中〜高コスト):
- AWS Shield Advanced($3,000/月)
- CloudFlare Pro以上($20/月〜)
- 専用DDoS対策アプライアンス
// CloudFlare設定例(Terraform)
resource "cloudflare_zone_settings_override" "example" {
zone_id = var.zone_id
settings {
# DDoS保護を最大に
security_level = "high"
# Bot管理
bot_management = {
enable_js = true
}
# レート制限
rate_limiting = {
enable = true
}
# キャッシュ設定で負荷軽減
cache_level = "aggressive"
browser_cache_ttl = 31536000
}
}
# Page Rules for additional protection
resource "cloudflare_page_rule" "api_rate_limit" {
zone_id = var.zone_id
target = "example.com/api/*"
actions {
cache_level = "bypass"
security_level = "high"
# API専用のレート制限
rate_limit {
threshold = 50
period = 60
action = "challenge"
}
}
}攻撃を受けた時の対処法
実際に攻撃を受けた際の緊急対応手順をまとめました。
緊急時の手順
Step 1: 攻撃の確認と分析(5分以内)
# 緊急診断スクリプト
#!/bin/bash
echo "=== DDoS Attack Emergency Analysis ==="
echo "Time: $(date)"
# 1. 現在の接続数
echo "Active connections:"
netstat -an | grep :80 | wc -l
# 2. 上位接続元IP
echo "Top source IPs:"
netstat -ntu | grep :80 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10
# 3. システムリソース
echo "System resources:"
echo "CPU: $(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d% -f1)%"
echo "Memory: $(free | grep Mem | awk '{printf("%.1f%%", $3/$2 * 100.0)}')"
echo "Load average: $(uptime | awk -F'load average:' '{print $2}')"
# 4. ネットワーク統計
echo "Network statistics:"
ss -sStep 2: 即座の軽減策(10分以内)
# 緊急ブロック対応
#!/bin/bash
# 1. 攻撃元IPの特定と一時ブロック
echo "Blocking top attacking IPs..."
netstat -ntu | grep :80 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -20 | while read count ip; do
if [ $count -gt 100 ]; then
echo "Blocking $ip (connections: $count)"
iptables -A INPUT -s $ip -j DROP
fi
done
# 2. 緊急レート制限
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP
# 3. SYN flood対策
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 2048 > /proc/sys/net/ipv4/tcp_max_syn_backlog
# 4. 不要なサービス停止
systemctl stop apache2 # 一時的にWebサーバー停止
sleep 10
systemctl start apache2 # 再起動でコネクションリセット事後対応
復旧確認チェックリスト:
- □ サービスの正常動作確認
- □ レスポンス時間の測定
- □ データベース整合性チェック
- □ ログファイルの分析
- □ セキュリティホールの確認
今後の対策強化:
- 攻撃パターンの分析と対策強化
- 監視システムの閾値調整
- インシデント対応手順の見直し
- バックアップ・復旧手順の確認
- チーム内での情報共有
Webセキュリティをさらに強化する関連記事
DDoS対策の基本を理解したら、包括的なセキュリティ強化とAI活用でより堅牢なシステムを構築しましょう:
AI開発支援・コード管理
- Qoder – AIが完全理解するソフトウェア開発向け次世代IDE - プロジェクト全体を理解してセキュリティ設定の最適化提案を受ける
- Cipher by Byterover – AIコーディング支援のための共有メモリー管理プラットフォーム - セキュリティ設定やインシデント対応の知識を蓄積・共有
- CREAO – AIを活用したカスタムアプリ開発プラットフォーム - 自然言語でセキュアなアプリケーション設計
開発効率化・監視ツール
- MyLens.ai – アイデアやコンテンツを瞬時にビジュアル化するAI支援ツール - ネットワーク構成図やセキュリティフローの可視化に活用
- FastMoss.com – TikTokショップ分析・運営支援に特化したデータアナリティクスプラットフォーム - システム監視とトラフィック分析の参考に
まとめ:防御重視のセキュリティ対策
DDoS攻撃は事前の対策と迅速な対応で被害を最小限に抑えることができます。完全な防御は困難ですが、適切な準備により service の継続性を確保できます。
今日から始められるアクション:
- アプリケーションにレート制限を実装
- CloudFlareやAWS Shield の基本設定
- 監視・アラートシステムの構築
- インシデント対応手順の文書化
セキュリティは一度設定して終わりではありません。継続的な監視と改善で、攻撃に負けないシステムを構築しましょう。
DDoS対策 よくある質問
小規模サイトでもDDoS攻撃の標的になりますか?
はい、規模に関係なく攻撃対象となる可能性があります。自動化されたツールにより無差別に攻撃されることも多く、小規模サイトほど対策が不十分で被害が深刻になりがちです。基本的なレート制限やCloudFlare の無料プランでも十分な効果があります。
DDoS攻撃とアクセス集中の見分け方は?
正常なアクセス集中は時間と共に分散しますが、DDoS攻撃は持続的で異常なパターンを示します。具体的には、特定IPからの大量アクセス、不自然なUser-Agent、同一パターンのリクエストなどが特徴です。ログ分析により区別できます。
レート制限を設定すると正規ユーザーに影響しませんか?
適切に設定すれば影響は最小限です。一般的なWebサイトでは1分間に50-100リクエスト程度で十分で、通常のブラウジングでこの制限に達することはありません。APIの場合は用途に応じて調整し、必要に応じてAPIキーによる個別制限を実装してください。
攻撃を受けた場合、警察に届け出るべきですか?
重大な被害が発生した場合は警察への相談を検討してください。DDoS攻撃は刑法の威力業務妨害罪等に該当する可能性があります。ただし、ログの保全と専門機関(JPCERT/CC等)への相談も重要です。法的対応と並行して技術的な対策を優先しましょう。
