web-dev-qa-db-ja.com

DDoS保護を有効にする方法

DDoS(分散型サービス拒否攻撃)は一般にサーバーレベルでブロックされますか?

PHPレベルでブロックする、または少なくとも削減する方法はありますか?

そうでない場合、DDoS攻撃を阻止する最も速く最も一般的な方法は何ですか?

79
coderama

DDOSは、データセンターの主要なシステムを圧倒する攻撃のファミリーです。

  • ホスティングセンターのインターネットへのネットワーク接続
  • ホスティングセンターの内部ネットワークとルーター
  • ファイアウォールとロードバランサー
  • Webサーバー、アプリケーションサーバー、およびデータベース。

DDOS防御の構築を開始する前に、最悪の場合のバリューアットリスクを検討してください。小規模なコミュニティ向けの重要ではない無料のサービスの場合、リスクの合計値はピーナッツになる可能性があります。確立された数十億ドル規模のビジネス向けの、有料の公共向けのミッションクリティカルなシステムの場合、その価値は会社の価値になる可能性があります。後者の場合、StackExchangeを使用するべきではありません:)とにかく、DDOSから防御するには、徹底した防御アプローチが必要です。

  1. ホスティングセンターと協力して、インターネットへのネットワーク接続でのIPおよびポートフィルタリングや提供するファイアウォールサービスなど、提供するサービスを理解します。これは重要です。ホスティング会社がDDOSによって1人の顧客に引き起こされたデータセンター全体の混乱に対処するため、多くのサイトがホスティング会社によってインターネットからプルされます。また、DDOS攻撃中は、ホスティングセンターのスタッフと非常に緊密に連携するため、緊急電話番号を把握し、彼らと良好な関係を保ってください。プロトコルおよびその他の広域スペクトル防御手段、またはホワイトリストに登録されたIPのみを許可する(ビジネスモデルに応じて)
  2. ホスティングセンターで-コンテンツ配信ネットワークを使用して、エンドユーザーの近くに(主に静的な)サービスを配布し、非表示にしますDDOSアーキテクトからの実サーバー。完全なCDNは、DDOSがすべての国のすべてのノードを取り出すには大きすぎます。 DDOSが1つの国に焦点を合わせている場合、少なくとも他のユーザーは大丈夫です。
  3. すべてのシステムとソフトウェアパッケージを最新のセキュリティパッチで更新します-そして、それらすべてを意味します:

    • 管理されたスイッチ-これらは時々更新が必要です
    • ルーター
    • ファイアウォール
    • ロードバランサー
    • オペレーティングシステム
    • Webサーバー
    • 言語とそのライブラリ
  4. 優れたファイアウォールまたはセキュリティアプライアンスが設定されていることを確認し、資格のあるセキュリティエキスパートによって定期的にレビューされていること。ファイアウォールの強力なルールは、多くの単純な攻撃に対する優れた防御策です。また、各オープンサービスで利用可能な帯域幅を管理できると便利です。

  5. 適切なネットワーク監視ツールを用意してください-これは理解するのに役立ちます:

    • 単に重い負荷がかかっているのではなく、攻撃を受けていること
    • 攻撃の発信元(通常は取引を行っていない国が含まれる場合があります)および
    • 攻撃の実際の内容(ポート、サービス、プロトコル、IP、およびパケットの内容)
  6. 攻撃は、正当なWebサイトサービスの単純な大量使用(クエリを実行する「合法的な」URIのヒット、データの挿入/更新/削除など)である可能性があります。膝。あるいは、一部のサービスは実行に非常に高価であるため、ごく少数の要求だけがDOSを引き起こします-本当に高価なレポートだと考えてください。そのため、何が起こっているかを適切にアプリケーションレベルで監視する必要があります

    • 呼び出されたサービスと送信される引数/データ(つまり、アプリケーションへのログイン)
    • どのユーザーが呼び出しを行っており、どのIPから実行されているか(つまり、アプリケーションへのログイン)
    • DBが実行しているクエリおよび挿入/更新/削除
    • システムのすべてのコンピューター(およびVM)の負荷平均、CPU使用率、ディスクI/O、ネットワークトラフィック
    • このすべての情報を簡単に取得できるようにし、異なるコンピューターやサービスからのログを相互に関連付けられるようにします(つまり、ntpを使用してすべてのコンピューターの時刻を同期します)。
  7. アプリケーションの適切な制約と制限。たとえば、次のことができます。

    • ロードバランサーのQoS機能を使用して、すべての匿名セッションをクラスター内の別のアプリケーションサーバーに送信し、ログオンユーザーは別のセットを使用します。これにより、アプリケーションレベルの匿名DDOSが貴重な顧客を奪うことを防ぎます
    • 強力なCAPCHAを使用して匿名サービスを保護する
    • セッションタイムアウト
    • レポートなどの特定の種類のリクエストに対してセッション制限またはレート制限を設定します。必要に応じて匿名アクセスをオフにできることを確認してください
    • ユーザーが同時セッションの数に制限を設けていることを確認します(ハッキングされたアカウントが100万回ログオンするのを防ぐため)
    • さまざまなサービス(たとえば、トランザクションの使用とレポートの使用)に異なるデータベースアプリケーションユーザーを使用し、データベースリソース管理を使用して、1種類のWeb要求が他のすべての要求を圧倒するのを防ぎます。
    • 可能であれば、これらの制約を動的にするか、少なくとも構成可能にします。このようにして、攻撃を受けている間、ユーザーごとにセッションを1つだけにし、匿名アクセスを許可しないなど、積極的な一時制限を設定できます(攻撃を「調整」)。これは確かに顧客にとっては素晴らしいことではありませんが、サービスをまったく提供しないよりもずっと良い方法です。
  8. 最後に、重要なこととして、DOS応答計画文書を作成し、ビジネス、管理、SW開発チーム、 ITチームとセキュリティの専門家。ドキュメントを作成するプロセスにより、あなたとあなたのチームは問題を熟考し、最悪の事態が休日の午前3時に発生する場合に備えられるようになります。文書は(とりわけ)カバーする必要があります:

    • 危険にさらされているもの、およびビジネスへのコスト
    • 資産を保護するために取られた措置
    • 攻撃の検出方法
    • 計画された対応およびエスカレーション手順
    • システムとこのドキュメントを最新の状態に保つプロセス

