2026年5月20日
2026年5月20日
WordPressのログインページを保護する方法
はじめに
WordPressのログインページ(wp-login.php)はデフォルトURLが知られているため、ブルートフォース攻撃(総当たり攻撃)の標的になりやすいです。ログインページの保護を強化することで、不正アクセスリスクを大幅に低減できます。
症状・原因
- サーバーログにwp-login.phpへの大量アクセスが記録されている
- WordPressのユーザーが不正にログインされた形跡がある
- ログイン試行によってサーバー負荷が高くなっている
- パスワードが漏洩してもアカウントが守られる仕組みを作りたい
解決手順
ステップ1:ログインページにBasic認証をかける
# .htaccess(wp-login.phpと同じディレクトリ)
# wp-login.php へのアクセスにBasic認証を要求
<Files wp-login.php>
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /var/www/.htpasswd
Require valid-user
</Files>
# wp-admin ディレクトリにも適用
<Directory /var/www/html/wp-admin>
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /var/www/.htpasswd
Require valid-user
</Directory>
# .htpasswd ファイルを作成(htpasswdコマンド)
htpasswd -c /var/www/.htpasswd your_username
# パスワードを入力するプロンプトが表示される
# 既存ファイルにユーザーを追加(-c なし)
htpasswd /var/www/.htpasswd another_user
ステップ2:ログインURLを変更する(プラグイン不使用)
// functions.php
// wp-login.php を別URLにリダイレクト
// ※ この方法はシンプルだが、WP本体更新で上書きされる可能性がある
// プラグイン(WPS Hide Login等)を使う方が安全
add_action('init', function (): void {
// カスタムログインスラッグ(推測されにくい文字列に変更)
$login_slug = 'my-secret-login-2024';
if (isset($_GET[$login_slug])) {
// カスタムURLでアクセスされた場合は wp-login.php を表示
return;
}
// wp-login.php に直接アクセスした場合は404に
if (str_contains($_SERVER['REQUEST_URI'] ?? '', 'wp-login.php')
&& !is_user_logged_in()) {
wp_die('Not Found', 404);
}
});
ステップ3:IPアドレスでログインを制限する
# .htaccess: 特定のIPのみログイン可能にする
<Files wp-login.php>
Order Deny,Allow
Deny from all
Allow from 203.0.113.1 # 自社オフィスのIP
Allow from 198.51.100.0/24 # VPNのIPレンジ
</Files>
// functions.php: PHPでIPアドレス制限
add_action('login_init', function (): void {
$allowed_ips = [
'203.0.113.1', // 自社オフィス
'198.51.100.0/24', // VPNレンジ(CIDRは別途チェック関数が必要)
];
$remote_ip = $_SERVER['REMOTE_ADDR'] ?? '';
if (!in_array($remote_ip, $allowed_ips, true)) {
wp_die(
'このIPアドレスからのログインは許可されていません。',
'アクセス拒否',
['response' => 403]
);
}
});
ステップ4:ログイン試行回数を制限する
// functions.php
// ログイン失敗回数をトランジェントで管理
add_filter('authenticate', function (mixed $user, string $username, string $password): mixed {
if (empty($username) || empty($password)) {
return $user;
}
$ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
$key = 'login_fail_' . md5($ip . $username);
$attempts = (int) get_transient($key);
$max = 5;
$lockout = 30 * MINUTE_IN_SECONDS;
if ($attempts >= $max) {
return new WP_Error(
'too_many_retries',
sprintf(
'ログイン試行回数の上限(%d回)に達しました。%d分後に再試行してください。',
$max,
$lockout / MINUTE_IN_SECONDS
)
);
}
return $user;
}, 30, 3);
// ログイン失敗時にカウントを増やす
add_action('wp_login_failed', function (string $username): void {
$ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
$key = 'login_fail_' . md5($ip . $username);
$cnt = (int) get_transient($key);
set_transient($key, $cnt + 1, 30 * MINUTE_IN_SECONDS);
});
// ログイン成功時にカウントをリセット
add_action('wp_login', function (string $user_login): void {
$ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
$key = 'login_fail_' . md5($ip . $user_login);
delete_transient($key);
});
ステップ5:二段階認証を有効にする
二段階認証の設定方法(プラグイン使用):
推奨プラグイン: WP 2FA(無料)または Google Authenticator
WP 2FAの設定手順:
1. プラグイン → 新規追加 → "WP 2FA" インストール・有効化
2. セットアップウィザードが起動
3. 認証アプリ(Google Authenticator / Authy)を選択
4. ユーザーへの強制設定:
- すべてのユーザー / 管理者のみ を選択
5. スマートフォンのAuthenticatorアプリでQRコードをスキャン
6. 表示された6桁コードで確認
コマンドでの確認:
# ログイン試行のログを確認(Nginx)
tail -f /var/log/nginx/access.log | grep "wp-login.php"
# 失敗ログイン(403/429)を集計
grep "wp-login.php" /var/log/nginx/access.log | grep -E " (403|429) " | awk '{print $1}' | sort | uniq -c | sort -rn | head -20
注意事項
- IPアドレス制限を設ける場合、作業前に自分のIPアドレスを必ず許可リストに追加してください。自分自身がログインできなくなるリスクがあります
- ロックアウト機能を実装する際は、自分自身がロックアウトされた場合の緊急解除手順(データベース直接削除など)を事前に用意してください
- Basic認証はHTTPS環境でのみ安全です。HTTP環境では認証情報が平文で送信されます
まとめ
.htaccess でwp-login.phpにBasic認証をかけ、IPアドレスによるアクセス制限を設定します。PHPでは authenticate フィルターと wp_login_failed アクションでログイン試行回数を制限し、トランジェントでロックアウト状態を管理します。二段階認証はWP 2FAプラグインで簡単に導入できます。