2026年5月28日

2026年5月28日

WordPressに二要素認証(2FA)を導入する方法|Two Factorプラグインの設定と管理者への必須化

WordPressの二要素認証(2FA)は、パスワードに加えて「スマートフォンの認証アプリに表示される6桁のコード」などを求める仕組みです。パスワードが漏れても、2つ目の要素がなければログインできません。この記事では、WordPress.orgで公開されているTwo Factorプラグインを使って2FAを導入し、管理者アカウントには2FAを必須にする方法と、ロックアウトしたときの復旧手順を説明します。内容は2026年10月時点のTwo Factor 0.17.0に基づいています。

二要素認証の仕組み

よく使われるのは、TOTP(Time-based One-Time Password、RFC 6238)という方式です。

  1. 初回設定時に、サイトとスマートフォンの認証アプリ(Google Authenticator、Authy、1Passwordなど)が同じ秘密鍵を共有します。QRコードを読み取るのはこのためです。
  2. ログインのたびに、サイトと認証アプリが「秘密鍵」と「現在時刻(30秒単位)」から同じ6桁のコードを計算します。
  3. 入力されたコードとサイト側で計算したコードが一致すれば、2つ目の認証が通ります。

時刻をもとに計算するため、サーバーの時計が大きくずれているとコードが一致しません。Linuxのサーバーなら timedatectl で「System clock synchronized: yes」になっているか確認してください。

自作せずプラグインを使う理由

authenticate フィルターと自作のTOTP計算で2FAを作る例を見かけますが、ログイン処理を安全に組むのは見た目より難しい作業です。たとえば次の点をすべて正しく扱う必要があります。

  • パスワード確認後、2つ目の要素が通るまでログインCookieを発行しない
  • コード入力画面を表示し、一時的なトークン(nonce)で本人を照合する
  • コードの総当たりを防ぐ回数制限
  • REST APIやXML-RPCで、パスワードだけのログインが抜け道にならないようにする
  • 2FAの設定変更時に、本人であることを再確認する

Two Factorプラグインはこれらを実装済みで、WordPressのコア貢献者を含むコミュニティが保守しています。自作するより、このプラグインを入れて、足りない部分をフックで補うほうが安全です。

Two Factorプラグインを導入する

管理画面の「プラグイン」→「新規プラグインを追加」で「Two Factor」を検索し、インストールして有効化します。WP-CLIを使う場合は次のとおりです。

wp plugin install two-factor --activate

2026年10月時点で使える認証方法(プロバイダー)は次のとおりです。

認証方法 内容
Authenticator App(TOTP) 認証アプリに表示される6桁のコード。推奨
Backup Codes 1回だけ使える予備コード(既定で10個)。推奨
Email Codes ユーザーのメールアドレスに届くコード
Dummy Method 動作確認用。WP_DEBUG が有効なときだけ表示される

以前あったFIDO U2Fは削除されました。パスキーやハードウェアキーを使う場合は、別プラグインのTwo-Factor Provider: WebAuthnを追加します。

ユーザーごとに2FAを設定する

Two Factorは、ユーザーが自分のプロフィール画面で設定する方式です。有効化しただけでは、誰のログインも変わりません。

  1. 「ユーザー」→「プロフィール」を開きます。
  2. 「Two-Factor Options」欄(翻訳状況により日本語で表示されます)までスクロールします。
  3. 「Authenticator App」を有効にし、表示されたQRコードを認証アプリで読み取ります。アプリに表示された6桁のコードを入力して確認します。
  4. 「Backup Codes」を有効にし、予備コードを生成します。コードはこのときしか表示されないので、パスワード管理ツールなど安全な場所に保存します。
  5. 複数の方法を有効にした場合は、主に使う方法(primary)を選びます。
  6. 「プロフィールを更新」をクリックして保存します。

設定後に一度ログアウトし、パスワードのあとにコード入力画面が表示されること、認証アプリのコードでログインできることを確かめてください。コード入力画面には、予備コードなど他の方法に切り替えるリンクも表示されます。

管理者は「ユーザー」→「ユーザー一覧」から他のユーザーの編集画面を開き、同じ欄で設定を変更できます。サイト全体で特定の認証方法を使わせたくない場合は、「設定」→「Two-Factor」で無効にできます。

2FAを有効にしたユーザーは、REST APIやXML-RPCで通常のパスワードを使ってログインできなくなります。外部ツールから接続する場合は、プロフィール画面で「アプリケーションパスワード」を発行して使います。

管理者に2FAを必須にする

Two Factorには、ロールごとに2FAを必須にする設定画面はありません(プラグインのFAQでも、開発者がフィルターで対応する方法が案内されています)。そこで、two_factor_enabled_providers_for_user フィルターを使い、2FAを何も設定していない管理者には、メールでのコード送信(Two_Factor_Email)を強制的に有効にします。メールのプロバイダーは事前の設定が不要なので、この方法で必須化できます。

このフィルターの第1引数は「有効なプロバイダーのクラス名の配列」、第2引数は「ユーザーID(整数)」です。WP_User オブジェクトではない点に注意してください。

