2026年5月20日
2026年5月20日
WordPressのログイン試行回数を制限する方法
はじめに
WordPressはデフォルトではログイン試行回数に制限がないため、ブルートフォース攻撃(総当たり攻撃)に対して無防備です。試行回数制限を設けることでアカウント乗っ取りリスクを大幅に低減できます。
方法1:プラグインで設定(推奨)
Limit Login Attempts Reloaded が最も広く使われています。
# プラグインをインストール・有効化
wp plugin install limit-login-attempts-reloaded --activate
# 設定は管理画面 → 設定 → Limit Login Attempts から
主な設定項目:
- 許可するログイン失敗回数(推奨: 3〜5回)
- ロックアウト時間(推奨: 20分)
- 長期ロックアウト回数・時間(推奨: 3回失敗で24時間)
方法2:functions.phpでカスタム実装
// functions.php — ログイン失敗をトランジェントで記録
add_filter('authenticate', function($user, $username, $password) {
if (is_wp_error($user)) {
$ip = $_SERVER['REMOTE_ADDR'];
$key = 'login_attempts_' . md5($ip);
$attempts = (int) get_transient($key);
if ($attempts >= 5) {
return new WP_Error('too_many_retries',
'試行回数が多すぎます。20分後に再試行してください。'
);
}
set_transient($key, $attempts + 1, 20 * MINUTE_IN_SECONDS);
}
return $user;
}, 30, 3);
方法3:.htaccessでIP単位のレート制限
# /wp-login.php へのアクセスを特定IPのみ許可
<Files "wp-login.php">
Order deny,allow
Deny from all
Allow from 203.0.113.1 # 自分のIPアドレス
</Files>
方法4:Nginxでレート制限
# nginx.conf でwp-login.phpへのリクエスト数を制限
limit_req_zone $binary_remote_addr zone=wp_login:10m rate=1r/s;
location = /wp-login.php {
limit_req zone=wp_login burst=3 nodelay;
fastcgi_pass php-fpm;
include fastcgi_params;
}
ロックアウトされたIPを解除する
# 特定IPのロックアウトを解除(Limit Login Attempts Reloadedの場合)
wp option get limit_login_lockouts
# トランジェントで実装した場合
wp transient delete login_attempts_{IPのMD5ハッシュ}
# 全ロックアウトをリセット
wp option delete limit_login_lockouts
wp option delete limit_login_lockouts_long
WP-CLIで失敗ログを確認
# ログイン失敗の記録を確認
wp option get limit_login_login_failed_log
注意事項
- 自分のIPアドレスを固定化しておくとロックアウトのリスクを回避できます
- 共用IPアドレス(会社・学校のネットワーク)での制限は慎重に設定してください
- ロックアウト通知メールの設定も合わせて行うことを推奨します
まとめ
最も簡単な方法は Limit Login Attempts Reloaded プラグインの導入です。SSHが使える環境では .htaccess や Nginx でIPホワイトリスト制限を加えることで二重の防御になります。