みなさま、こんにちは。 Webサービスの運営を行っている方は、日頃からサービスの可用性向上のためにさまざまな取り組みを行っていらっしゃるのではないでしょうか。 今回は、そんなサービスの可用性を阻害するサイバー攻撃としてよく知られるDoS攻撃とはどのような攻撃なのか、その対策手法と併せて解説していきます。
かつては、テロ活動などとして行われるイメージが強かったDoS攻撃ですが、その一種であるDDoS攻撃の代行サービスが格安で利用できるようになったことや、DoS攻撃の停止と引き換えに金銭を要求する思想的でない攻撃者が現れるなど、どのようなサービスを運営していてもDoS攻撃のターゲットとなる可能性が高まっています。そのため、しっかりと対策していくことが重要です。
DoS攻撃を複数のマシンから行うDDoS攻撃はDoS攻撃をベースとしていますので、その対策にはDoS攻撃の理解が欠かせません。 そのため今回は、DoS攻撃に絞ってその概要と対策について説明します。
DoS攻撃とは
DoS攻撃の種類例
リロード攻撃
リフレクション攻撃
SYNフラッド攻撃
Slow HTTP DoS
DoS攻撃の対策手法例
攻撃元IPアドレスからの通信の切断
.htaccessによって特定のIPアドレスからのリクエストを拒否する例
一定頻度以上の同一IPアドレスからのリクエストを拒否する
DoS攻撃の対策に有効モジュールを利用する
脆弱性を修正する
サーバーのアーキテクチャを再検討する
まとめ
DoS攻撃とは
DoS攻撃とはDistributed Denial of Service 攻撃の略称ですが、サービス妨害攻撃とも呼ばれ、サーバーやネットワークなどのリソースに対してあらゆる方法で負荷をかけることで、正常なサービスの提供を阻害するサイバー攻撃を指します。
DoS攻撃は大きく分けて次の二種類の攻撃に分かれます。
・ 大量のリクエストや巨大なデータを送りつけるなどしてサービスを利用不能にするフラッド(洪水)攻撃
・ サービスの脆弱性をつくことでサービスを利用不能にする攻撃
これらの攻撃はWebサーバーのみを対象とするものでもなく、SSHサーバーへ負荷を与えることでログインを阻害するものやルーターの脆弱性を利用してルーティングを阻害するものなども含まれます。
攻撃対象となるサービスごとにさまざまな攻撃方法があるため、それぞれの攻撃の原理と対策手法を知ることが重要です。
ここでは、攻撃手法の例とその対策法をいくつか紹介します。
DoS攻撃の種類例
リロード攻撃
リロード攻撃とは、DoS攻撃の中でも最も古典的な手法であり、多数のHTTPリクエストを送りつけることでサーバーへの負荷を増加させる攻撃です。 ブラウザのページ更新ボタンである「F5キー」を押すことによってHTTPリクエストを送りつける行為からF5アタックなどとも呼ばれます。 プログラムなどを用いて大量のGETリクエストを送信する攻撃もこの類型だといえます。
リフレクション攻撃
リフレクション攻撃とは、小さなリクエストに対して大きなレスポンスを返すサービスを利用する攻撃です。攻撃者は攻撃対象のIPアドレスになりすまし、小さなリクエストに対して大きなレスポンスを返すサービスにリクエストを送ります。これによって大容量のレスポンスデータが被害者に届くことになります。アンプ(増幅)攻撃などとも呼ばれます。
SYNフラッド攻撃
SYNフラッド攻撃とは、TCP接続に用いられる3ウェイ・ハンドシェイクにて、クライアントがサーバーから受け取ったSYN/ACKパケットに対して本来返答しなくてはならないACKパケットを返さないということを繰り返すことで、ACK応答を待つサーバーのリソースを圧迫する攻撃です。
SYNフラッド攻撃では、容易に攻撃元のIPアドレスを偽装することが可能であるため、特定のIPアドレスからの通信を遮断することだけでは解決しないのがこの攻撃への対策を難しくしています。
Slow HTTP DoS
Slow HTTP DoS とは、1コネクションあたりの通信時間を延ばしサーバーのリソースを圧迫するDoS攻撃の総称です。 HTTP Request Headerを断続的に送り続けることでコネクション時間を引き延ばすSlow HTTP Headersや、HTTP POST メッセージボディーを低速で送ることでコネクションを占領するSlow HTTP POST攻撃、意図的に小さなWindowサイズを広告することでサーバーからのレスポンスを受け取る時間を引き延ばすSlow Read DoSなどがあります。
DoS攻撃の対策手法例
攻撃元IPアドレスからの通信の切断
膨大な数のリクエストを実施するIPアドレスからの通信を切断することでサービスを守ることができます。その方法としては、 .htaccess やファイアウォールなどを利用して攻撃元からのリクエストを拒否することがあげられます。 ただし、IPアドレスは容易に偽装することが可能であり、特定のIPアドレスからの通信を切断するだけでは攻撃者との間でいたちごっこになる可能性があります。
.htaccessによって特定のIPアドレスからのリクエストを拒否する例
Apache Webサーバーでは、.htaccecc や httpd.conf によって特定のIPアドレスからのリクエストを拒否することができます。 アクセスを拒否したいページのリソースが配置されているディレクトリに .htaccess という名前で以下のような設定を記述したアイルを設置することで、特定のIPアドレスからのリクエストを拒否することができます。なお、.htaccessは設置したディレクトリ以下の全てのディレクトリに対して設定が反映されます。
Order Deny,Allow deny from aaa.aaa.aa # aaa.aaa.aa を拒否 deny from .bbb.bb # ???.bbb.bb を拒否 deny from ccc.ccc. # ccc.ccc.??? を拒否
詳しい記述方法は Apacheのドキュメント を参照してください。
また、設定が反映されない場合は、.htaccess が利用できない状況にある可能性があります。 その場合は、httpd.confの AllowOverrideディレクティブ の設定を確認してみてください。 AllowOrverrideディレクティブ の説明はApacheのドキュメントが参考になります。
一定頻度以上の同一IPアドレスからのリクエストを拒否する
前節で紹介した特定IPアドレスからの通信を拒否する対策手法では、IPアドレスを手作業で指定する必要があるため、多くのIPアドレスから攻撃が訪れると対策が大変です。 この問題を解決するためには、アクセス回数に閾値を設けて一定頻度以上のアクセスを自動的に拒否する様な仕組みを用いることができます。 さまざまな手法が考えられますが、Apache webサーバーの場合は mod_dosdetector や mod_evasive を用いる方法があります。
DoS攻撃の対策に有効モジュールを利用する
その他、DoS攻撃の対策に有効となるようなモジュールを利用することでも対策が行えます。 オープンソースのWAFである Mod Security や SSHサービスへのブルートフォース攻撃を対策する Fail2ban を利用することで攻撃を緩和することができます。
Mod SecurityやFail2banはパッケージ管理ソフトよりインストール可能ですが、サーバー管理ツールPleskを利用している場合にはより簡単に導入することができます。
Plesk利用時のMod SecurityやFail2banの簡単なセッティングの手法を こちら の記事にてまとめておりますので、ぜひ併せてお読みください。
また、Linux系OSでは SYN cookies が利用できるため、これによってSYNフラッド攻撃を緩和することができます。Linux系のほとんどのディストリビューションではデフォルトで有効になっていますが、 /proc/sys/net/ipv4/tcp_syncookies を catコマンドなどで確認して 0 が記録されていれば無効になっていますので、 利用時には以下のようなコマンドで有効にする必要があります。
$ echo 1 > /proc/sys/net/ipv4/tcp_syncookies
脆弱性を修正する
ミドルウエアの脆弱性をついてDoS状態にする攻撃に対策するためには、バージョンを上げることやパッチの適用、脆弱性を修正することで対応することができます。 このような対策を適切に行うためには、日頃より、JPCERT/CCやJVNなどより脆弱性情報を収集することが大切です。 また、ミドルウエアのバージョンなどを手作業で管理して脆弱性情報を収集するのは大変なので、Vulsなどの脆弱性スキャナーを利用すると便利です。
サーバーのアーキテクチャを再検討する
アーキテクチャを変更したりオートスケールを利用したりして構成を冗長にすることで対応できるアクセス数を増やし、DoS攻撃の影響を緩和することができます。 Apacheであればプリフォークするスレッド数を増やすなどの対策も行えます。また、Node.jsのようなイベント駆動型のサーバーを利用することで処理できるリクエスト数を増やすことでもDoS攻撃の影響を緩和することができます。
まとめ
いかがでしたでしょうか。 今回はDoS攻撃の説明とその対策手法を紹介しました。 ここで紹介した対策手法で全てのDoS攻撃を防ぐことはできませんが、対策することによって攻撃の影響を緩和することができます。 なお、サーバーのアーキテクチャを冗長にするなど、いくつかの対策手法はコストが増す選択肢となります。可用性とコストがトレードオフになることを理解し、サービスに対してかけることができるコストを検討し、適切な対策を行うことを心がけましょう。