2026年5月20日

2026年5月20日

WordPressの不審なユーザーアカウントを削除する方法

はじめに

WordPressサイトに不正作成されたユーザーアカウントは、スパム投稿・バックドア設置・権限昇格攻撃の踏み台になります。定期的にユーザーリストを確認し、不審なアカウントを早期に発見・削除することが重要です。

症状・原因

  • 見覚えのないユーザーアカウントが大量に登録されている
  • 管理者権限を持つ不明なアカウントが増えている
  • ユーザー登録のメール通知が大量に届くようになった
  • スパムコメントや不審な投稿が特定ユーザーから投稿されている

解決手順

ステップ1:不審なユーザーを特定する

# 全管理者アカウントを確認
wp user list --role=administrator \
    --fields=ID,user_login,user_email,user_registered \
    --format=table

# 最近登録されたユーザーを確認(30日以内)
wp user list --fields=ID,user_login,user_email,user_registered \
    --format=table | \
    awk -v date="$(date -d '30 days ago' +%Y-%m-%d)" \
    '$4 >= date {print}'

# ユーザー数を役割別に確認
wp user list --role=administrator --format=count
wp user list --role=editor --format=count
wp user list --role=subscriber --format=count

# 全ユーザーをCSVでエクスポートして確認
wp user list --fields=ID,user_login,user_email,user_registered,roles \
    --format=csv > /tmp/wp_users_$(date +%Y%m%d).csv
# データベースで不審なパターンを直接検索
wp db query "
SELECT u.ID, u.user_login, u.user_email, u.user_registered,
       m.meta_value as capabilities
FROM wp_users u
JOIN wp_usermeta m ON u.ID = m.user_id
WHERE m.meta_key = 'wp_capabilities'
  AND (m.meta_value LIKE '%administrator%'
       OR m.meta_value LIKE '%editor%')
ORDER BY u.user_registered DESC
LIMIT 30"

# メールドメインが不審なユーザーを検索(フリーメール・使い捨てドメイン等)
wp db query "
SELECT ID, user_login, user_email, user_registered
FROM wp_users
WHERE user_email LIKE '%@mailinator.com'
   OR user_email LIKE '%@guerrillamail%'
   OR user_email LIKE '%@temp-mail%'
   OR user_email REGEXP '^[a-z]{8,}@[a-z]{5,}\.(com|net|org)$'
ORDER BY user_registered DESC
LIMIT 50"

ステップ2:不審なユーザーを削除する

# 個別削除(投稿を既存管理者に移譲)
wp user delete {SUSPICIOUS_ID} --reassign=1

# 複数IDを一括削除
wp user delete 42 43 44 45 --reassign=1

# 役割がsubscriberで登録日が古いユーザーを一括削除
# ※ 本当に不要か確認してから実行
wp user list --role=subscriber --format=ids \
    --fields=ID | \
    xargs wp user delete --reassign=1

# メールが未確認のユーザーを削除(プラグインが必要な場合もある)
wp db query "
DELETE FROM wp_users
WHERE ID IN (
    SELECT user_id FROM wp_usermeta
    WHERE meta_key = 'activation_key'
    AND meta_value != ''
)"
// functions.php: 不審なユーザーを自動的にブロック
add_action('user_register', function(int $user_id): void {
    $user = get_userdata($user_id);
    $email = $user->user_email;

    // 使い捨てメールドメインをブロック
    $blocked_domains = [
        'mailinator.com', 'guerrillamail.com', 'temp-mail.org',
        'throwaway.email', 'yopmail.com', 'sharklasers.com',
    ];

    $domain = substr(strrchr($email, '@'), 1);
    if (in_array($domain, $blocked_domains, true)) {
        // ユーザーを削除
        require_once ABSPATH . 'wp-admin/includes/user.php';
        wp_delete_user($user_id);
        wp_die('このメールアドレスでの登録はできません。');
    }
});

ステップ3:不正な管理者権限の昇格を防ぐ

