サービス拒否攻撃を軽減するために、TCP 接続を不正に閉じることはできますか?

サービス拒否攻撃を軽減するために、TCP 接続を不正に閉じることはできますか?

私は、サービス拒否攻撃の標的になる可能性のある Web サービスに取り組んでいます。私たちは、「SYN フラッド」スタイルの攻撃に対していくつかの緩和策を講じています。しかし、私たちのサービスに対する他の「アプリケーション レベル」の攻撃もあり、悪意のある/壊れたクライアントが Web サービスに繰り返し高価なタスクを実行するように指示する可能性があります。

私たちは、アプリケーション層、つまりサーバー プロセスでこれらの不正なクライアントを特定できます。プロセスが不正なクライアント接続を特定したら、そのクライアントへのサービス レベルを下げます。

close(2)単純な方法としては、、、または同様の方法で TCP 接続を終了することが考えられますshutdown(2)。しかし、その場合、クライアントはすぐに再接続できます (SYN フラッドを緩和するために設定された接続数/秒の制限まで)。この再接続は、TLS ハンドシェイクやその他の接続セットアップ コストのためにコストがかかります。クライアントがしばらくの間サービスとやり取りするのを停止する方法を探していますが、クリーンな TCP 接続終了ではこれが実現されません。

しかし、もし私たちのプロセスがTCP接続を終了できたとしたら不潔に、不正なクライアントは再接続するまでにしばらく遅延し、「クールダウン」期間が設けられます。「不正な終了」とは、終了をクライアントに通知するパケットを送信せず、その接続を参照するパケットをさらに送信せずに、サーバー側で TCP 接続 (全二重の両半分) を閉じることを意味します。これにより、クライアントが接続がまだ状態にあると見なしている間 (Linux では 13 ~ 30 分)、FINクライアントが遅延します。ESTABLISHED

しかし、UNIX/Linux プロセスが TCP 接続を不正に終了する方法はわかりません。close(2)shutdown(2)および同様のものはすべて接続を正常に終了し、不正な終了のオプションを提供していないようです。

UNIX/Linux には、DOS 攻撃の緩和策として、TCP 接続を即座に不正終了するオプションはありますか?

答え1

検討すべきはファイアウォールですfail2baniptablesこれは Linux ディストリビューションの標準であり、fail2banほとんどのサービスで機能します。実行したいことは、fail2ban特定の正規表現パターンを使用して特定のログ ファイルを監視し、これらの「問題のある」クライアントの 1 つがいつ接続しているかを把握し、fail2ban接続をドロップまたは拒否するファイアウォール ルールを自動的に追加するように構成することです。fail2ban は、ファイアウォール ルールをどのように残すかを設定できるため、クライアントを 5 分間、または 5 日間、必要なだけブロックできます。

この種のものには、Web アプリケーション ファイアウォール (WAF) を使用することもできます。

DOS 攻撃に関しては、攻撃方法によっては、ローカル ファイアウォールではうまくいかない可能性があり、上流のプロバイダーと協力して、問題があり、重大なサービス中断を引き起こしていることが判明しているルートまたはホストをブラック ホール化する必要があるかもしれません。このような状況にはなく、回避すべき潜在的なアプリケーション層の問題があるだけのように思われるので、これはやりすぎです。

答え2

弊社のプロセスにより不正なクライアント接続が特定された場合、そのクライアントに対するサービスのレベルを下げたいと思います。

新しい接続を確立するにはコストがかかるとすでに述べられているので、接続を終了するのではなく、別の方法を検討することをお勧めします。接続を 1 分あたり 1 バイトなどのレート制限にすることを検討できます。この方法を使用すると、最小限のコストで攻撃者のリソースを忙しくすることができます。時間に余裕があり、工夫したい場合は、環境内の 1 つのサーバーにすべての接続をリダイレクトして、他のサーバーが開いているファイルの制限を無駄にしないようにします。Andrew が述べたように、接続が攻撃者からのものであることが確認され、数時間禁止しても安全であれば、fail2ban の使用も検討できます。

関連情報