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で再登録防止、の順で対処します。