更新を当てる、侵害されていないか点検する。どちらも大切な作業だが、その前に「そもそも入口を減らす」という考え方がある。この記事では、WordPress の攻撃面(アタックサーフェス)を狭めるための5つの見直し — 管理者アカウント、管理画面からのファイル編集、ファイル権限、wp-config.php の扱い、uploads での PHP 実行 — を、既存の解説記事を束ねる形で整理する。どれも安全を請け合う設定ではなく、被害の起きやすさ・広がりやすさを下げるための見直しとして読んでほしい。
攻撃面とは何か
攻撃面とは、外部から(あるいは侵入後に内部から)触れられる入口や機能の総量のことだ。入口が多いほど、見落としの確率は上がる。逆に、使っていない入口を閉じておけば、更新が間に合わなかった日の影響が小さくなる。
ここで大切なのは、攻撃面を狭める作業は「脆弱性が見つかったときの被害を小さくする」ものであって、脆弱性そのものを消すものではない、という点だ。脆弱性への根本的な備えは、引き続き更新と点検である。以下は、それを補う層として並べる。
| 見直す点 | 狭めるもの | 詳しい記事 |
|---|---|---|
| ① 管理者アカウント | 乗っ取られたときに使える権限の量 | 侵害点検の記事 |
| ② 管理画面でのファイル編集 | 管理者ログイン後にコードを書き換えられる経路 | wp-config.php 定数解説 |
| ③ ファイル権限 | 同じサーバー上の他者・他プロセスから見える範囲 | ファイル権限と最小権限 |
| ④ wp-config.php | 認証情報が載ったファイルの露出 | wp-config.php 定数解説 |
| ⑤ uploads のコード実行 | アップロードされた PHP が動く可能性 | 本記事 |
① 管理者アカウントを減らす
管理者は、プラグインの導入・ユーザーの作成・設定の変更など、ほぼ何でもできる。つまり 管理者アカウントの数は、乗っ取られたときの影響範囲の数 でもある。
見直しの観点は次のとおり。
- 管理者は「今そのサイトの管理作業をしている人」だけにする。過去の担当者、退職・契約終了した人のアカウントは外すか、権限を下げる
- 記事を書くだけの人には、編集者や投稿者の権限で十分なことが多い。必要な作業に足りる最小の権限 を渡す
- 共有アカウントは、誰が操作したかが分からなくなる。可能なら個人ごとに分ける
- 管理者のメールアドレスが、今も受信できる宛先か確認する(パスワード再設定の経路になる)
一覧は、次の読み取り専用コマンドで確認できる。
wp user list --role=administrator --fields=ID,user_login,user_email,user_registered
全員について「誰で、なぜ管理者なのか」を説明できるかが基準になる。説明できないアカウントがあれば、削除する前に、まず記録を残して確認する。
② 管理画面からのファイル編集を止める
WordPress の管理画面には、テーマやプラグインのファイルをその場で編集できる機能がある。便利な反面、管理者ログインさえ突破されれば、そこからサーバー上のコードを書き換えられる経路 にもなる。
wp-config.php に次の定数を入れると、この編集機能が無効になる。
define( 'DISALLOW_FILE_EDIT', true );
wp-config.php の主要定数の記事でも触れたとおり、これは「管理画面でコード編集をしない運用」なら副作用が小さい。ただし、プラグインやテーマの導入・更新まで止めたい場合は別の定数(DISALLOW_FILE_MODS)があり、こちらは更新も止まるため、保守の運用と相性を確認してから使う。更新を止めてしまっては、本末転倒になるからだ。
③ ファイル権限を必要最小限にする
Unix 系のサーバーでは、ファイルごとに「所有者・グループ・その他」へ読み書き実行の権限が付く。ファイル権限と最小権限の記事で書いたとおり、考え方は 「必要な相手に、必要な操作だけ」 に尽きる。
- 全員が書き込める権限(
777など)は、特別な理由がない限り付けない - 一般的な目安として、ファイルは
644、ディレクトリは755程度から始める。ただしサーバーの構成(PHP の動かし方、所有者の設定)によって適切な値は変わるので、ホスティング事業者の案内を優先する - 権限を変更する前に、現状を記録しておく。変えて動かなくなったときに、元へ戻せるようにするためだ
現状の確認は、読み取りだけで済む。
find . -type f -perm -o+w -not -path "./wp-content/cache/*" | head -20
「その他」に書き込み権限が付いているファイルを一覧にする例だ。出てきたものを機械的に直すのではなく、なぜそうなっているか を確認してから判断する。
④ wp-config.php を守る
wp-config.php には、データベースの接続情報や、ログインの仕組みに使う各種キー(ソルト)が入っている。外部に読まれて困るファイルの筆頭だ。
- ドキュメントルートの外に置けるか確認する: WordPress は、
wp-config.phpが1つ上のディレクトリにあっても読み込める。サーバー構成が許すなら、公開領域の外に置く方法がある(ただし、構成によっては動かなくなる場合があるので、バックアップを取ってから) - 権限を絞る: 前節の考え方に沿って、他者から読めない権限にする。多くの環境で
600や640が候補になるが、PHP が読めなくなる設定もあるため、動作確認を伴って行う - バックアップや一時ファイルを置かない:
wp-config.php.bakやwp-config.php.oldのようなファイルを公開領域に残すと、元のファイルより保護が弱くなりやすい。編集後に残っていないか確認する - ソルトの入れ替え: 鍵を更新すると、既存のログインセッションが無効になる。管理者の見直しと合わせて実施すると効果が分かりやすい
wp config shuffle-salts
実行すると全員が再ログインになるため、作業の時間帯には注意する。
⑤ uploads ディレクトリで PHP を動かさない
wp-content/uploads/ は、画像などのメディアが保存される場所で、本来は PHP のコードを置く場所ではない。もしここに PHP ファイルが置かれ、さらに実行できる状態だと、アップロード経路の不備が深刻な被害につながりやすい。
考え方は単純で、「データを置く場所では、コードを実行させない」だ。実現方法はサーバーの種類で異なる。
- Apache 系では、
uploads直下に置く.htaccessで PHP の実行を拒否する方法がある(Apache 2.4 の例)
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
- Nginx 系では、サーバー設定側で
uploads配下の.phpを PHP 処理に渡さない設定にする - 共用レンタルサーバーでは、
.htaccessの利用可否や記述が管理画面の設定に依存する場合がある。契約中のサービスの案内を確認する
設定の前後で、画像などの通常のメディアが表示され続けること を必ず確かめる。また、プラグインによっては uploads 配下に自分用の PHP を置くものもある。その場合は、拒否を入れる前に、そのプラグインの動作に影響しないかを確認する。
すでに入っているものの確認は、侵害点検の記事の読み取り専用コマンドで行える。
限界を知っておく
- どの項目も、脆弱性を直すものではない。更新の遅れを埋め合わせる「時間稼ぎ」にはなるが、更新の代わりにはならない
- 設定を入れた後に動作が変わることがある。変更は1つずつ、バックアップを取ってから行い、変更前後の状態を記録する
- ホスティングの仕様で、実行できる手段は大きく変わる。ここに書いた値はあくまで一般的な目安であり、環境ごとの確認が前提になる
- 「一度整えたら終わり」ではない。担当者の入れ替わりやプラグインの追加で、攻撃面は少しずつ元に戻っていく。定期的に見直すことが保守になる
まとめ
- 攻撃面を狭める作業は、脆弱性が見つかった日の被害を小さくする層。更新と点検の代わりにはならない
- 見直すのは5点: 管理者の数、管理画面でのファイル編集、ファイル権限、wp-config.php、uploads での PHP 実行
- どれも変更の前に現状を記録し、変更後に動作を確認する
- 値は環境で変わる。迷うときはホスティング事業者の案内か、専門の窓口を頼る
今日できる一手は、wp user list --role=administrator の結果を見て、今は使っていないアカウントがないか を確かめること。