12月に予定されているWordPress 7.2に、外部サービスのAPIキーやOAuthの秘密情報を暗号化して保管するための仕組み「Secrets API」が入ります。開発者向けの解説記事が公開され、11月13日にはベータ版からの移行手順にも修正が加えられました。画面に見える変更ではありませんが、メール送信や決済、地図などの外部サービスとつないでいるサイトにとっては、裏側の安全性に関わる話です。
これまで鍵はどこに置かれていたか
提案者の説明によると、APIキーを必要とするプラグインは、今のところ設定値の保存場所であるオプションのテーブルに、そのままの文字列で書き込むしかありませんでした。サイトのキャッチフレーズと同じテーブルに認証情報が並んでいるため、データベースのダンプやバックアップ、ステージング環境への複製のたびに、鍵も一緒に持ち出されることになります。
もちろん、自前で暗号化しているプラグインもあります。ただ、鍵の作り方も暗号方式も失敗したときの挙動もプラグインごとに違い、まとめて点検することができませんでした。サイトにどんな認証情報があり、いつ入れ替えたのかを答えられないという運用上の問題も挙げられています。
Secrets APIでできること
プラグインは wp_set_secret() で値を保存し、wp_get_secret() で取り出します。名前は「プラグインのスラッグ/秘密の名前」の形で付け、ほかのプラグインの値を誤って上書きしないようにします。中身はlibsodiumで暗号化され、平文で保存するモードは用意されていません。
取り出した値はそのまま文字列として出てくるのではなく、ログやデバッグ出力に書き出されても伏せ字で表示される専用のオブジェクトに包まれています。実際の値は reveal() を呼んだときだけ得られるので、どこで鍵を使っているかをコードから探しやすくなります。新しい値を書き込むと一つ前の値が控えとして残り、鍵の入れ替え中に古い鍵へ戻れる作りになっています。
もう一つ実務的に効いてきそうなのが、「保存されていない」と「保存されているが今は読めない」を区別して返す点です。前者なら接続の設定をやり直してもらえばよく、後者で同じことをすると、まだ有効な鍵を上書きしてしまうおそれがあります。この区別をコアが決めてくれるのは、プラグインの作り手にとって助かるところです。
wp-config.phpに一行足す必要がある
暗号化の大もとになるのは、wp-config.phpに書く WP_SECRETS_KEY という定数です。新規にインストールしたサイトではソルトと一緒に自動で入りますが、既存のサイトでは自分で追加する必要があります。サイトヘルスのセキュリティの項目に、貼り付ける一行を生成してくれる案内が出るようです。
注意したいのは、この定数をソルトと同じ感覚で扱わないことです。ソルトは漏えいが疑われたときに入れ替えることがありますが、WP_SECRETS_KEY を秘密の保存後に変えたり消したりすると、保存済みの値がすべて読めなくなります。ベータの途中までは定数がなくてもソルトから鍵を作る代替の仕組みがありましたが、ソルトを入れ替えると読めなくなる問題があり、最終的に定数が必須になりました。
また、移行や複製の際にwp-config.phpを作り直す運用をしている場合、元の定数を引き継がないと移した先で鍵が読めなくなります。サーバーの引っ越しやステージングの作り直しの手順書がある制作会社は、ここに一行加えておくとよさそうです。
中小企業のサイトで今から考えておくこと
提案者自身も、この仕組みでWordPressの中で動く悪意あるコードを防げるわけではないと明言しています。守れるのは、流出したデータベースやバックアップ、デバッグログや画面共有から鍵が読み取られる場面です。とはいえ、侵害の多くはデータベースの持ち出しから始まるので、効果は小さくありません。
実際にサイトの鍵がこの仕組みに移るのは、各プラグインが対応してからです。既存の設定値を取り込む関数は、移した鍵を「入れ替えが必要」として印を付けます。すでにバックアップに平文で残っている以上、暗号化しただけでは足りないという考え方で、取り込んだ後は発行元で鍵を作り直すのが筋です。管理画面での一覧表示などは次の7.3で検討される予定なので、7.2の時点では、更新前に定数の追加と保管場所の控えを済ませておくくらいが現実的な備えになりそうです。