序文はさておき、ここにいくつかの具体的な答えがあります。

DDOSは一般にサーバーレベルでブロックされますよね?

そうではありません-最悪のDDOS攻撃のほとんどは低レベル(IPパケットレベル)であり、DDOS攻撃を処理するために開発されたルーティングルール、ファイアウォール、セキュリティデバイスによって処理されます。

PHPレベルでブロックする方法、または少なくともそれを減らす方法はありますか?

一部のDDOS攻撃は、有効なURIおよびHTTPリクエストを送信するアプリケーション自体を対象としています。リクエストの割合が上がると、サーバーが悪戦苦闘し始め、SLAの停止が発生します。この場合、PHPレベル:

  • アプリケーションレベルの監視:各サービス/ページがリクエストを記録していることを確認します(これにより、攻撃を軽減するためのアクションを実行できます)。いくつかのアイデア:

    • ログツール(またはExcelなど)に簡単にロードでき、コマンドラインツール(grep、sed、awk)で解析できるログ形式を使用します。 DDOSは数百万行のログを生成することに注意してください。何が起こっているのかを把握するために、ログをスライス(特にURI、時間、IP、およびユーザー)し、次のようなデータを生成する必要があります。

      • アクセスされているURI
      • 高頻度で失敗しているURI(攻撃者が攻撃している特定のURIの可能性の高いインジケータ)
      • サービスにアクセスしているユーザー
      • 各ユーザーがサービスにアクセスするIPの数
      • 匿名ユーザーがアクセスするURI
      • 特定のサービスで使用されている引数
      • 特定のユーザーのアクションを監査する
    • 各リクエストのIPアドレスを記録します。 DNSを逆引きしないでください-皮肉なことに、これを行うコストは攻撃者にとってDDOSを簡単にします

    • URIとHTTPメソッド全体をログに記録します(例:「GET http://example.com/path/to/service?arg1=ddos
    • ユーザーIDが存在する場合はログに記録します
    • 重要なHTTP引数を記録する
  • 合理的なレート制限:特定のIPまたはユーザーが特定の期間に行うことができるリクエスト数に制限を設けることができます。正当な顧客が1秒あたり10件を超えるリクエストを行うことはできますか?匿名ユーザーは高価なレポートにまったくアクセスできますか?

  • 匿名アクセス用のCAPTCHA:すべての匿名要求にCAPTCHAを実装して、ユーザーがDDOSボットではなく個人であることを確認します。

DDOS攻撃を阻止する最も速く最も一般的な方法は何ですか?

恐らく最速の手段は恐らく恐giveに屈することですが、これは望ましくないかもしれません。

それ以外の場合、最初に行うことは、ホスティングプロバイダーやCDNプロバイダーに連絡し、それらと連携することです(既に連絡を取っていない場合は、一体何が起こっているのかを尋ねます...)。 DDOSが発生すると、ホスティングプロバイダーの他の顧客に影響を与える可能性が高く、プロバイダーはリソースを保護するためだけにサイトをシャットダウンするようにかなりの圧力を受けている可能性があります。ログ(すべての情報)をプロバイダーと共有する準備をします。これらのログは、ネットワークモニターと組み合わせて、攻撃をブロック/軽減するのに十分な情報を提供する場合があります。

DDOSを期待している場合は、ホスティングプロバイダーが提供できる保護レベルで認定することをお勧めします。 DDOSの経験とそれを緩和するツールが必要です。ツール、プロセス、エスカレーション手順を理解してください。また、ホスティングプロバイダーが their アップストリームプロバイダーにどのようなサポートを提供しているかについても尋ねます。これらのサービスは、より多くの前払いまたは月額費用を意味する場合がありますが、これを保険証券として扱います。

攻撃を受けている間は、ログを取得してマイニングする必要があります-攻撃のパターンを試してみてください。匿名アクセスをオフにし、攻撃を受けているサービスを調整することを検討する必要があります(つまり、サービスに対するアプリケーションのレート制限を下げます)。

幸運で、小規模で固定された顧客ベースがある場合、有効な顧客のIPアドレスを決定できる可能性があります。この場合、しばらくの間、ホワイトリストアプローチに切り替えることができます。新しいIPからアクセスする必要がある場合に電話をかけることができるように、すべての顧客がこれが行われていることを確認してください:)


