2026年6月25日
2026年6月25日
WordPressの二要素認証(2FA)を全ユーザーに強制する方法
はじめに
二要素認証(2FA)はパスワードが漏洩しても不正ログインを防ぐ最も効果的な対策です。WordPressではプラグインで簡単に導入でき、管理者・編集者など重要なロールのユーザーに強制適用することでサイト全体のセキュリティを大幅に向上させます。
症状・原因
- パスワードが漏洩して不正ログインされた
- フィッシング攻撃でパスワードを騙し取られた
- チームメンバーが2FAを設定していない
- 管理者ロールのユーザーに2FAを強制したい
解決手順
ステップ1:Two Factor プラグインをインストールする
# Two Factor プラグインをインストール・有効化
wp plugin install two-factor --activate
# または WP 2FA プラグインをインストール
wp plugin install wp-2fa --activate
# プラグインの状態確認
wp plugin status two-factor
Two Factor プラグインで使える認証方式:
- TOTP(Google Authenticator・Authy 等のアプリ)← 推奨
- メール(ワンタイムコードをメールで送信)
- FIDO U2F(YubiKey 等のハードウェアキー)
- バックアップコード(緊急時用)
ステップ2:ユーザー自身が 2FA を設定する
ユーザーが 2FA を設定する手順:
1. WordPress 管理画面にログイン
2. ユーザー → プロフィール を開く
3. 「Two-Factor Options」セクションまでスクロール
4. 「Time Based One-Time Password (TOTP)」を有効化
5. QR コードをスマートフォンの認証アプリでスキャン:
- Google Authenticator(iOS/Android)
- Authy(iOS/Android/デスクトップ)
- Microsoft Authenticator
6. 認証アプリに表示された6桁コードを入力して確認
7. バックアップコードを生成してダウンロード(安全な場所に保管)
8. 「プロフィールを更新」をクリック
ステップ3:管理者ロールに 2FA を強制する
// functions.php: 2FA 未設定の管理者を設定ページにリダイレクト
add_action('admin_init', function(): void {
// AJAX リクエストは除外
if (defined('DOING_AJAX') && DOING_AJAX) return;
// CLI は除外
if (defined('WP_CLI') && WP_CLI) return;
$user = wp_get_current_user();
if (!$user->exists()) return;
// 強制対象ロールを定義
$enforced_roles = ['administrator', 'editor'];
$user_roles = (array) $user->roles;
if (empty(array_intersect($user_roles, $enforced_roles))) return;
// Two Factor プラグインが有効かチェック
if (!class_exists('Two_Factor_Core')) return;
// 2FA が設定されているか確認
$providers = Two_Factor_Core::get_enabled_providers_for_user($user);
if (!empty($providers)) return;
// プロフィールページ以外にいる場合はリダイレクト
$current_page = $_GET['page'] ?? '';
$current_file = basename($_SERVER['PHP_SELF'] ?? '');
if ($current_file !== 'profile.php') {
wp_redirect(admin_url('profile.php#two-factor-options'));
exit;
}
});
// 2FA 未設定ユーザーに管理画面の上部に警告を表示
add_action('admin_notices', function(): void {
$user = wp_get_current_user();
if (!$user->exists()) return;
$enforced_roles = ['administrator', 'editor'];
if (empty(array_intersect((array) $user->roles, $enforced_roles))) return;
if (!class_exists('Two_Factor_Core')) return;
$providers = Two_Factor_Core::get_enabled_providers_for_user($user);
if (!empty($providers)) return;
echo '<div class="notice notice-error">';
echo '<p><strong>セキュリティ警告:</strong> 二要素認証(2FA)が設定されていません。';
echo ' <a href="' . admin_url('profile.php#two-factor-options') . '">今すぐ設定する</a></p>';
echo '</div>';
});
ステップ4:全ロールへの 2FA 適用状況を管理する
// functions.php: 2FA 適用状況ダッシュボードウィジェット
add_action('wp_dashboard_setup', function(): void {
if (!current_user_can('manage_options')) return;
wp_add_dashboard_widget(
'2fa_status_widget',
'二要素認証(2FA)の適用状況',
'render_2fa_status_widget'
);
});
function render_2fa_status_widget(): void {
if (!class_exists('Two_Factor_Core')) {
echo '<p>Two Factor プラグインが有効ではありません。</p>';
return;
}
$roles = ['administrator', 'editor', 'author'];
echo '<table style="width:100%;border-collapse:collapse">';
echo '<tr><th style="text-align:left">ロール</th><th>総数</th><th>2FA設定済み</th><th>未設定</th></tr>';
foreach ($roles as $role) {
$users = get_users(['role' => $role]);
$with_2fa = 0;
foreach ($users as $user) {
$providers = Two_Factor_Core::get_enabled_providers_for_user($user);
if (!empty($providers)) $with_2fa++;
}
$without_2fa = count($users) - $with_2fa;
$color = $without_2fa > 0 ? '#d63638' : '#00a32a';
echo "<tr>";
echo "<td>{$role}</td>";
echo "<td style='text-align:center'>" . count($users) . "</td>";
echo "<td style='text-align:center;color:#00a32a'>{$with_2fa}</td>";
echo "<td style='text-align:center;color:{$color}'>{$without_2fa}</td>";
echo "</tr>";
}
echo '</table>';
}
ステップ5:2FA 未設定ユーザーに一括メール通知する
// functions.php: 2FA 未設定ユーザーに週次でリマインドメールを送る
add_action('wp', function(): void {
if (!wp_next_scheduled('weekly_2fa_reminder')) {
wp_schedule_event(time(), 'weekly', 'weekly_2fa_reminder');
}
});
add_action('weekly_2fa_reminder', function(): void {
if (!class_exists('Two_Factor_Core')) return;
$enforced_roles = ['administrator', 'editor', 'author'];
$users = get_users(['role__in' => $enforced_roles]);
foreach ($users as $user) {
$providers = Two_Factor_Core::get_enabled_providers_for_user($user);
if (!empty($providers)) continue;
wp_mail(
$user->user_email,
'[WordPress] 二要素認証(2FA)の設定をお願いします',
"こんにちは {$user->display_name} さん、\n\n"
. "セキュリティ強化のため、二要素認証(2FA)の設定をお願いしています。\n\n"
. "設定方法:\n"
. "1. スマートフォンに「Google Authenticator」アプリをインストール\n"
. "2. 下記URLからプロフィールを開き「Two-Factor Options」を設定\n\n"
. admin_url('profile.php#two-factor-options') . "\n\n"
. "設定についてご不明な点はサイト管理者にお問い合わせください。"
);
}
});
注意事項
- 2FAを強制する前に、必ず自分のアカウントで2FAが正常に動作することを確認してください。2FAが機能しない状態でリダイレクトを設定すると管理画面から締め出されます
- バックアップコードは印刷または安全なパスワードマネージャーに保管してください。スマートフォンを紛失した場合の唯一の復旧手段です
- WP-CLIやREST API経由のアクセスは2FAの対象外です。APIキーや
application_passwordsを使ったアクセスには別途制限が必要です
まとめ
2FAの全ユーザー強制は①wp plugin install two-factorでTOTP認証プラグインを導入、②ユーザーがプロフィールページのQRコードをGoogle Authenticatorでスキャンして設定、③admin_initフックで管理者・編集者ロールの2FA未設定者をプロフィールページにリダイレクト、④ダッシュボードウィジェットでロール別の適用状況を可視化、⑤weekly_2fa_reminder cronで未設定ユーザーに毎週リマインドメールを送信します。