DDoS攻撃とは?開発者が知るべきセキュリティの基本

「サーバーが急に重くなって、アクセスできなくなった…」これが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 -s

Step 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開発支援・コード管理

開発効率化・監視ツール

まとめ:防御重視のセキュリティ対策

DDoS攻撃は事前の対策と迅速な対応で被害を最小限に抑えることができます。完全な防御は困難ですが、適切な準備により service の継続性を確保できます。

今日から始められるアクション:

  • アプリケーションにレート制限を実装
  • CloudFlareやAWS Shield の基本設定
  • 監視・アラートシステムの構築
  • インシデント対応手順の文書化

セキュリティは一度設定して終わりではありません。継続的な監視と改善で、攻撃に負けないシステムを構築しましょう。

DDoS対策 よくある質問

小規模サイトでもDDoS攻撃の標的になりますか?

はい、規模に関係なく攻撃対象となる可能性があります。自動化されたツールにより無差別に攻撃されることも多く、小規模サイトほど対策が不十分で被害が深刻になりがちです。基本的なレート制限やCloudFlare の無料プランでも十分な効果があります。

DDoS攻撃とアクセス集中の見分け方は?

正常なアクセス集中は時間と共に分散しますが、DDoS攻撃は持続的で異常なパターンを示します。具体的には、特定IPからの大量アクセス、不自然なUser-Agent、同一パターンのリクエストなどが特徴です。ログ分析により区別できます。

レート制限を設定すると正規ユーザーに影響しませんか?

適切に設定すれば影響は最小限です。一般的なWebサイトでは1分間に50-100リクエスト程度で十分で、通常のブラウジングでこの制限に達することはありません。APIの場合は用途に応じて調整し、必要に応じてAPIキーによる個別制限を実装してください。

攻撃を受けた場合、警察に届け出るべきですか?

重大な被害が発生した場合は警察への相談を検討してください。DDoS攻撃は刑法の威力業務妨害罪等に該当する可能性があります。ただし、ログの保全と専門機関(JPCERT/CC等)への相談も重要です。法的対応と並行して技術的な対策を優先しましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次