Doug McClean にはいくつかの素晴らしいアドバイスがあります: https://stackoverflow.com/a/1029613/1395668

187
Andrew Alcock

PHP質問の一部;

私はPHPに依存していませんが、実装することはできますが、これらすべての可能性以上を考慮する必要があります。

  1. 攻撃者はリクエストごとにIPを変更する可能性があります
  2. 攻撃者は、ターゲットサイトがこれらのパラメーターを気にしないパラメーターをURIに渡す可能性があります
  3. 攻撃者は有効期限が切れる前にセッションを再開する可能性があります...

単純な擬似。

<?php
// Assuming session is already started
$uri = md5($_SERVER['REQUEST_URI']);
$exp = 3; // 3 seconds
$hash = $uri .'|'. time();
if (!isset($_SESSION['ddos'])) {
    $_SESSION['ddos'] = $hash;
}

list($_uri, $_exp) = explode('|', $_SESSION['ddos']);
if ($_uri == $uri && time() - $_exp < $exp) {
    header('HTTP/1.1 503 Service Unavailable');
    // die('Easy!');
    die;
}

// Save last request
$_SESSION['ddos'] = $hash;
?>
19
K-Gun

Phpレベルがリクエストチェーンで遅すぎます。

Apacheサーバーをオープンソースアプライアンスの背後に配置するのが適切なオプションです。

http://tengine.taobao.org/ には、DDOS防止を目的としたいくつかのドキュメントとソースコードのほかのモジュールがあります。これはnginxの拡張であるため、Apacheインスタンスのリバースプロキシとして簡単に設定できます。

参照: http://blog.zhuzhaoyuan.com/2012/01/a-mechanism-to-help-write-web-application-firewalls-for-nginx/ 衝突と戦う方法についてはDoS攻撃。

http://www.cloudflare.com は、無料の有料Webアプリケーションファイアウォールの1つであり、無料プランと有料プランがあり、DDOSからあなたのお尻を救います。キャッシュ機能のためだけにサイトをトラフィックします。すごい!

8
j_mcnally

DDoSは、非常に高価な専用ネットワークアプライアンスによって最適に処理されます。ホストは、比較的低いパフォーマンス、状態の枯渇、限られた帯域幅などの影響を受けるため、一般にDDoS保護の実行には適していません。またはDDoS軽減サービスがありますが、理想からはほど遠いため、攻撃の危険があります。

5
ryan

PHP side:

