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 を頻繁に使用するユーザーにも問題なく機能するはずです。誰かがこれが効率的または非効率的であることを確かな数学で証明できますか? :)