ログイン試行を制限する必要があります。
1つのオプションは、IPアドレスで試行をカウントし、IPをブロックすることです。欠点は、異なるユーザーが同じIPアドレスを持っている可能性があることです。別のオプションは、アカウント識別子(ユーザー名または電子メール)で制限してから、アカウントをブロックすることです(サポートによって手動でアクティブ化できます)。考えられる唯一の欠点は、悪意のあるユーザーがユーザー名を推測してブロックできることです...しかし、それ以外は、悪意のあるユーザーが別のIPを使用できるため、より安全だと思いませんか?
それを行うための推奨される方法は何ですか?
あなたは両方を行うべきだと私は言うでしょう。
IPアドレスのレート制限のみを行う場合、ボットネットを制御する攻撃者は、弱いパスワードを使用してアカウントを総当たりする可能性があります。一意のIPを備えた10 000台のコンピューターがあり、それぞれに1時間あたり4回の試行が許可されている場合、1日あたりほぼ100万のパスワードを試すことができます。
ユーザー名のレート制限のみを行う場合、既存のユーザー名のリストを持つ攻撃者は、弱いパスワードを使用してアカウントを総当たりする可能性があります。たぶん、一部のユーザーは上位10個のパスワードのいずれかを使用しているため、すべてのアカウントでそれらを試した場合、どこかにアクセスすることになります。
もちろん、あらゆる種類の組み合わせを行うことができます。たとえば、X個の異なるIPがユーザー名でのログインに失敗した場合にのみユーザー名をブロックする可能性があるため、ユーザーがログインできないようにブロックしようとする攻撃者は、そのために少し動作する必要があります。
脅威モデル
それは本当にあなたの脅威モデルに依存します:
例
例としてebayを取り上げましょう:
したがって、この例では、アプリケーションへのアクセスはやや重要であり、攻撃者は特定のユーザーアカウントを攻撃しません。IPによる制限は正しい決定であり、ユーザー名による制限は有害です。
別の例を見てみましょう:Webアプリケーションの管理者ログイン:
したがって、ここでは、IPによるブロックは攻撃者への影響が少なく、ユーザー名によるブロックが正しい選択です。
両方をレート制限する必要があります。
アカウントに(すべてのIPからの)ログイン試行を制限することはかなり標準的であり、ユーザーのパスワードを推測する試みを停止します。
また、試行されたすべてのアカウントに対する不正なログイン試行に対して各IPアドレスをレート制限する必要があります。そうすることで、1つのアカウントを使い果たして、別のアカウントを何度も試すことができなくなります。
もちろん、これは標準のアンチDDoSリクエスト制限の上にあります。