//if user does not change IP, then ban the IP when more than 10 requests per second are detected in 1 second
$limitps = 10;
if (!isset($_SESSION['first_request'])){
    $_SESSION['requests'] = 0;
    $_SESSION['first_request'] = $_SERVER['REQUEST_TIME'];
}
$_SESSION['requests']++;
if ($_SESSION['requests']>=10 && strtotime($_SERVER['REQUEST_TIME'])-strtotime($_SESSION['first_request'])<=1){
    //write the IP to a banned_ips.log file and configure your server to retrieve the banned ips from there - now you will be handling this IP outside of PHP
    $_SESSION['banip']==1;
}elseif(strtotime($_SERVER['REQUEST_TIME'])-strtotime($_SESSION['first_request']) > 2){
    $_SESSION['requests'] = 0;
    $_SESSION['first_request'] = $_SERVER['REQUEST_TIME'];
}

if ($_SESSION['banip']==1) {
    header('HTTP/1.1 503 Service Unavailable');
    die;
}
5
NVG

PHPレベルではこれを実行できません。 DDOSは、Webサーバーに多くのリクエストを送信する一種の攻撃です。ウェブサーバーは、PHPスクリプトを呼び出す前にリクエストを拒否します。

Apacheを使用している場合、Apacheからのヒントを次に示します。 http://httpd.Apache.org/docs/trunk/misc/security_tips.html

4
ndlinh

Apacheでddos/dosに使用できるプラグインがあります。ここから始めましょう http://www.debianadmin.com/how-to-protect-Apache-against-dosddos-or-brute-force-attacks.html

LEMPを使用している場合は、こちらで確認できます。 http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

これらは、安価で良い出発点です。

3
JasonG

通常、DDOSはサーバーレベルでブロックされます。サーバーレベルでDDOS保護を有効にしてください。 DDOS保護については、以下の注意を確認してください。

DDOSの問題の防止に役立つApache HTTPサーバーの構成設定:

RequestReadTimeoutディレクティブを使用すると、クライアントがリクエストを送信するのにかかる時間を制限できます。

ヘッダーを含むリクエストの受信に10秒、リクエスト本文の受信に30秒かかります。

RequestReadTimeout header=10 body=30

リクエスト本文を受信するには、少なくとも10秒かかります。クライアントがデータを送信する場合、受信する1000バイトごとに1秒ずつタイムアウトを増やします。タイムアウトの上限はありません(LimitRequestBodyによって間接的に与えられる制限を除く)。

RequestReadTimeout body=10,MinRate=1000

RequestReadTimeout header=10-30,MinRate=500
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500

KeepAliveTimeoutディレクティブは、DoS攻撃の対象となるサイトでも低くなる場合があります。 KeepAliveを介してキープアライブを完全にオフにするサイトもありますが、これにはもちろんパフォーマンス上の他の欠点があります。他のモジュールによって提供されるさまざまなタイムアウト関連のディレクティブの値を確認する必要があります。

ディレクティブLimitRequestBody、LimitRequestFields、LimitRequestFieldSize、LimitRequestLine、およびLimitXMLRequestBodyは、クライアント入力によってトリガーされるリソース消費を制限するように慎重に構成する必要があります。 MaxRequestWorkersディレクティブを調整して、サーバーがリソースを使い果たすことなく最大数の同時接続を処理できるようにします。

[〜#〜] not [〜#〜]はPHPベースの保護を使用します。恐ろしく、ほとんど影響を与えません! Nginxでlimit_reqモジュールを使用してリクエストをレート制限するようにWebサーバーを設定します( http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

ただし、CloudFlareを使用してレイヤー4に対抗することをお勧めします。ただし、支払いを希望しない限り、レイヤー7ベースの攻撃は避けてください。

2
JustLloyd

Anti DDOSステップ:

  • 最初に重要なことは、最初にddos攻撃を識別することです。 ddos攻撃をより早期に特定することは、サーバーにとってより良いことを意味します。
  • サーバーで利用可能な帯域幅を改善します。サーバーに必要な帯域幅を常に十分に確保してください。これはDDOS攻撃を防ぐことはできませんが、時間がかかります。これにより、行動するための余分な時間が得られます。
  • 独自のWebサーバーを所有している場合は、ルーターのレート制限によりネットワークパラメーターで防御し、フィルターを追加してさまざまな攻撃元にパケットをドロップし、ハーフオープン接続をより積極的にタイムアウトできます。また、SYN、ICMP、およびUDPのフラッドドロップしきい値を低く設定します。
  • これらのことについてよくわからない場合は、すぐにホスティングプロバイダーに連絡してください。 DDOS攻撃を防ぐために最善を尽くすことができます。
  • Cloudflareおよび他の多くの企業が提供する特別なDDOS緩和サービスもあります。これにより、DDOS攻撃の防止に役立ちます。また、多くの企業が安価なddos protectionおよびdos protectionを提供しています。
1
IamNOOB