WordPressのログイン試行回数を制限する|パスワード総当たり攻撃への備え

当ページは検証・整備中のドラフトです。
内容は実環境での検証や追加調査により変更される予定です。
参照:ページ公開・更新ポリシー

WordPressのログイン画面は、botなどによって大量のパスワードを総当たり攻撃を繰り返し試されることが非常によくある。

パスワードの漏洩がなくても、試行を繰り返すことで偶然一致して侵入される可能性があり、その試行自体もWebサイトへの負荷となり得る。

ログインの失敗の許容限度を設定し、一定の条件を超えた接続元からの試行を一時的に遮断することでこれらリスクを抑えられる。

ログイン試行制限の対象

制限する単位には、接続元IPアドレスやユーザーアカウントなどがある。どの単位で制限するかによって、攻撃への効果と正規利用者への影響が異なる。

IPアドレス単位の場合

接続元IPアドレスを基準にする方式では、一定回数以上ログインに失敗したIPアドレスからの試行を一時的に遮断する。

攻撃元のIPアドレスだけを対象として制限できれば、他の接続元からのログインを維持しながら、その攻撃元からの連続した試行を止められる。

ただし、攻撃者が接続元IPアドレスを変更すれば、別の接続元として再び試行できる。

また、同じグローバルIPアドレスを複数の利用者が共有している環境では、一人のログイン失敗によって同じ接続元の利用者が制限を受ける場合がある。

アカウント単位の場合

ユーザーアカウントを基準として一定回数の失敗後にロックする方式では、攻撃者がIPアドレスを変えつつ攻撃を継続することを防げるが、攻撃者が特定のユーザー名に対して意図的に認証を失敗させることで、正規利用者をログインできない状態にする、DoS攻撃に似た攻撃を行える可能性がある。

ログイン試行を制限する機能を選ぶ際は、単純に失敗回数だけを見るのではなく、IPアドレス、アカウント、またはその組み合わせなど、何を基準として制限する仕組みなのかを確認する。

WordPressでの実装

WordPressでは、ログイン試行制限に対応したセキュリティプラグインがある。

単機能のLimit Login Attempts Reloadedのほか、総合セキュリティプラグインであるWordfenceにもログイン試行を制限する機能が用意されている。

すでに総合セキュリティプラグインを導入している場合は、同等の機能が含まれていないか確認し、既存の機能を優先して利用する。

利用するプラグインの公式マニュアルから、制限の判定単位、失敗回数、制限時間、対象となるログイン経路、ロックアウトの解除方法を確認する。

制限回数とロックアウト時間の影響

失敗回数を少なく設定すれば攻撃者が試せるパスワードを減らせるが、入力ミスによって正規利用者が制限されやすくなる。

反対に、多数の失敗を許可すれば正規利用者への影響は小さくなるものの、攻撃者にも多くの試行機会を与える。

一律の回数を安全な基準とせず、管理者の人数やログイン頻度を考慮して設定する。繰り返し制限された接続元に対して制限時間を延長できる場合は、その利用も検討する。

ロックアウト復旧方法の事前確認

設定前に、正規の管理者が制限を受けた場合の復旧方法を確認する。

一定時間で自動的に解除されるのか、別の管理者から解除できるのか、プラグイン側に解除手段が用意されているのかなどを公式マニュアルで確認しておく。

設定後の動作確認

設定後は、意図的に誤ったパスワードを入力し、設定した回数でログイン試行が制限されることを確認する。

IPアドレス単位で制限している場合は、モバイル回線など別の接続元から正常にログインできることも確認する。

最後に、設定した方法で制限を解除できることまで確認しておく。

他の不正アクセス対策との併用

ログイン試行制限だけに依存せず、パスワード自体の強化やMFAなど、認証に対する別の対策も併用する。

参考:パスワードを堅牢に設定し維持する
参考:WordPressにMFA(多要素認証)を実装する