セキュリティ●●●○○

DDoS攻撃

DDoS Attack ・ ディードスこうげき

多数の機器から大量の通信を送りつけ、回線やサーバを飽和させてサービスを止める攻撃。

✦ 30秒で試す — 航海攻撃を止めるのではなく、世界中に散らして受け止める奥のサーバを10倍の性能に強化すると、利用者は?予想してみる

概要

DDoS(Distributed Denial of Service:分散型サービス妨害)攻撃は、多数の機器から一斉に大量の通信を送りつけ、標的のサーバやその手前の回線の処理能力を飽和させて、正規の利用者がサービスを使えない状態に追い込む攻撃です。データを盗む攻撃と違って狙いは「止めること」そのものであり、ECサイトの繁忙期を狙った営業妨害、「止められたくなければ支払え」と脅す身代金型(ランサムDDoS)、抗議活動、別の侵入から目をそらす陽動など、動機はさまざまです。

元になる概念の DoS(Denial of Service)は、攻撃元が1か所の場合を指します。攻撃元が1つなら、そのIPアドレスをファイアウォールで遮断すれば済みます。DDoS の頭の「D(分散)」がこの前提を壊します。攻撃者はマルウェアに感染した PC・家庭用ルータ・監視カメラなどの IoT 機器を束ねた「ボットネット」を操り、世界中の何万〜何百万という機器から同時に攻撃を仕掛けます。送信元は無数に散らばり、1台1台の通信は正規のアクセスと見分けがつきにくいため、「どこかを遮断すれば済む」対処が通用しません。

なぜ生まれたか

DDoS は、インターネットの設計上の性質の裏返しとして生まれました。インターネットは「届いたパケットはとりあえず受け取って運ぶ」という性善説の設計で、TCP/IP のパケットには送信元を証明する仕組みがありません。送り手が1つのパケットを出すコストは極めて小さく、受け手は受信と応答のたびに資源を使います。この非対称は、送り手が悪意を持って数を束ねた瞬間に武器になります。

2000年2月には、カナダの少年による攻撃で Yahoo!・eBay・CNN などの大手サイトが相次いで停止し、DDoS という言葉が広く知られました。その後、IoT 機器の爆発的な普及が「乗っ取って束ねられる機器」を桁違いに増やします。2016年10月、初期パスワードのままの監視カメラやルータを集めたボットネット Mirai が、DNS サービスを提供していた Dyn 社を攻撃しました。名前解決ができなくなったことで、Dyn を使っていた Twitter や Netflix などの有名サービスが巻き添えで繋がらなくなり、「自分が守っていても、依存先が倒れれば止まる」ことを印象づけました。

防御の側は、この非対称に「自分の入口より上流で受け止める」という発想で応えてきました。回線の太さで攻撃者と張り合うのではなく、世界中に分散した拠点を持つ事業者が攻撃を吸収し、選別した正常な通信だけを自社へ届ける。DDoS 対策が CDN やクラウド事業者のサービスとして提供されているのは、この発想の帰結です。一方で攻撃の実行は「DDoS 請負サービス」として安く売買されており、攻撃のコストの低さと防御のコストの高さの非対称は今も続いています。

詳細

レイヤ別に攻撃を分類する — 防御を考える出発点

DDoS と一口に言っても、狙う資源によって性質が大きく異なり、効く防御も変わります。防御側はまず OSI参照モデルのレイヤで攻撃を整理します。

L3/L4 のボリューム型攻撃は、回線の帯域やネットワーク機器の処理能力を物量で埋め尽くすタイプです。UDP パケットを大量に流し込む UDP フラッドや、後述する増幅攻撃が典型で、勝負は「毎秒何ギガビット(Gbps)受け止められるか」になります。同じ L4 でも資源枯渇型の SYN フラッドは毛色が違い、TCP/IP の3ウェイハンドシェイクの初手(SYN)だけを大量に送って応答せず、サーバに「接続しかけの状態」を大量に抱えさせて接続表を埋め尽くします。帯域ではなく、サーバの接続管理という有限の資源を狙う攻撃です。

