19

(これは原則として言語に依存しない質問ですが、私の場合は ASP.NET 3.5 を使用しています)

標準の ASP.NETログイン コントロールを使用しており、次の失敗したログイン試行のスロットリング ロジックを実装したいと考えています。

  • イベントを処理し、 Sessionで失敗したログイン試行の数をOnLoginError維持します
  • このカウントが[構成可能な値]に達すると、元の IP アドレスからの、またはそのユーザー/それらのユーザーのそれ以上のログイン試行を 1 時間ブロックします

これは賢明なアプローチのように聞こえますか? そのようなチェックをバイパスできる明らかな手段がありませんか?

注: ASP.NET セッションは、Cookie を使用してユーザーのブラウザーに関連付けられます。

編集

これは、英国とインドからのみ使用される管理サイト用です。

4

5 に答える 5

17

Jeff Atwoodは、別のアプローチについて言及しました。何度も試行した後にアカウントをロックするのではなく、別のログイン試行が許可されるまでの時間を増やします。

1st failed login    no delay
2nd failed login    2 sec delay
3rd failed login    4 sec delay
4th failed login    8 sec delay
5th failed login    16 sec delay

これにより、この保護手段がサービス拒否攻撃に悪用されるリスクが軽減されます。

http://www.codinghorror.com/blog/archives/001206.htmlを参照してください。

于 2009-02-20T16:21:14.987 に答える
15

最後にやりたいことは、失敗したすべてのログイン試行をデータベースに保存することです。これは十分に機能しますが、DDOS攻撃によってデータベースサーバーがダウンするのは非常に簡単です。

おそらく、ウェブサーバーでmemcachedなどのサーバー側キャッシュを使用している可能性があります。これらは、IPアドレスやユーザー名で失敗した試行を追跡するために使用するのに最適なシステムです。失敗したログイン試行の特定のしきい値を超えた場合は、データベース内のアカウントを非アクティブ化することを決定できますが、失敗したログインカウンターのために、永続ストレージへの読み取りと書き込みの束を保存する必要はありません。持続します。

人々がブルートフォース認証を行わないようにしたい場合は、Gumboが提案したようなスロットリングシステムがおそらく最も効果的です。通常の状況下、または攻撃が行われている間でも、正当なユーザーへの影響を最小限に抑えながら、ブルートフォース攻撃を攻撃者にとって無関心にします。memcachedなどでIPによる失敗した試行をカウントすることをお勧めします。極端に分散したブルートフォース攻撃の標的になった場合は、攻撃者が実際に同じユーザー名を頻繁に試します。数え切れないほどの数のIPアドレスからの試みのように、試みが極端に分散されていない限り、最初のby-IPコードは、攻撃者をかなり適切に阻止するはずです。

IPアドレスの数が限られている国からの訪問者の問題を防ぐための鍵は、しきい値を厳しくしすぎないようにすることです。数秒以内に複数回の試行を受け取らなければ、おそらく再心配する必要はあまりありません。スクリプト化されたブルートフォーシング。他のユーザーのパスワードを手動で解明しようとする人々にもっと関心がある場合は、ユーザー名によって、その後のログイン試行の失敗に対してより広い境界を設定できます。

もう1つの提案は、あなたの質問には答えませんが、ある程度関連していますが、エンドユーザーに一定レベルのパスワードセキュリティを適用することです。大文字と小文字が混在している、少なくともx文字、辞書以外のパスワードなどを要求することはしません。まだサインアップしていないときに、多くの人を悩ませたくないからです。ユーザーが自分のユーザー名をパスワードとして使用するのを阻止するだけで、サービスとユーザーを最も洗練されていない攻撃から保護するのに非常に役立ちます。

于 2009-02-21T15:02:01.080 に答える
11

受け入れられた回答は、連続するログイン試行に増加する遅延を挿入しますが、実装方法によっては ASP.NET でのパフォーマンスが非常に低下する可能性があります。ASP.NET は、スレッド プールを使用して要求を処理します。このスレッド プールが使い果たされると、スレッドが使用可能になるまで、着信要求がキューに入れられます。

Thread.Sleep(n) を使用して遅延を挿入すると、遅延の間、ASP.NET スレッド プール スレッドが拘束されます。このスレッドは、他のリクエストを実行するために使用できなくなります。このシナリオでは、単純な DOS スタイルの攻撃は、ログイン フォームを送信し続けることです。最終的には、リクエストの実行に使用できるすべてのスレッドがスリープ状態になります (さらに時間が長くなります)。

この遅延メカニズムを適切に実装する唯一の方法は、非同期 HTTP ハンドラーを使用することです。チュートリアル: 非同期 HTTP ハンドラーの作成 を参照してください。実装には、次のことが必要になる可能性があります。

  1. BeginProcessRequest 中に認証を試み、失敗した場合の遅延を決定します
  2. 遅延後にトリガーされる WaitHandle を公開する IAsyncResult を返す
  3. EndProcessRequest で WaitHandle がトリガーされている (またはトリガーされるまでブロックされている) ことを確認します。
于 2009-10-23T16:43:25.993 に答える