web-dev-qa-db-ja.com

IPアドレスを自動的かつ一時的にブロックして、短期間でサーバーに過度のヒットを与える方法は?

私のLAMPサーバーの1つが、エクスプロイトを探しているある種のスクリプトボットによって最近ダウンされました。その見た目からすると、1秒間に非常に多くのリクエストを出していたため、RAM=サーバーに過負荷がかかり、サイト全体が1時間ダウンしました。すべての "attacK"は、単一のIPアドレス。

では、どのようにすれば、短期間にLAMPサーバーでIPアドレスを自動的かつ一時的にブロックし、ヒット数が多すぎるのでしょうか。仕事に最適なツールは何ですか?これをオペレーティングシステムレベルまたはPHPで解決する必要がありますか?

21
ProgrammerGirl

Fail2Ban 。 Linuxプラットフォームでのこの問題のゴールドスタンダード/デフォルトソリューション。

25
HopelessN00b

PHPでこれを行うことは避けてください。 PHPが関与するまでには、もう手遅れです。メモリはすでに割り当てられています。

どのレイヤーでもIPアドレスを禁止できますが、リソースの使用量が最も少ない最低レベルは、使用するルートです。これは通常ファイアウォールです。少なくとも、iptables(Linuxファイアウォール)を使用したいものです。 Fail2Banなど、これを自動化できるツールは他にもあります。外部ファイアウォールが良いでしょう。

問題のあるIPアドレスを禁止するだけでなく、リソースをより有効に活用する必要があります。リクエストのリソースが少ない場合、攻撃が効果を発揮するまでに時間がかかります。

Apacheも大量のメモリを使用します。 mod_phpを使用している場合は、PHPがすべてのApache子プロセス内にロードされるため、状況はさらに悪化します。つまり、静的コンテンツ(css/js/images)へのリクエストでも、PHPが使用されていない場合でもPHPが読み込まれます。この問題は、代わりにFastCGIを使用して解決できます。 mod_fcgidは適切なオプションです。

よりリソース効率の高い他のWebサーバーもあります。 Nginxは私のお気に入りです。 Lighttpdもあります。 Litespeed(Apacheの代わりにドロップ)のような多くの人々。

Apacheを使い続けたい場合は、できる限り調整することを検討してください。 .htaccessを無効にすることを検討してください。 理由は次のとおりです

5
Luke
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP

ossec は、syslogに基づいてこのタイプの処理を自動的かつ透過的に実行できます。

2
gmck

Httpトラフィックを制御またはブロックするには、以下を使用できます。

ただし、これらのツールはウェブスパイダーをブロック/スローし、SEOに影響を与える可能性があることに注意してください。

2
user130370