L7 のアプリケーション層攻撃は、一見正常な HTTP リクエストを大量に送るタイプです。通信量そのものは小さくても、検索やログインのように「サーバ側の処理が重い」ところを狙えば、少ない通信でアプリケーションやRDBMSを疲弊させられます。プロトコル上は正規のリクエストなので機械的な判別が最も難しく、ボット判定やレート制限といった L7 の防御が必要になります。

攻撃の型枯渇させる資源主な防御L3/L4 ボリューム型UDPフラッド・増幅攻撃回線帯域物量で埋め尽くすAnycastで吸収CDN・スクラビングL4 資源枯渇型SYNフラッド接続表接続しかけの状態を溜めるSYNクッキー状態を持たず検証L7 アプリ層攻撃HTTPフラッドアプリとDBの処理能力重い処理を狙い撃つWAF・ボット判定レート制限・キャッシュ
レイヤ別のDDoS攻撃分類 — 狙われる資源が違えば、効く防御の層も違う

増幅攻撃 — 小さな問いで、大きな答えを撃ち込ませる

ボリューム型攻撃の火力を支える代表的な手口が、リフレクション(反射)と増幅です。攻撃者は送信元のIPアドレスを標的のものに偽装した小さな問い合わせを、インターネットに公開されている DNS や NTP(時刻同期)、memcached(キャッシュ用のサーバ)などに送ります。すると応答は、偽装された送信元、つまり標的へ飛んでいきます。

要点は、これらのプロトコルでは応答が問い合わせの何倍にもなることです。DNS や NTP では数十〜数百倍、設定の甘い memcached では数万倍に達した例があり、2018年に GitHub が受けた約 1.35Tbps の攻撃はこの memcached の反射によるものでした。攻撃者は小さな弾を第三者のサーバに撃つだけで、増幅された大きな弾を標的に浴びせられます。送信元を確かめない UDP のプロトコルだから成り立つ手口で、たどっても「反射に使われた無実のサーバ」しか見えない追跡の難しさも併せ持ちます。

攻撃者ボットネット公開DNSオープンリゾルバNTPサーバ反射に使われるmemcached公開されたままの設定小さな問い合わせ送信元=標的のIP標的回線があふれる問い合わせた覚えなし数十〜数百倍数万倍
反射と増幅 — 送信元を偽った小さな問い合わせが、何倍もの応答になって標的に集まる

防御側の教訓は2つあります。1つは、自組織の公開サーバを反射装置にしないこと(DNS をオープンリゾルバにしない、memcached をインターネットに晒さない)で、これもインターネット全体の防御の一部です。もう1つは、送信元の偽装そのものを入口で止めることです。自分の網から「自分の網のものではない送信元アドレス」のパケットが出ていかないように ISP が入口で落とす対策(BCP 38 と呼ばれる送信元検証)が広まるほど、反射攻撃は撃ちにくくなります。

防御は多層で組む — 吸収・選別・制限

DDoS 防御の大原則は「自分の回線に届く前に、できるだけ上流で受け止める」ことです。自社データセンターの回線が 10Gbps なら、それを超える攻撃は、奥のサーバがどれだけ強くても回線ごと沈みます。回線があふれた時点で、攻撃のパケットも正規利用者のパケットも区別なく捨てられるからです。勝負は自社の入口より手前で決まります。

第一の層は分散による吸収です。CDN や DDoS 対策事業者の多くは Anycast という方式を使います。世界中の拠点が同じ IP アドレスの範囲を BGP で一斉に経路広告すると、インターネットのルーティングは各送信元から「いちばん近い拠点」へ通信を運びます。ボットネットは世界中に散らばっているので、攻撃は自然に何十もの拠点へ割り振られ、それぞれの拠点の余裕で吸収できます。大規模なボリューム型攻撃への現実的な答えはほぼこれで、専用の防御網へ通信を迂回させて洗浄し、正常な分だけを戻すスクラビングセンターも同じ「上流で受ける」発想です。

下の部品で、この違いを確かめてください。ボットの群れを地域に置いていくと、単一拠点では回線の水位があふれ、正規利用者の粒まで落ちていきます。Anycast に切り替えると、同じ群れが最寄りのエッジに分かれて受け止められます。

