2026年5月20日
2026年5月20日
WordPressのwp-config.phpのセキュリティキーを再生成する方法
はじめに
WordPressの認証キー・ソルトはログインセッションやCookieの暗号化に使われます。不正アクセスが発覚した場合や定期的なセキュリティメンテナンスとして再生成することで、既存の全セッションを無効化し攻撃者を強制ログアウトさせます。
症状・原因
- 不正アクセスが発覚し、攻撃者のセッションを無効化したい
- セキュリティスキャンで「認証キーがデフォルト値のままです」と指摘された
- wp-config.phpのSALT値が長期間変更されていない
- サイト移行後に認証キーを更新したい
解決手順
ステップ1:現在の認証キーの状態を確認する
# 現在の認証キーを確認(値の存在確認のみ)
wp config list --fields=name,value | grep -E "KEY|SALT"
# キーが正しく設定されているか確認
wp config get AUTH_KEY | wc -c
# 64文字以上あれば適切(デフォルトは "put your unique phrase here")
# キーがデフォルト値のままか確認
grep "put your unique phrase here" /var/www/html/wp-config.php
# 何も出力されなければOK(デフォルト値が残っていない)
# wp-config.php の最終更新日時を確認
stat -c "%y %n" /var/www/html/wp-config.php
ステップ2:WP-CLIで認証キーを再生成する(最も簡単)
# 認証キー・ソルトを一括再生成(全セッションが即座に無効化される)
wp config shuffle-salts
# 特定のキーのみ更新
wp config shuffle-salts AUTH_KEY SECURE_AUTH_KEY
# 更新後に確認
wp config get AUTH_KEY
# 更新後の動作確認
# ・全ての管理者・ユーザーがログアウトされることを確認
# ・再ログインできることを確認
# ・フロントエンドが正常に表示されることを確認
ステップ3:手動で認証キーを更新する
# WordPress公式のAPIでキーを生成
curl -s https://api.wordpress.org/secret-key/1.1/salt/
# 出力例:
# define('AUTH_KEY', 'x&!...');
# define('SECURE_AUTH_KEY', 'y@#...');
# ...(8行)
# 生成されたキーをwp-config.phpに貼り付ける
# 既存の8行を新しい8行で置き換える
// wp-config.php: 認証キー・ソルトの設定例
// ※ 以下は例示のため、実際は api.wordpress.org/secret-key から生成した値を使用
define('AUTH_KEY', 'ランダムな文字列60文字以上...');
define('SECURE_AUTH_KEY', 'ランダムな文字列60文字以上...');
define('LOGGED_IN_KEY', 'ランダムな文字列60文字以上...');
define('NONCE_KEY', 'ランダムな文字列60文字以上...');
define('AUTH_SALT', 'ランダムな文字列60文字以上...');
define('SECURE_AUTH_SALT', 'ランダムな文字列60文字以上...');
define('LOGGED_IN_SALT', 'ランダムな文字列60文字以上...');
define('NONCE_SALT', 'ランダムな文字列60文字以上...');
ステップ4:全セッションを確実に無効化する
# 認証キー更新後は全セッションが自動的に無効化されるが
# 念のためデータベースのセッションデータも削除
wp eval "
global \$wpdb;
\$deleted = \$wpdb->query(\"DELETE FROM {\$wpdb->usermeta} WHERE meta_key = 'session_tokens'\");
echo \"Deleted session records: \" . \$deleted . PHP_EOL;
"
# 全ユーザーのセッションをより完全にクリア
wp eval "
\$users = get_users(['fields' => 'ID']);
foreach (\$users as \$user_id) {
\$manager = WP_Session_Tokens::get_instance(\$user_id);
\$manager->destroy_all();
}
echo 'All sessions destroyed for ' . count(\$users) . ' users' . PHP_EOL;
"
ステップ5:定期的な更新スケジュールを設定する
// functions.php: 月次で認証キーを自動更新する
// ※ wp-config.phpの書き込み権限が必要
add_action('monthly_security_maintenance', function(): void {
// WP-CLI が使える環境でのみ実行
if (!defined('WP_CLI') || !WP_CLI) {
// cron ジョブから呼ぶ場合
exec('wp --path=' . ABSPATH . ' config shuffle-salts 2>&1', $output);
error_log('Security keys rotated: ' . implode(', ', $output));
}
});
// カスタム cron スケジュールを追加
add_filter('cron_schedules', function(array $schedules): array {
$schedules['monthly'] = [
'interval' => 30 * DAY_IN_SECONDS,
'display' => '月次',
];
return $schedules;
});
// cron イベントを登録
if (!wp_next_scheduled('monthly_security_maintenance')) {
wp_schedule_event(time(), 'monthly', 'monthly_security_maintenance');
}
# サーバーのcronで月次更新を設定する方法(より確実)
# /etc/cron.d/wp-security-keys
# 毎月1日の午前2時に実行
echo "0 2 1 * * www-data wp --path=/var/www/html config shuffle-salts --allow-root 2>&1 | logger -t wp-security" \
> /etc/cron.d/wp-security-keys
# 実行確認
sudo crontab -l -u www-data
注意事項
wp config shuffle-saltsを実行すると、サイトに現在ログインしている全ユーザー(管理者を含む)が即座にログアウトされます。重要な作業中は実行タイミングに注意してください- 認証キーを更新しても、「セッションが永続化されるプラグイン」が使用されている場合はそのプラグインのセッションが残ることがあります。
WP_Session_Tokens::destroy_all()で確実に削除してください - WooCommerceを使用している場合、顧客のショッピングカートのデータがCookieに保存されているため、認証キー更新後にカートが空になる場合があります
まとめ
認証キー再生成は①grep "put your unique phrase here"でデフォルト値が残っていないか確認、②wp config shuffle-saltsで全8キーを一括再生成(これで全セッションが無効化)、③WP_Session_Tokens::destroy_all()でDBのセッションデータも確実に削除、④https://api.wordpress.org/secret-key/1.1/salt/で手動生成も可能、⑤/etc/cron.d/で月次自動更新を設定します。