2026年5月20日
2026年5月20日
WordPressのセキュリティ対策の基本チェックリスト
はじめに
WordPressはWebサイトの43%以上で利用されているため、攻撃者の標的になりやすいCMSです。基本的なセキュリティ対策を体系的に実施することで、大多数の攻撃を防ぐことができます。このチェックリストで自サイトのセキュリティ状態を確認してください。
症状・原因
- サイトが改ざんされてスパムコンテンツが表示されている
- 不正なログイン試行のメール通知が大量に届いている
- Googleサーチコンソールでマルウェア警告が表示された
- どこから手をつければよいかわからない
解決手順
ステップ1:管理者アカウントのセキュリティ
【チェックリスト】
✅ ユーザー名が "admin" や "administrator" でない
✅ パスワードが20文字以上の強力なパスワード
✅ 管理者アカウントのメールが有効で確認済み
✅ 二段階認証(2FA)が有効
✅ 不要な管理者アカウントが削除されている
✅ ユーザーロールが最小権限(投稿者に管理者権限を与えていない)
# 管理者ユーザーの一覧を確認
wp user list --role=administrator --fields=ID,user_login,user_email
# "admin" ユーザーが存在しないか確認
wp user get admin 2>/dev/null && echo "WARNING: admin user exists"
# 最後のログイン日時を確認(プラグインが必要)
wp user list --format=table --fields=ID,user_login,user_registered
// functions.php: ユーザー名の列挙を防ぐ
// ?author=1 での作者ページへのリダイレクトを防止
add_action('template_redirect', function(): void {
if (is_author() && !is_admin()) {
wp_redirect(home_url('/'), 301);
exit;
}
});
// REST API からのユーザー名露出を防ぐ
add_filter('rest_endpoints', function(array $endpoints): array {
if (isset($endpoints['/wp/v2/users'])) {
unset($endpoints['/wp/v2/users']);
}
if (isset($endpoints['/wp/v2/users/(?P<id>[\d]+)'])) {
unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);
}
return $endpoints;
});
ステップ2:wp-config.phpのセキュリティ設定
// wp-config.php: セキュリティ強化設定
// ① 認証キーとソルトを強力なものに設定
// https://api.wordpress.org/secret-key/1.1/salt/ から生成
define('AUTH_KEY', 'ランダムな文字列...');
define('SECURE_AUTH_KEY', 'ランダムな文字列...');
// ... (8つのキー)
// ② WordPress 管理画面での編集を無効化
define('DISALLOW_FILE_EDIT', true);
// ③ プラグイン・テーマの自動更新をブロック(手動管理する場合)
// define('DISALLOW_FILE_MODS', true); // プラグイン/テーマのインストールも不可
// ④ デバッグ情報を本番環境で非表示にする
define('WP_DEBUG', false);
define('WP_DEBUG_LOG', false); // ログも本番では無効
define('WP_DEBUG_DISPLAY', false);
// ⑤ データベーステーブル接頭辞を変更(インストール時が理想)
// $table_prefix = 'wp_'; → 'site1_' などに変更
// ⑥ SSL を強制
define('FORCE_SSL_ADMIN', true);
// ⑦ wp-config.php のパスを上の階層に移動する
// WordPress はデフォルトで1つ上の階層を自動認識する
# wp-config.php のパーミッションを確認・修正
ls -la /var/www/html/wp-config.php
chmod 600 /var/www/html/wp-config.php
# 認証キーをWP-CLIで更新
wp config shuffle-salts
ステップ3:ファイルパーミッションの確認
# WordPress の推奨パーミッション
# ディレクトリ: 755
# ファイル: 644
# wp-config.php: 600
# 一括修正
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
chmod 600 /var/www/html/wp-config.php
# 書き込み権限が必要なディレクトリのみ調整
chmod 755 /var/www/html/wp-content/uploads
chmod 755 /var/www/html/wp-content/cache
# 危険なパーミッションのファイルを検出
find /var/www/html -type f -perm /o+w -name "*.php" | head -20
# .htaccess: wp-config.php と .htaccess 自体へのアクセスをブロック
<Files wp-config.php>
Order Deny,Allow
Deny from all
</Files>
<Files .htaccess>
Order Deny,Allow
Deny from all
</Files>
# PHP ファイルのアップロードディレクトリでの実行を禁止
<Directory /var/www/html/wp-content/uploads>
<FilesMatch "\.php$">
Order Deny,Allow
Deny from all
</FilesMatch>
</Directory>
ステップ4:プラグインとテーマのセキュリティ
# 使用していないプラグインを削除(無効化だけでは不十分)
wp plugin list --status=inactive --format=table
wp plugin delete PLUGIN_NAME
# 使用していないテーマを削除(現在のテーマと親テーマ以外)
wp theme list --status=inactive --format=table
wp theme delete THEME_NAME
# プラグインのバージョンを確認(脆弱性確認)
wp plugin list --format=table --fields=name,version,update
# WordPress コアの整合性を確認
wp core verify-checksums
# プラグインファイルの整合性を確認
wp plugin verify-checksums --all 2>&1 | grep -v "Success"
// functions.php: WordPress バージョン情報を隠す
remove_action('wp_head', 'wp_generator');
add_filter('the_generator', '__return_empty_string');
// RSD リンクを削除
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wlwmanifest_link');
// 不要な機能を無効化
add_filter('xmlrpc_enabled', '__return_false');
ステップ5:バックアップとモニタリング
# 自動バックアップの確認
# → UpdraftPlus / BackWPup / WP-CLI cron での自動バックアップ設定を確認
# バックアップの保存状況を確認
wp eval "
\$backups = glob('/backups/*.sql.gz');
if (empty(\$backups)) {
echo 'WARNING: バックアップが見つかりません' . PHP_EOL;
} else {
echo '最新バックアップ: ' . date('Y-m-d H:i:s', filemtime(end(\$backups))) . PHP_EOL;
echo 'バックアップ数: ' . count(\$backups) . PHP_EOL;
}
"
# セキュリティプラグインのインストール状況を確認
wp plugin is-installed wordfence && echo "Wordfence: installed" || echo "Wordfence: NOT installed"
# HTTPS の確認
wp option get siteurl | grep -q "^https" && echo "HTTPS: OK" || echo "WARNING: HTTP only"
// functions.php: セキュリティヘッダーを追加
add_action('send_headers', function(): void {
header('X-Frame-Options: SAMEORIGIN');
header('X-Content-Type-Options: nosniff');
header('X-XSS-Protection: 1; mode=block');
header('Referrer-Policy: strict-origin-when-cross-origin');
// HTTPS のみの場合
if (is_ssl()) {
header('Strict-Transport-Security: max-age=31536000; includeSubDomains');
}
});
注意事項
DISALLOW_FILE_MODS = trueを設定するとWordPress管理画面からプラグイン・テーマのインストール・更新・削除が一切できなくなります。本番環境での操作はWP-CLI経由になるため、運用フローを確認してから設定してください- ファイルパーミッション変更後は、Webサーバーがファイルを読み込めるかテストしてから本番環境に適用してください。誤ったパーミッションはサイトの表示を壊します
- セキュリティ対策は「実施して終わり」ではなく継続的なモニタリングが重要です。Wordfenceなどのプラグインのアラートを定期的に確認してください
まとめ
WordPressのセキュリティ強化は①管理者ユーザー名変更・強力なパスワード・2FA、②wp-config.phpでのDISALLOW_FILE_EDIT・デバッグ無効化・SSL強制、③ファイルパーミッション(ディレクトリ755・ファイル644・wp-config 600)、④使用していないプラグイン・テーマの削除・コア整合性確認、⑤自動バックアップとWordfenceでのモニタリング、の5分野を体系的に対策します。