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プラグインで簡単に導入できます。

お気軽にご相談ください

お見積りへ お問い合わせへ