【実務・中級編】 DDoS攻撃に対するクラウドネイティブな緩和策とAuto Scalingの連携 – インフラ・ネットワーク & クラウドセキュリティ防御ガイド

現場で戦うエンジニア諸君。セキュリティは「チェックリストを埋める作業」ではない。「想定外を想定するゲーム」だ。

今日は、クラウドネイティブ環境におけるDDoS対策について話そう。教科書には「WAFを入れろ、Auto Scalingを設定しろ」としか書いていないが、その先にある「攻撃者の心理」と「システム崩壊のトリガー」について触れる。

1. 攻撃者が狙う「リソース枯渇」の盲点

DDoSは単なるトラフィックの洪水ではない。攻撃者は常に「コスト対効果」を計算している。彼らは、最も安価に、最も確実に君たちのインフラをダウンさせるため、以下の2点を狙い撃ちにする。

1. L7(アプリケーション層)の重い処理: 検索クエリやPDF生成など、CPUを食うエンドポイント。
2. Auto Scalingの追従遅延: 負荷が急増してからインスタンスが立ち上がるまでの「数分間の空白」。

この空白こそが、サービスが最も無防備になる時間だ。ここをどう守るか。

2. 実装:Nginxでのレートリミット(現場の第一防衛線)

クラウドのWAFを過信してはいけない。WAFがトラフィックを捌き切る前に、オリジン(Nginx等)で接続を制限する実装を必ず入れること。

# nginx.conf: 特定のIPからの過剰なリクエストを遮断する設定
# 1秒間に10リクエストまで。超過した場合は即座に503を返す
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

server {
    location /api/heavy-process {
        # 503を返すことで、過負荷を回避しつつ接続を早期切断する
        limit_req zone=api_limit burst=20 nodelay;
        proxy_pass http://backend_pool;
    }
}

この設定の肝は nodelay だ。キューに溜めず、即座に弾くことで、サーバーのワーカープロセスが枯渇するのを防ぐ。

3. Auto ScalingとCloudFront/WAFの連携の極意

クラウドネイティブなDDoS対策の本質は、「耐える」ことではなく「逃がす」ことだ。AWSを使うなら、CloudFront + AWS WAF + Auto Scalingの3段構えが基本だが、「スケールアウトのトリガー」に注意が必要だ。

CPU使用率だけでスケールさせていないか?それだと、DBのコネクション枯渇や、メモリ不足によるOOM Killerで死ぬ前にインスタンスが落ちる。必ず「Request Count Per Target」をメトリクスに含めろ。

AWS WAFのレートベースルール(JSON例)

コンソールでポチポチ設定するのもいいが、CI/CDで管理できるようJSON化しておくのがプロの流儀だ。

{
  "Name": "RateLimitRule",
  "Priority": 1,
  "Action": { "Block": {} },
  "Statement": {
    "RateBasedStatement": {
      "Limit": 2000, // 5分間で2000リクエストを超えたらブロック
      "AggregateKeyType": "IP"
    }
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "RateLimitMetric"
  }
}

4. アプリケーション側での「セーフティネット」

最後に、Webアプリ側でできる泥臭い対策だ。どんなにインフラを固めても、バックエンドが詰まれば終わりだ。APIには必ずタイムアウトを実装しろ。

Python (FastAPI/requests) でのタイムアウト設定

import httpx

# 外部APIを叩く際、デフォルトのタイムアウトを放置するのは自殺行為だ
async def fetch_external_resource():
    async with httpx.AsyncClient(timeout=httpx.Timeout(2.0, connect=5.0)) as client:
        try:
            response = await client.get("https://third-party-api.com/data")
            return response.json()
        except httpx.TimeoutException:
            # タイムアウトしたら即座に例外を投げ、ユーザーには「ただいま混雑中」と伝える
            return {"error": "Service Temporarily Unavailable"}

エンジニアへのアドバイス

DDoS対策において、最も危険なのは「過信」だ。
「Auto Scalingが効くから大丈夫」と思っていると、攻撃者がインフラの課金上限を叩き、莫大な請求書だけを残してサービスが落ちる「経済的DDoS」に直面する。

  • 予算アラートの徹底: AWS Budgets等で、急激な課金増を検知したら即座にエンジニアへSlack通知を飛ばす仕組みを作ること。
  • 定期的な負荷試験: 本番環境に近い構成で、あえて ab コマンドや Locust を使い、どの負荷でAuto Scalingが発動し、どの負荷でサービスが崩壊するかを数値で把握しておくこと。

コードを書くとき、インフラを組むとき、常に「これが攻撃されたらどこが死ぬか?」を自問自答してほしい。それができる人間だけが、真のエンジニアだ。

健闘を祈る。何かあればまた相談に来い。

コメント

タイトルとURLをコピーしました