# 管理者アカウントの変更を監視するフックを追加
# → functions.php に実装(ステップ4参照)

# 現在の管理者一覧を記録(定期確認用)
wp user list --role=administrator \
    --fields=ID,user_login,user_email,user_registered \
    --format=table > /tmp/admin_list_$(date +%Y%m%d).txt

# 管理者権限を持つべきでないユーザーを降格
wp user set-role {USER_ID} editor
# または
wp user set-role {USER_ID} subscriber
// functions.php: 管理者ロールの変更を検知してメール通知
add_action('set_user_role', function(
    int $user_id,
    string $role,
    array $old_roles
): void {
    if ($role !== 'administrator') return;

    $user = get_userdata($user_id);
    $admin_email = get_option('admin_email');

    wp_mail(
        $admin_email,
        '[警告] 管理者権限が付与されました: ' . get_bloginfo('name'),
        sprintf(
            "ユーザー %s (%s) に管理者権限が付与されました。\n日時: %s\nサイト: %s",
            $user->user_login,
            $user->user_email,
            current_time('Y-m-d H:i:s'),
            home_url()
        )
    );
}, 10, 3);

ステップ4:新規ユーザー登録を制限する

// wp-config.php または functions.php
// ユーザー登録を完全に無効化
// WordPress管理画面 → 設定 → 一般 → 「だれでもユーザー登録できる」のチェックを外す

// functions.php: 登録ページへのアクセスをブロック
add_action('init', function(): void {
    // 登録が無効の場合、wp-login.php?action=register をブロック
    if (
        isset($_GET['action']) &&
        $_GET['action'] === 'register' &&
        !get_option('users_can_register')
    ) {
        wp_redirect(home_url('/'));
        exit;
    }
});

// REST API 経由のユーザー作成をブロック(管理者以外)
add_filter('rest_pre_insert_user', function($prepared_user, $request) {
    if (!current_user_can('create_users')) {
        return new WP_Error(
            'rest_forbidden',
            'ユーザーを作成する権限がありません。',
            ['status' => 403]
        );
    }
    return $prepared_user;
}, 10, 2);
# wp-login.php の登録URLへのアクセスを .htaccess でブロック
cat >> /var/www/html/.htaccess << 'EOF'
# ユーザー登録ページをブロック
<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} ^action=register [NC]
RewriteRule ^wp-login\.php$ - [F,L]
</IfModule>
EOF

ステップ5:ユーザー登録のスパム対策

# reCAPTCHA 付き登録フォームプラグインをインストール
wp plugin install advanced-nonce --activate

# または Contact Form 7 + reCAPTCHA で登録フォームを作成

# Wordfence のブルートフォース対策を有効化
wp plugin install wordfence --activate
// functions.php: 登録時にメール確認を必須にする
add_filter('registration_errors', function(
    WP_Error $errors,
    string $sanitized_user_login,
    string $user_email
): WP_Error {
    // 日本語以外のユーザー名をブロック(オプション)
    if (preg_match('/[^\x20-\x7E]/', $sanitized_user_login) === 0
        && strlen($sanitized_user_login) < 4) {
        $errors->add('invalid_username', '4文字以上のユーザー名を入力してください。');
    }
    return $errors;
}, 10, 3);

注意事項

  • ユーザーを削除する前に、そのユーザーが作成した投稿・コメントを確認し、必要に応じて別のユーザーに移譲してください
  • wp user delete--reassign オプションをつけないと、そのユーザーの投稿が削除されます
  • WooCommerceを使用している場合、顧客ユーザー(Customerロール)は注文データと紐付いているため、慎重に処理してください

まとめ

不審ユーザーの対処は①wp user list --role=administratorで管理者一覧を確認、②wp db queryで使い捨てメールドメインや不審パターンを検索、③wp user delete {ID} --reassign=1で削除、④set_user_roleフックで管理者昇格をメール通知、⑤登録ページのブロック・reCAPTCHA導入・Wordfenceで再登録防止、の順で対処します。

お気軽にご相談ください

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