2026年9月2日
2026年9月2日
WordPressの認証キー・ソルト(旧SECRET_KEY)を定期的にローテーションする安全な手順
wp-config.php の認証キーとソルトを新しい値に入れ替えると、発行済みのログインCookieがすべて無効になり、漏えいしたCookieや鍵を使った不正ログインを断ち切れます。一方で、全ユーザーがログアウトされ、プラグインによっては保存データが読めなくなるといった影響もあります。この記事では、キーとソルトの役割、入れ替えで何が起きて何が起きないか、手動とWP-CLIでの手順、定期実行するときの注意点を説明します。
SECRET_KEYと8つのキー・ソルトの関係
かつてのWordPressには SECRET_KEY という定数が1つだけありました。WordPress 2.6 以降は用途ごとに分かれ、現在の wp-config.php には次の8つが並んでいます。
AUTH_KEY/AUTH_SALT: 管理画面用の認証CookieSECURE_AUTH_KEY/SECURE_AUTH_SALT: HTTPS接続時の認証CookieLOGGED_IN_KEY/LOGGED_IN_SALT: 「ログイン中」を示すCookieNONCE_KEY/NONCE_SALT: フォームやリンクを守る nonce
古い SECRET_KEY を今も書いているサイトは、新しい8つの定数に移行してください。WordPressの内部では wp_salt() がこれらの値を組み合わせ、wp_hash() を通じてCookieや nonce の改ざん検知に使っています。値が第三者に知られると、理屈の上ではログインCookieを偽造される危険があるため、wp-config.php の内容が漏れた疑いがあるときは入れ替えが欠かせません。
入れ替えると何が起きるか
起きること
- 全ユーザーのログアウト: 既存のログインCookieの検証が通らなくなります。管理者だけでなく、会員サイトの利用者やECサイトの顧客も再ログインが必要です
- nonce の無効化: 入れ替え前に開いていた編集画面や設定画面で保存すると、「リンクの有効期限が切れました」などのエラーになります。書きかけの記事は、作業前に保存してもらうよう周知します
- キャッシュ済みページの不整合: ページキャッシュに古い nonce を含むHTMLが残っていると、フォーム送信や Ajax が失敗することがあります。入れ替え後はページキャッシュを削除します
- 一部プラグインの保存データへの影響: キーやソルトを暗号化の鍵として流用しているプラグインがあります。たとえば Site Kit by Google は、保存する認証情報の暗号化に
LOGGED_IN_KEYなどを使っていると説明しており、入れ替え後に再接続が必要になる場合があります。ほかにも、SMTPの認証情報や外部APIのトークンを暗号化して保存するプラグインは同じ影響を受ける可能性があるため、事前に各プラグインの説明を確認してください
起きないこと
- パスワードは変わりません: ユーザーのパスワードのハッシュは、これらのキーやソルトに依存しない方式で保存されています(2026年10月現在)。入れ替え後も同じパスワードでログインできます
- 投稿や設定のデータは消えません: データベースの中身は変わりません
「パスワードを盗まれた」場合の対策としては、キーの入れ替えだけでは不十分です。該当ユーザーのパスワード変更とあわせて行ってください。
入れ替えの前に準備すること
- wp-config.php のバックアップ: 公開ディレクトリの外にコピーします。
wp-config.php.bakのような名前で公開ディレクトリに置くと、PHPとして実行されずテキストのままダウンロードされ、データベースのパスワードまで漏れる危険があります - 暗号化を使うプラグインの洗い出し: 再接続や再設定が必要なものを把握しておきます
- 利用者への告知: 会員やスタッフに、再ログインが必要になる時間帯を知らせます。アクセスの少ない時間帯を選びます
- ステージングでの事前確認: 本番と同じプラグイン構成のステージングで一度試すと、影響を事前に把握できます
手動で入れ替える手順
WordPress.org が提供している生成ページ https://api.wordpress.org/secret-key/1.1/salt/ を開くと、8行分の define() がランダムな値で表示されます。アクセスするたびに新しい値になります。
wp-config.php の該当部分は、初期状態では次のようになっています(値は説明用のサンプル文言です)。
define( 'AUTH_KEY', 'put your unique phrase here' );
define( 'SECURE_AUTH_KEY', 'put your unique phrase here' );
define( 'LOGGED_IN_KEY', 'put your unique phrase here' );
define( 'NONCE_KEY', 'put your unique phrase here' );
define( 'AUTH_SALT', 'put your unique phrase here' );
define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
define( 'LOGGED_IN_SALT', 'put your unique phrase here' );
define( 'NONCE_SALT', 'put your unique phrase here' );
この8行を、生成ページで表示された8行に丸ごと置き換えて保存します。つまずきやすい点は次のとおりです。
- 一部だけ残す: 8行すべてを置き換えます。古い行と新しい行が重複すると、定数の二重定義で警告が出ます
- 値の中の記号: 生成された値にはさまざまな記号が含まれます。エディターの自動変換で引用符が全角になったり、行が折り返されたりしないよう、プレーンテキストのエディターを使います
- 文字コード: UTF-8(BOMなし)で保存します。BOM付きで保存すると、画面の先頭に余計な文字が出たり、ヘッダー送信のエラーが起きたりします
保存したら、SSHが使える環境では構文を確認してからブラウザでログインし直します。
php -l wp-config.php
WP-CLIで入れ替える手順
WP-CLI が使える環境では、1行のコマンドで8つの値を新しいものに置き換えられます。
# バックアップを公開ディレクトリの外へ
cp wp-config.php ~/backup/wp-config.php.$(date +%Y%m%d)
# キーとソルトを新しい値に入れ替える
wp config shuffle-salts
# 構文の確認
php -l wp-config.php
wp config shuffle-salts は wp-config.php の中に定数が直接書かれていることを前提にしています。キーを環境変数や別ファイルから読み込む構成にしている場合は、そちらの仕組みで入れ替える必要があります。オプションはWP-CLIのバージョンによって追加されているため、使う前に wp help config shuffle-salts で確認してください。
複数台のWebサーバーで同じサイトを動かしている場合は、すべてのサーバーの wp-config.php が同じ値になるように反映します。台ごとに値が異なると、リクエストがどのサーバーに振り分けられるかでログイン状態が切れる不具合になります。
定期的なローテーションの考え方
どのくらいの頻度で入れ替えるべきかについて、WordPressとしての決まった基準はありません。全ユーザーがログアウトされるという影響があるため、次のように分けて考えると運用しやすくなります。
- すぐに入れ替える場面: wp-config.php やバックアップファイルが外部に漏れた疑いがあるとき、マルウェアの駆除を終えたとき、サーバーにアクセスできるスタッフや外注先との契約が終わったとき
- 定期的に入れ替える場面: 社内のセキュリティ方針で期間を決めている場合など。会員サイトやECサイトでは、ログアウトによる利用者の負担と比べて頻度を決めます
定期実行するなら、cron から WP-CLI を呼ぶ方法があります。
# 例: 毎月1日の午前4時に実行(パスは環境に合わせて変更)
0 4 1 * * cd /var/www/example.com/public && /usr/local/bin/wp config shuffle-salts --quiet && /usr/local/bin/wp cache flush --quiet
自動化する前に、暗号化を使うプラグインがないこと、ページキャッシュの削除も一緒に行えることを確認してください。wp cache flush はオブジェクトキャッシュを空にするコマンドで、ページキャッシュプラグインの削除は各プラグインのコマンドや管理画面で行います。プラグインで定期ローテーションを設定する選択肢もありますが、更新が止まっていないかを確認してから使ってください。
入れ替え後の確認
- 自分の管理者アカウントで再ログインできるか
- 投稿の保存、メディアのアップロード、設定の保存が通るか(nonce が正しく発行されているか)
- お問い合わせフォーム、会員ログイン、カートや決済の流れが動くか
- 外部サービスと連携するプラグインの接続状態が切れていないか
ログインできなくなった場合は、バックアップした wp-config.php に戻せば元の状態に復旧できます。
まとめ
- 現在のWordPressは旧
SECRET_KEYではなく、4つのキーと4つのソルトでCookieと nonce を守っている - 入れ替えると全ユーザーがログアウトされ、nonce とキャッシュ済みページにも影響するが、パスワードや投稿データは変わらない
- キーやソルトを暗号化に流用するプラグインがあるため、事前に洗い出して再接続に備える
- 手動なら生成ページの8行で丸ごと置き換え、WP-CLI なら
wp config shuffle-saltsを使い、どちらも公開ディレクトリ外へのバックアップを先に取る - 頻度は運用方針と利用者への影響で決め、漏えいの疑いやスタッフの交代時にはすぐに入れ替える