DDoS(分散型サービス拒否攻撃)は通常、サーバーレベルでブロックされますか?
PHPレベルでそれをブロックする方法、または少なくともそれを減らす方法はありますか?
そうでない場合、DDoS攻撃を阻止するための最速かつ最も一般的な方法は何ですか?
DDoS(分散型サービス拒否攻撃)は通常、サーバーレベルでブロックされますか?
PHPレベルでそれをブロックする方法、または少なくともそれを減らす方法はありますか?
そうでない場合、DDoS攻撃を阻止するための最速かつ最も一般的な方法は何ですか?
回答:
DDOSは、次のようなデータセンターの主要システムを圧倒する攻撃のファミリーです。
DDOS防御の構築を開始する前に、最悪の場合のバリューアットリスクを検討してください。小規模なコミュニティ向けの重要ではない、無料で使用できるサービスの場合、リスクのある合計値はピーナッツである可能性があります。確立された数十億ドル規模のビジネスのための有料の、公に面した、ミッションクリティカルなシステムの場合、その価値は会社の価値かもしれません。この後者の場合、StackExchangeを使用するべきではありません:)とにかく、DDOSに対して防御するには、多層防御アプローチが必要です。
すべてのシステムとソフトウェアパッケージを最新のセキュリティパッチで更新してください-そして私はそれらすべてを意味します:
適切なファイアウォールまたはセキュリティアプライアンスがセットアップされ、資格のあるセキュリティ専門家によって定期的にレビューされていることを確認してください。ファイアウォールの強力なルールは、多くの単純な攻撃に対する優れた防御策です。また、オープンサービスごとに利用可能な帯域幅を管理できると便利です。
適切なネットワーク監視ツールを用意します。これは、次のことを理解するのに役立ちます。
攻撃は単に正当なWebサイトサービスの多用である可能性があります(たとえば、クエリを実行する「正当な」URIをヒットする、データを挿入/更新/削除する)-数千から数百万の異なるIPアドレスからの数千または数百万のリクエストがサイトを膝。あるいは、一部のサービスは実行に非常に費用がかかるため、わずかな要求だけがDOSを引き起こす可能性があります-本当に高価なレポートだと思います。したがって、何が起こっているのかをアプリケーションレベルで適切に監視する必要があります。
アプリケーションにおける賢明な制約と制限。たとえば、次のようになります。
最後に、大事なことを言い忘れましたが、DOS応答計画ドキュメントを作成し、これをすべての関係者(ビジネス、管理、SW開発チーム、ITチーム、セキュリティの専門家)に内部でレビューしてもらいます。ドキュメントを作成するプロセスにより、あなたとあなたのチームは問題について考え、最悪の事態が休日の午前3時に発生した場合に備えて準備するのに役立ちます。ドキュメントは(とりわけ)カバーする必要があります:
それで、前文はさておき、ここにいくつかの具体的な答えがあります:
DDOSは通常、サーバーレベルでブロックされますよね?
実際にはそうではありません-最悪のDDOS攻撃のほとんどは低レベル(IPパケットレベル)であり、DDOS攻撃を処理するために開発されたルーティングルール、ファイアウォール、およびセキュリティデバイスによって処理されます。
PHPレベルでそれをブロックする方法、または少なくともそれを減らす方法はありますか?
一部のDDOS攻撃は、アプリケーション自体を狙っており、有効なURIとHTTPリクエストを送信します。リクエストの割合が上がると、サーバーが苦労し始め、SLAが停止します。この場合、PHPレベルでできることがいくつかあります。
アプリケーションレベルの監視:各サービス/ページが何が起こっているかを確認できる方法でリクエストをログに記録するようにします(これにより、攻撃を軽減するためのアクションを実行できます)。いくつかのアイデア:
ログツール(またはExcelなど)に簡単にロードできるログ形式を用意し、コマンドラインツール(grep、sed、awk)で解析します。DDOSは数百万行のログを生成することを忘れないでください。何が起こっているのかを理解するために、(特にURI、時間、IP、ユーザーに関して)ログをスライスアンドダイスする必要があり、次のようなデータを生成する必要があります。
各リクエストのIPアドレスをログに記録します。これを逆引きしないでください-皮肉なことに、これを行うコストは攻撃者にとってDDOSを容易にします
賢明なレート制限:特定のIPまたはユーザーが特定の期間に実行できるリクエストの数に制限を実装できます。正当な顧客が1秒あたり10を超えるリクエストを行うことはできますか?匿名ユーザーは高価なレポートにアクセスできますか?
匿名アクセス用のCAPTCHA:すべての匿名リクエストにCAPTCHAを実装して、ユーザーがDDOSボットではなく個人であることを確認します。
DDOS攻撃を阻止するための最速かつ最も一般的な方法は何ですか?
恐らく最速は恐喝に屈することですが、これは望ましくないかもしれません。
それ以外の場合、最初に行うことは、ホスティングおよび/またはCDNプロバイダーに連絡して、それらと連携することです(連絡がない場合は、何が起こっているのかをすでに尋ねています...)。DDOSが発生すると、ホスティングプロバイダーの他の顧客に付随的な影響を与える可能性があり、プロバイダーは、単にリソースを保護するためにサイトをシャットダウンするというかなりのプレッシャーにさらされる可能性があります。ログ(すべての情報)をプロバイダーと共有する準備をしてください。これらのログは、ネットワークモニターと組み合わされて、攻撃をブロック/軽減するのに十分な情報を提供する場合があります。
DDOSを期待している場合は、提供できる保護のレベルでホスティングプロバイダーを認定することをお勧めします。DDOSの経験と、それを軽減するためのツールが必要です。ツール、プロセス、およびエスカレーション手順を理解してください。また、ホスティングプロバイダから持ってサポートするかについて尋ね、その上流のプロバイダ。これらのサービスは、より多くの前払いまたは月額費用を意味する場合がありますが、これは保険契約として扱います。
攻撃を受けている間は、ログを取得してマイニングする必要があります。攻撃のパターンを試してみてください。匿名アクセスをオフにし、攻撃を受けているサービスを制限することを検討する必要があります(つまり、サービスのアプリケーションのレート制限を下げる)。
運が良ければ、固定された小さな顧客ベースがある場合は、有効な顧客のIPアドレスを特定できる可能性があります。この場合、しばらくの間、ホワイトリストアプローチに切り替える可能性があります。新しいIPからアクセスする必要がある場合に電話できるように、すべての顧客がこれが行われていることを知っていることを確認してください:)
Doug McCleanは、https://stackoverflow.com/a/1029613/1395668でいくつかの素晴らしいアドバイスをしています。
質問のPHPの部分によると;
私はこれをPHPに依存していませんが、実装することはできますが、これらすべての可能性以上を考慮する必要があります。
単純な疑似;
<?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;
?>
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からお尻を節約します。すごい!
PHPレベルではこれを行うことはできません。DDOSは、Webサーバーに送信するリクエストが多すぎる一種の攻撃です。Webサーバーは、PHPスクリプトを呼び出す前に要求を拒否します。
Apacheを使用している場合、Apacheからのヒントを次に示します。http: //httpd.apache.org/docs/trunk/misc/security_tips.html
DDoSは、非常に高価な専用のネットワークアプライアンスで処理するのが最適です。ホストは、パフォーマンスが比較的低く、状態が枯渇し、帯域幅が制限されるなどの理由で、一般にDDoS保護を行うのが苦手です。DDoS緩和ハードウェアにアクセスできない場合、iptables、apache mods、および同様のサービスを使用すると、状況によっては役立つ場合があります。またはDDoS緩和サービスですが、理想からはほど遠いため、攻撃のリスクがあります。
PHP側でこのようなものはどうですか?
//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;
}
ddos / dos用のapacheで使用できるプラグインがあります。ここから始めましょう 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
これらは安価な出発点として適しています。
PHPベースの保護を使用しないでください。それは恐ろしく、ほとんど影響を与えません。たとえば、limit_reqモジュール(http://nginx.org/en/docs/http/ngx_http_limit_req_module.html)を使用してNginxでリクエストをレート制限するようにWebサーバーを構成します。
ただし、CloudFlareを使用してレイヤー4と戦うことをお勧めします。ただし、支払いを希望しない限り、レイヤー7ベースの攻撃はお勧めしません。
DDOSは通常、サーバーレベルでブロックされます。サーバーレベルでDDOS保護を有効にしてください。DDOS保護については、以下の注意事項を確認してください。
DDOS問題の防止に役立つApacheHTTPサーバー構成設定:
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ディレクティブを調整して、サーバーがリソースを使い果たすことなく最大数の同時接続を処理できるようにします。
アンチDDOSステップ: