Apache WebサーバーでDoS攻撃を防止する

Apache WebサーバーでDoS攻撃を防止する

これは私たちが使用しているApacheのバージョンです - httpd-2.2.15-39.el6.centos.x86_64

最近、DoS攻撃によって当社のウェブサイトが閉鎖されたため、iptablesとそれを使用してDoS攻撃を防ぐ方法を学び始めました。いくつかのフォーラムを探してみると、今理解しようとするルールが十分です。単一のIPからの接続数を制限するために、クライアント(Webブラウザ)とサーバー(Webサーバー - httpd)間の通信を理解したいと思います。たとえば、Google Chromeで「www.mywebsite.com」をクリックして、自分のウェブサイトのさまざまなページを閲覧し始めます。今、クライアントとWebサーバーの間にいくつの接続がありますか?私のWebサーバーでnetstatを実行して確認しました。私のIP(Chrome Webブラウザ)に接続されている接続は1つしか表示できません。いつもこんな感じですか?クライアントとWebサーバーの間には1つの接続だけが行われ、この接続を介してのみ通信が行われます。この接続はどのくらいの期間開いていますか?

次のルールを使用しても安全ですか?

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 10 -j DROP

上記の2つの規則は、誰かが自分のコンピュータから自分のWebサーバーに接続しようとする危険性を完全に排除します(1分あたり10の接続が正当ではないことを考えると)。

次の2つのルールを考えてみましょう。

iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 50/minute --limit-burst 200 -j ACCEPT

iptables -A INPUT -p tcp --dport 80 -m state --state RELATED,ESTABLISHED -m limit --limit 50/second --limit-burst 50 -j ACCEPT

さて、上記のルールは何をしますか?以下の質問でこの質問をしましたが、まだそれについての完全な写真を得ることはできません。

最初の規則では、1分あたり50の接続のみを許可し、200個まで拡張できることを示していますか? 1分あたり200の接続が許可されている場合、連続した分の間は50の接続のみが許可されます。

Extreme Burstの場合、トークンは200個から始まります。これは、私のWebサーバーがこの間に200の要求を受け取ったと仮定すると、トークンの数が50になり、次の分には50の接続しか許可しません。今3分後にはどうなりますか? 200件のリクエストを再び許可しますか?最後の瞬間と同じです。接続数<=50?私の理解は正しいですか?

最後のルールは何を言いますか?特定の時点で50個の接続しか作成できませんか?

上記の2つのルールが合法的なトラフィックを破棄する可能性がありますか?

一般に、DoS攻撃やWebサーバーへの攻撃を防ぐために他のiptablesルールを使用することをお勧めしますか?

答え1

クライアントとWebサーバーの間にどのくらいの接続がありますか?

通常、ブラウザはWebサーバーと6〜10のTCP接続を確立します。
Chromeでテストしてみましたが、こんな感じです。私は通常、要求を非常に高速に実行するエンドツーエンドのテストランチャーでテストするので、設定またはnetstatコマンドを調整する必要があるかもしれません。私は通常netstat -plunt、または同様のものから始めます。
同じURLにアクセスしてブラウザがキャッシュされているため、コンテンツが少なくなる可能性があります。別のページをリクエストしてください。

接続はどのくらい続きますか?

これはApacheのディレクティブに設定されていますkeepalive(Apacheのバージョンによっては通常約5〜10秒)。ただgrepです。時々、パフォーマンス上の理由でより低く設定またはオフになることがあります。しかし、サーバーを管理する唯一の人であれば、その事実に気付くでしょう。
0に設定されていると、netstatコマンドが接続を取得できない理由が考えられます。これは、netstatが報告する前に接続が切断されるためです。

iptables -A INPUT -p tcp --dport 80 -m state --state NEW -mlimit --limit 50/分 --limit-burst 200 -j ACCEPT

まず、この規則は追加- 既存のルールセットの終わりまで。つまり、一致する前に他のルールがあっても、そのルールは考慮されません。
これは、数学的計算にトークンバケットの概念を使用するnetfilter制限モジュールに由来します。この場合、200個のトークンがバケットに入り、すべてのトークンが消費されるまで、つまりバケットが空になるまで、ルールは一致します。
ただし、バケットは毎分50の速度で補充されます。
したがって、基本的なアイデアは、一致したいと言うことです。平均毎分50回 - 一日中毎分50の要求を一致させ続けたいと思います。
それでは、誰かが突然120の要求をしましたが、次の3分間何も要求しなかった場合はどうなりますか?技術的にはあなたの定義内にあります。毎分50回 - 平均
したがって、この問題を解決するには、バケットに追加のトークンを配置する必要があります。

詳細については、次を参照してください。ネットワークフィルタ文書

答え2

DoS攻撃を防ぐために、ネットワーク層をより深く掘り下げる必要があります。ディストリビューションのネットワーキングガイドを確認するには、「DoS攻撃Linux」を検索してください。ほとんどの軽減では、iptablesを使用してトラフィックを制限します。

答え3

最適化ディレクティブは、MaxRequestWorkersリソースが使い果たされる同時接続の最大数を定義します。また見てくださいApacheのパフォーマンスチューニング

使うミミモジュールスレッドを使用すると、同時接続を活用してサービス拒否攻撃。将来的には、mpmモジュールイベントは非同期処理を使用するため、接続ごとにスレッドはありません。 OpenSSL ライブラリの特性により、mpm モジュールイベントは現在、モジュール mod_ssl やその他の入力フィルタと互換性がありません。そのような場合、その動作はモジュールmpmワーカーの動作に縮小されます。

利用可能なサードパーティのモジュールがたくさんあります。Apacheモジュールのリストこれにより、特定の顧客の行動を絞り込み、DoSの問題を最小限に抑えることができます。

関連情報