2026年9月30日

2026年9月30日

WordPressで2段階認証(2FA)を強制する方法|プラグイン設定とwp-login.php周りの抜け道対策

WordPressで2段階認証(2FA)を「使える」状態にするのは簡単ですが、管理者や編集者に「必須」として守らせるには、プラグインの強制設定に加えて、wp-login.php 以外のログイン経路を塞ぐことが欠かせません。この記事では、強制設定を持つ代表的なプラグインの選び方、役割ごとに必須化する手順、XML-RPC やアプリケーションパスワードといった抜け道の対策、端末をなくしたときの復旧方法までを説明します。

2FAの強制で押さえる3つのポイント

  1. 誰に強制するか:最低でも管理者、できれば編集者など投稿を公開できる役割。購読者まで強制するかは、会員サイトかどうかで判断します。
  2. 猶予期間をどうするか:いきなり強制すると、設定前のユーザーがログインできなくなります。初回ログイン時に設定を促し、一定期間内に設定しないと操作できなくする流れが一般的です。
  3. 2FAを通らないログイン経路を塞ぐ:wp-login.php に2FAを付けても、XML-RPC やアプリケーションパスワードによるAPI認証は別の経路です。ここを放置すると、パスワードだけで操作できる状態が残ります。

暗号処理を伴う認証の仕組みを自作するのは避け、広く使われていて更新が続いているプラグインを使うのが安全です。

プラグインを選ぶ

2FAを提供するプラグインは多数ありますが、ここでは WordPress.org で公開され、継続的に更新されている代表例を挙げます。機能の範囲や無料版・有料版の分け方、画面の表記はバージョンによって変わるため、導入前に各プラグインの説明ページで確認してください(2026年10月現在)。

  • Two Factor:WordPressのコア貢献者を中心に開発されているプラグインです。認証アプリによるワンタイムコード(TOTP)、メールでのコード、バックアップコードなどに対応します。役割ごとの強制機能は持たないため、強制するには別の仕組みが必要です(後述)。
  • WP 2FA:役割ごとに2FAを必須にする設定や、猶予期間の設定、設定手順を案内する画面を備えています。「強制」を目的にするなら選びやすいプラグインです。
  • Wordfence Login Security:Wordfence のログイン保護部分を単体にしたものです(Wordfence 本体にも同じ機能が含まれます)。役割ごとに2FAを必須にする設定があります。

方式は、認証アプリのTOTPを基本にするのがおすすめです。メールでコードを送る方式は手軽ですが、メールアカウントが乗っ取られると意味をなさなくなります。パスキー(WebAuthn)やセキュリティキーへの対応はプラグインによって差があります。

役割ごとに強制する手順(WP 2FA・Wordfence Login Security の場合)

具体的な項目名はプラグインとバージョンで異なるため、目的ごとに説明します。

  1. バックアップを取り、ステージング環境で試す:本番でいきなり有効化しないでください。
  2. プラグインを有効化し、まず自分の管理者アカウントに2FAを設定する:設定中のブラウザとは別に、もう1つのブラウザでログインしたままにしておくと、失敗しても戻れます。
  3. バックアップコードを発行して保管する:端末をなくしたときの入り口です。パスワード管理ツールなど、サイトとは別の安全な場所に保管します。
  4. 強制する役割を選ぶ:管理者、編集者など。全員一律にせず、権限の強い役割から始めると混乱が少なくなります。
  5. 猶予期間を決める:対象ユーザーに事前に告知し、期間内に設定してもらいます。
  6. 別の管理者アカウントで、強制の挙動を確かめる:未設定のユーザーがログインしたときに設定画面へ案内されるか、猶予期間後に操作できなくなるかを確認します。

Two Factor プラグインで管理者に強制する例

Two Factor プラグインには役割ごとの強制設定がないため、mu-plugin で「2FA未設定の管理者は、プロフィール画面以外を開けない」ようにする方法があります。以下は、Two Factor プラグインの Two_Factor_Core::is_user_using_two_factor() を使う例です。プラグインの更新で内部の関数が変わる可能性があるので、導入後とプラグイン更新後に動作を確認してください。

<?php
/**
 * Plugin Name: Require 2FA for administrators (Two Factor)
 * Description: 2FA未設定の管理者を、プロフィール画面へ誘導する
 */
add_action( 'admin_init', function () {
    // Ajax と、Two Factor プラグインが無い場合は何もしない
    if ( wp_doing_ajax() || ! class_exists( 'Two_Factor_Core' ) ) {
        return;
    }
    // 管理者だけを対象にする
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }
    if ( Two_Factor_Core::is_user_using_two_factor( get_current_user_id() ) ) {
        return;
    }
    // 2FAを設定するプロフィール画面は開けるようにする
    global $pagenow;
    if ( 'profile.php' === $pagenow ) {
        return;
    }
    wp_safe_redirect( admin_url( 'profile.php' ) );
    exit;
} );

add_action( 'admin_notices', function () {
    global $pagenow;
    if ( 'profile.php' !== $pagenow || ! class_exists( 'Two_Factor_Core' ) ) {
        return;
    }
    if ( current_user_can( 'manage_options' )
        && ! Two_Factor_Core::is_user_using_two_factor( get_current_user_id() ) ) {
        echo '<div class="notice notice-warning"><p>'
            . esc_html( '管理者は2段階認証の設定が必要です。このページで設定してください。' )
            . '</p></div>';
    }
} );

Two Factor プラグインを停止すると Two_Factor_Core クラスが存在しなくなり、この制限も外れます。締め出し事故を避けるための設計ですが、プラグインが停止されていないかを定期的に確認する必要があります。

wp-login.php 以外のログイン経路を塞ぐ

XML-RPC

xmlrpc.php はユーザー名とパスワードで認証するため、2FAの対象外になりがちです。使っていないなら、xmlrpc_enabled フィルターで認証が必要なメソッドを無効にできます。

add_filter( 'xmlrpc_enabled', '__return_false' );

このフィルターは認証を伴う操作を止めるもので、ピンバックなど一部の機能は残ります。ファイル自体へのアクセスを止めたい場合は、サーバー設定で xmlrpc.php を拒否します。Jetpack やスマートフォンアプリなど、XML-RPC を使う連携がないかを先に確認してください。

アプリケーションパスワード

WordPress 5.6 で追加されたアプリケーションパスワードは、REST API などで使う専用のパスワードで、2FAを通りません。外部サービスとの連携に使っていなければ、無効にしておくと抜け道が減ります。

add_filter( 'wp_is_application_passwords_available', '__return_false' );

連携で使っている場合は、発行したユーザーと用途を管理画面のユーザー編集画面で定期的に見直し、不要なものは取り消します。

ログイン試行の回数制限

2FAがあっても、パスワード自体への総当たり攻撃はサーバーの負荷になり、ワンタイムコードの推測を試みられることもあります。多くの2FAプラグインはコード入力の試行回数を制限していますが、wp-login.php への試行回数制限も併用します。プラグイン(Limit Login Attempts Reloaded など)を使うほか、Nginx なら次のようにサーバー側で制限できます。

# http ブロック:接続元IPごとに1分あたり5リクエストまで
limit_req_zone $binary_remote_addr zone=wplogin:10m rate=5r/m;

# server ブロック
location = /wp-login.php {
    limit_req zone=wplogin burst=5 nodelay;
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;  # 環境に合わせて変更
}

よくあるつまずきと復旧方法

コードが毎回「無効」になる:TOTPは時刻に基づくため、サーバーやスマートフォンの時計がずれていると一致しません。サーバーで時刻同期(NTP)が動いているか、端末の時刻が自動設定になっているかを確認します。

スマートフォンをなくした・機種変更した:保管しておいたバックアップコードでログインし、新しい端末で設定し直します。ほかの管理者がいれば、ユーザー編集画面からそのユーザーの2FAを解除できるプラグインが多いです。

管理者全員が入れなくなった:最後の手段として、FTP・SFTP・SSHで wp-content/plugins/ 内の2FAプラグインのフォルダ名を変える(例:two-factor を two-factor.off に)と、プラグインが停止して通常のログインに戻ります。WP-CLIが使えるなら wp plugin deactivate two-factor でも停止できます(スラッグはプラグインに合わせて変えてください)。この間は全ユーザーの2FAが外れるので、ログインできたらすぐにフォルダ名を戻して有効化し直します。

セキュリティと個人情報の注意

  • ワンタイムコードやTOTPの秘密鍵(QRコードの中身)を、ログやチャットに残さない
  • バックアップコードはサイトとは別の場所に、他人が見られない形で保管する
  • メールや電話番号を2FAに使う場合、それらは個人情報です。利用目的をプライバシーポリシーに記載しておきます
  • 管理者アカウントは必要な人数だけにし、退職者などのアカウントは速やかに削除または権限を下げる

まとめ

  • 2FAの強制は「誰に・いつから・どの経路まで」を決めてから設定する
  • 役割ごとの強制機能は WP 2FA や Wordfence Login Security が持ち、Two Factor は mu-plugin などで補う
  • XML-RPC とアプリケーションパスワードは2FAを通らないので、使わないなら無効化する
  • wp-login.php とコード入力の試行回数を制限する
  • バックアップコードの保管と、FTPやWP-CLIでプラグインを止める復旧手順を事前に確認しておく

お気軽にご相談ください

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