Dos攻撃から身を守る
-
06-07-2019 - |
質問
これは、Serverfaultにより適したものかもしれませんが、ここにのみ来る多くのWeb開発者は、おそらくこの質問に対する可能な答えから恩恵を受けるでしょう。
問題は、Webサーバーに対するDoS攻撃から自分をどのように効果的に保護するかです。
この記事
を読んだ後、これを自問しました。よく知らない人のために、これについて覚えています。DoS攻撃は、偽のヘッダーをサーバーに繰り返し送信することにより、すべての接続を占有しようとします。
これにより、サーバーは同時接続の可能性の制限に到達し、その結果、通常のユーザーはサイトにアクセスできなくなります。
ウィキペディアはさらに情報を提供します: http://en.wikipedia.org/wiki/Denial_of_service
解決
万能薬はありませんが、次のいずれかを行うことでDoS攻撃をより困難にすることができます。
- 認証されていないクライアントに代わって高価な操作を行わない(または意思を制限しない)
- スロットル認証の試行
- 認証された各クライアントに代わって実行されるスロットル操作。あまりにも多くのことを短時間で行うと、アカウントを一時的なロックアウトに置きます
- すべての非認証クライアントに同様のグローバルスロットルを設定し、進行中の攻撃を検出した場合はこの設定を下げる準備をします
- すべての認証されていないアクセスを無効にするために攻撃中に使用できるフラグを用意します
- 認証されていないクライアントに代わって物事を保存せず、クォータを使用して認証された各クライアントのストレージを制限します
- 一般に、すべての不正な形式の、不当に複雑な、または不当に巨大なリクエストを可能な限り迅速に拒否します(そしてそれらを記録して攻撃の検出を支援します)
- 認証されていないクライアントからのリクエストがそのキャッシュから物事を排除する可能性がある場合は、純粋なLRUキャッシュを使用しないでください。キャッシュポイズニング攻撃の対象になるためですキャッシュからすべての有用なものを排除し、正当なクライアントにサービスを提供するためにより多くの作業を行う必要があります)
覚えておいて、スロットルされたリクエストを完全に拒否することが重要です(たとえば、 HTTP 503:Service Unavailable レスポンス、または使用中のプロトコルに適した同様のレスポンス)スロットルされたリクエストをキューに入れるのではなく。それらをキューに入れると、キューはすべてのメモリを使い果たし、DoS攻撃は少なくともスロットリングなしの場合と同じくらい効果的です。
HTTPサーバーに関するより具体的なアドバイス:
- Webサーバーが、
Content-Length
ヘッダーを伴わないPOST
メッセージを拒否するように設定されていることを確認します。Content-Length
を記述し、POST
(またはPUT
)の目的
他のヒント
この特定の攻撃では(リクエストがGETである限り)、ウェブサーバーへの完全なリクエストのみをベースとするロードバランサーまたはWAFが機能します。
GET POSTの代わりに問題が発生します(これは簡単です)。これは悪意のあるPOSTなのか、ユーザーからの本当に遅いアップロードなのかわからないからです。
DoS自体からは、単純な事実のためにWebアプリケーションを実際に保護することはできません。リソースは限られていますが、攻撃者はDoSを実行するための時間とリソースを無制限に持っている可能性があります。ほとんどの場合、攻撃者が必要な手順を実行するのは安価です。例えばこの攻撃では、数百の低速接続が上記で言及されています->問題ありません
非同期サーバーは、この特定の形式の攻撃に対して多かれ少なかれ耐性があります。たとえば、私はNginxリバースプロキシを使用してDjangoアプリを提供しますが、攻撃はその動作にまったく影響を与えなかったようです。もう1つの一般的な非同期サーバーはlighttpdです。
この攻撃は、接続が遅い単一のマシンでも実行できるため、危険です。ただし、一般的なDDoS攻撃はサーバーを多数のマシンに対して攻撃し、それらからマシンを保護するためにできることはほとんどありません。
簡単な答え:
DoSから身を守ることはできません。
DoSはセキュリティの問題として分類され、プログラミングに明確に関連しているため、serverfaultに属していることに同意しません