8

SO には、スロットリングを適用することによる Web サービスのパスワードのブルート フォースの防止に関して、いくつかの有用な回答があります。ただし、適切な数値を見つけることができず、この分野の専門知識がほとんどないため、質問は次のとおりです。

通常、6 文字以上の平均的なパスワードをブルート フォース攻撃するのに何回の試行が必要か (追加の知識がなくても、パスワードはおそらく辞書攻撃を受けやすいことを考慮に入れると)、それに基づいて、意味のある制限は何ですか?ユーザーエクスペリエンスを損なうことなくスロットリングアルゴリズムに適用するには?

これは私の現在のスキームです:

  • ログイン フォームはノンスを使用するため、攻撃者は、ログイン試行の結果を取得して新しいトークンを取得するために、完全な要求サイクルが完了するまで待機する必要があります。
  • ログイン フォームを IP ごとに 50 回取得できるようにし、リクエスト間の間隔は 1 分未満にします。その後、IP は 1 分間ブロックされます。この 1 分以内に新たに試行すると、タイムアウトが再開されます。
  • sleepログイン ページのフェッチごとに が適用されるため、# of attempts / 5リクエスト間の間隔が 1 分未満の 5 つのリクエストの後では、フォームのフェッチに 1 秒以上かかり、10 回のリクエストの後では 2 秒以上かかります。
  • さらに、ユーザー アカウントごとにログイン試行の失敗を 2 時間間隔で 100 回まで許可しています。その後、アカウントは 2 時間ブロックされます。
  • アカウントの頻繁な DoS を回避するために、IP をホワイトリストに登録する (制限を適用しない) またはブラックリストに登録する (ログイン試行を完全に無視する) ことができます。

これまでの回答に基づいて、次のように機能するように調整しました。

  • ログイン フォームの取得は、IP ごとに徐々に遅くなります。新しいリクエストはそれぞれ# of requests / 2数秒間スリープします。ログイン アクティビティが 10 分間ない場合、カウンタはリセットされます。
  • 各 IP のログイン試行の FIFO スタックを保持しています。IP が 2 時間以内に 30 回ログインに失敗した場合、IP は一時停止されます。また、IP ごとの停止数のリストも保持しており、停止時間は として計算され2 ^ (# of suspensions + 1) hoursます。これにより、継続的に問題のある IP が事実上ブラックリストに登録されるようになります。
  • さらに、アカウントが 1 日に 20 回ログインに失敗した場合、そのアカウントは 2 時間停止されます。これは、アカウントが非常に簡単に DoS される可能性があることを意味するため、この措置についてはまだよくわかりません。ただし、大規模な分散型ボットネットを除けば、問題のある IP は、アカウントが永続的に DoS されるよりも早く、事実上ブラックリストに登録されるはずです。また、アカウントを保護するための非常に効果的な手段でもあります。

これらの制限は、定期的にパスワードを忘れて何度もログインしようとするユーザーであっても、通常のユーザーに害を及ぼすべきではないと思います. サービスの平均サイズを考えると、IP 制限は、NAT を頻繁に使用するユーザーにも問題なく機能するはずです。誰かがこれが効率的または非効率的であることを確かな数学で証明できますか? :)

4

3 に答える 3

6

そこにはいくつかの優れたコントロールがありますが、実際にはもっと厳しくする必要があります. 通常のユーザーは、5 回以上ログインに失敗するべきではありません。その場合は、CAPTCHA を見せてください。

いかなる場合でも、アカウントをロックしないでください。これは、アカウント ロックアウトの脆弱性と呼ばれます。これにより、任意のユーザーが他のユーザーをサービスからログアウトできます (DOS、サービス拒否)。