⚡ 体験: ボットの群れを置いて、回線の水位を見る
受け方
アジア ボット 0 群—欧州 ボット 0 群—北米 ボット 0 群—10G自社DC の回線流入 6Gあふれた分は区別なく捨てる地域へドラッグ(タップでも置ける)ボット群 +20G
正規の利用者の通信(%は届いた割合)ボットの通信(群れをタップで減らす)回線の容量(水位がこれを越えるとあふれる)

ボット群のチップを、どれかの地域へドラッグして置いてください(タップでも置けます)。いまは単一拠点で、世界中の通信が自社 DC の回線 10G に集まります。

第二の層は選別です。SYN クッキー(接続しかけの状態をサーバに持たせず、応答に埋め込んだ値で正当性を確かめる技法)による資源枯渇型への対策や、WAF・ボット判定による L7 攻撃の識別がここに入ります。第三の層がレート制限で、選別をすり抜けた過剰な頻度を最後の調整弁として抑え込みます。Anycast にも限界はあり、ボットが1つの地域に偏っていればその地域の拠点はあふれます。ただし被害はその地域に閉じ、ほかの地域の利用者には届き続けます。

なお「スケーリングで凌ぐ」は一見有効ですが、限界とコストに注意が必要です。L7 攻撃をサーバの自動増設で受け続けることは、攻撃者の通信量の分だけ自分のクラウドの請求が膨らむことを意味し、サービスは生きていても財布が焼かれる EDoS(Economic DoS)と呼ばれる状態に陥ります。そもそも回線があふれるボリューム型には、奥のサーバを増やしても効きません。スケールは防御の主役ではなく、選別と制限が効くまでの時間稼ぎと考えるべきです。

攻撃を受けたとき — 平時の準備がすべて

DDoS は、発生してから対策を調達するのでは間に合いません。監視で通信量の異常をすぐ検知できること、CDN や DDoS 対策サービスへの切り替え手順(DNS の向き先の変更など)が事前に整っていること、通信事業者や対策事業者の緊急連絡先が分かっていること。こうした準備を含めて、DDoS 対応はインシデント対応の一部として平時に設計しておくものです。オリジンの本当の IP アドレスが公開情報や古い DNS 記録から漏れていると、攻撃者は CDN を迂回してオリジンを直接狙えるため、オリジンは CDN からの通信だけを受け付けるように絞っておきます。

身代金型 DDoS で脅迫を受けた場合に支払わない方針を事前に決めておくこと(支払いは再攻撃を招くだけというのが定説です)、攻撃が別の侵入の陽動である可能性を疑ってほかのシステムの監視も強めることも、実務上の大切な備えです。DDoS は「完全に防ぐ」ものではなく、「受けても立ち続けられる構えを平時に作っておく」ものだと捉えるのが、防御側の正しい構えです。

試問

世界の3つの地域(アジア・欧州・北米)から、正規の利用者の通信(各2G)が流れています。ボット群のチップ(1群20G)を地域へドラッグして置くと攻撃が加わり、置いた群れはタップで減らせます。受け方は「単一拠点(自社DCの回線10G)」と「Anycast(各地のエッジ3拠点、それぞれ50G)」から選べます。

✦ 命題挑戦中

ボット群を6つ(計120G)置いても、どの回線もあふれず、正規の利用者に届き続ける受け方と配置を作れ

  • ボット群を 6群以上(120G 以上)置く(いま 0群)
  • そのうえで、どの回線の流入も容量を超えない(正規の利用者が落ちない)
⚡ 体験: ボットの群れを置いて、回線の水位を見る
受け方
アジア ボット 0 群—欧州 ボット 0 群—北米 ボット 0 群—10G自社DC の回線流入 6Gあふれた分は区別なく捨てる地域へドラッグ(タップでも置ける)ボット群 +20G
正規の利用者の通信(%は届いた割合)ボットの通信(群れをタップで減らす)回線の容量(水位がこれを越えるとあふれる)

ボット群のチップを、どれかの地域へドラッグして置いてください(タップでも置けます)。いまは単一拠点で、世界中の通信が自社 DC の回線 10G に集まります。