wp-content/mu-plugins/require-2fa-admin.php として保存します(mu-pluginsは管理画面から停止できないため、必須化の設定に向いています)。

<?php
/**
 * Plugin Name: Require 2FA for administrators
 * Description: Two Factor プラグインで、2FA未設定の管理者にメールコードを強制する
 */

add_filter(
	'two_factor_enabled_providers_for_user',
	function ( $enabled_providers, $user_id ) {
		if ( ! empty( $enabled_providers ) ) {
			return $enabled_providers; // 本人が設定済みならそのまま
		}

		$user = get_userdata( $user_id );
		if ( $user && in_array( 'administrator', (array) $user->roles, true ) ) {
			$enabled_providers[] = 'Two_Factor_Email';
		}

		return $enabled_providers;
	},
	10,
	2
);

導入するときは、次の点を確認してください。

  • メールが届くこと: 管理者のメールアドレスにコードが届かないと、ログインできなくなります。先にWP Mail SMTPなどで送信を安定させ、テスト送信で届くことを確認します。
  • メールのプロバイダーを無効にしていないこと: 「設定」→「Two-Factor」でEmail Codesを無効にしていると、このコードは効きません。
  • 別のブラウザで試す: 管理画面にログインしたまま、別のブラウザ(またはプライベートウィンドウ)でログインを試し、コードがメールで届くことを確認してから、元のセッションを閉じます。
  • 認証アプリへの移行を促す: メールは乗っ取られると2つ目の要素として機能しません。管理者には、ログイン後に認証アプリと予備コードを設定してもらうのが理想です。設定済みのユーザーには、このフィルターは何もしません。

他のロール(編集者など)にも広げる場合は、in_array() の条件を変更します。ロール単位で必須化できるプラグインを使う方法は、WordPressで2FAを必須化するプラグインの設定を参照してください。

WP-CLIで状態を確認・変更する

Two Factor 0.17.0から、wp two-factor コマンドが使えます。ユーザーはID・ログイン名・メールアドレスのどれでも指定できます。

# 2FAの状態を確認
wp two-factor status admin

# 登録されているプロバイダーの一覧
wp two-factor list-providers

# メールでのコードを有効にする
wp two-factor enable admin Two_Factor_Email

# 予備コードを作り直す(既存のコードは無効になる)
wp two-factor backup-codes generate admin

TOTPのように秘密鍵の共有が必要な方法は、WP-CLIからは有効にできません。本人がプロフィール画面で設定します。

なお、2FAの有効・無効は、ユーザーメタ _two_factor_enabled_providers(有効なプロバイダーの配列)で判定されます。_two_factor_provider は「主に使う方法」を記録するだけなので、これだけを書き換えても2FAは有効になりません。設定の変更は、上のコマンドかプロフィール画面で行ってください。

ロックアウトしたときの復旧

認証アプリの入ったスマートフォンをなくした、予備コードも見つからない、といった場合の復旧方法です。

予備コードがある場合: コード入力画面のリンクから予備コードでの認証に切り替えてログインし、2FAを設定し直します。

別の管理者がいる場合: その管理者が「ユーザー」→「ユーザー一覧」から該当ユーザーを編集し、「Two-Factor Options」で有効になっている方法のチェックを外して「ユーザーを更新」をクリックします。

サーバーにSSHで入れる場合: WP-CLIで2FAの設定をリセットします。

# すべての2FA設定をリセット(確認を省略)
wp two-factor disable admin --yes

# 認証アプリだけを無効にする
wp two-factor disable admin Two_Factor_Totp

# 入力ミスによるログインの一時制限だけを解除する
wp two-factor unlock admin

wp two-factor コマンドがない古いバージョンでは、ユーザーメタを削除してリセットします。作業前にデータベースのバックアップを取ってください。

wp db export before-2fa-reset.sql
wp user meta delete admin _two_factor_enabled_providers
wp user meta delete admin _two_factor_provider

前の節の必須化コードを入れている場合、リセットしても管理者にはメールのコードが求められます。メールが届かないことが原因なら、mu-plugins からファイルを一時的に移動してからログインしてください。

まとめ

  • 2FAは、パスワードに加えて認証アプリのコードなどを求める仕組み。TOTPはサーバーの時刻が正確であることが前提
  • ログイン処理の自作は抜け道を作りやすい。公式コミュニティ製のTwo Factorプラグインを使い、足りない部分をフックで補う
  • 各ユーザーが「プロフィール」で認証アプリと予備コードを設定する。予備コードは安全な場所に保存する
  • 管理者への必須化は、two_factor_enabled_providers_for_user(第2引数はユーザーID)でメールのコードを強制する方法がある。メールが届くことを先に確認する
  • 状態の確認や復旧は wp two-factor status と wp two-factor disable。_two_factor_provider だけを書き換えても2FAは有効にならない

ログインの保護は2FAだけでなく、総当たり攻撃への対策と組み合わせると効果が上がります。WordPressのブルートフォース攻撃対策もあわせて確認してください。

お気軽にご相談ください

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