私はこのログインスロットリングの問題に何度も取り組みましたが、私が気に入っているのは、失敗した試行のフィールドと最後に失敗した試行の日付をデータベースに作成することです。誰か (誰でも) がアカウント X へのログインに失敗するたびに、X の失敗した試行の値を増やし、最後に失敗した試行の日付を更新します。失敗した試行回数が Y (たとえば、5) を超える場合は、特定のユーザーの CAPTCHA を表示します。そのため、ログイン フォームを調整するために禁止された IP の巨大なデータベースを用意する必要はありません。代わりに、ユーザーごとに 2 つのフィールドを追加するだけです。また、ボットネットとプロキシ (合法および違法の両方) があるため、IP に基づいて禁止/制限することはほとんど意味がありません。IPv6 が流行するとき、あなたはもっと運命づけられると思います。ターゲット アカウントに基づいて調整する方がはるかに理にかなっています。そう、アカウント X がボットネットの標的にされている場合、ログイン フォームは CAPTCHA で抑制されます。ここでの明らかな欠点は、CAPTCHA が失敗すると、ログイン スロットリングも失敗することです。

したがって、本質的には次のようになります。

  • 誰かがアカウント X へのログインに失敗しました - 失敗した試行フィールドを増やします。
  • 試行に 5 回以上失敗し、最後に失敗したのが 1 時間前の場合、アカウントが攻撃を受けている可能性があるため、CAPTCHA を表示します。
  • 一方、最後に失敗した試行が 1 日以上前に発生した場合は、攻撃が終了したようであり、シールドを下げて CAPTCHA を必要としません。

これは基本的に、特定のアカウントに対する大規模な標的型攻撃があったときにオンになるシールドです。この種のアプローチの良いところは、私が世界中に PC のファームを所有していても問題にならないことです。アカウント ベースであるため、単一のアカウントをブルート フォースすることはできません。

これに関する 2 つの悪い点は、CAPTCHA が失敗した場合、何も残らないことです。もちろん、他の保護を配置することで、この状況を改善することもできます。2 つ目の問題は、ボットネットがあれば、1 つのアカウントにつき 1 台の PC を使用でき、100 万台のコンピューター ネットワークでは少なくとも 1 つのアカウントをクラックできる可能性が高いことですが、このアプローチは非標的型攻撃でしか機能しません。

これがあなたにいくつかの考えを与えたことを願っています。

于 2010-03-04T10:28:48.817 に答える
3

質問によると、パスワードを試すことができる最速の時間は 1 分あたり 50 回です。それに基づいて、ランダムな 6 桁のパスワードを使用します。

もちろん、辞書攻撃の方がはるかに高速ですが、その数値はわかりません。

編集:これを裏付ける Google 計算機の結果をリンクしようとしましたが^、ここのリンクが台無しになっているようです。

EDIT2:

辞書攻撃 ( http://www.outpost9.com/files/WordLists.htmlから):

  • リストされたすべての単語 (75,000): ~1 日
  • 816 個の一般的なパスワードのリスト: ~16 分
  • 非常に長い単語リスト: ~12 日(私がこれを見たところ、ほとんどの非技術者のパスワードが含まれていると推測されます)

ラストは怖いですが、12日は​​やはり長いです。本当に心配なら、ユーザーが正しいパスワードを取得するまですべての間違ったパスワードを追跡できます。その後、リストが 100 回以上試行された場合は、IP アドレスを禁止してユーザーにメールを送信します。

于 2010-03-04T04:43:10.337 に答える
0

私は一般的に@Towerの回答が好きですが、主にユーザーエクスペリエンスとして嫌いなため、CAPTCHAを使用しないバリアントを好みます。

彼の失敗追跡フィールドに加えて、タイムスタンプ付きのロックアウトフィールドも追加します。ユーザーを永久に(または手動でリセットするまで)ロックアウトすると悪いエクスペリエンスが発生することに同意しますが、アカウントを1時間ロックアウトすることは(やや苦痛を伴いながら)効果的な抑止力です。

変更は、失敗カウントがしきい値を超えて増分されると、ロックアウトフィールドがに設定されることnow + 1 hourです。認証が実行されているときはいつでも、このフィールドを調べlockout > now、の場合は失敗します。

9223372036854775807l管理の観点からアカウントを手動でロックアウトすると、ロックアウトフィールドを(最大64ビット署名長)のような将来の値に設定するだけで済みます。

于 2012-11-15T21:53:45.667 に答える