2026年5月20日
2026年5月20日
WordPressのファイルパーミッションをセキュリティ面から見直す|危険な設定の検出と書き込み範囲の絞り方
ファイルのパーミッション(権限)が緩いと、サイトの別の部分が乗っ取られたときに、WordPress のファイルを書き換えられたり、不正な PHP ファイルを置かれたりしやすくなります。この記事では、セキュリティの面から権限を点検し、書き込める場所を必要な範囲に絞る手順を説明します。755/644 の意味など基本的な設定は、WordPressのファイルパーミッションの正しい設定|755/644と所有者の確認手順 で詳しく説明しています。内容は2026年10月時点のものです。
作業の前に、ファイルとデータベースのバックアップを取ってください。コマンドの /var/www/html は、自分の環境の WordPress のフォルダーに置き換えます。
考え方:書き込める人と場所を減らす
WordPress 公式ドキュメントの「Hardening WordPress」では、次のように整理しています。
| 場所 | 書き込めるのは |
|---|---|
WordPress のフォルダー直下(.htaccess を除く) |
自分のユーザーアカウントだけ |
wp-admin/・wp-includes/ |
自分のユーザーアカウントだけ |
wp-content/ |
自分のユーザーアカウントと Web サーバーのプロセス |
wp-content/plugins/ |
自分のユーザーアカウントだけ |
wp-content/themes/ |
自分のユーザーアカウントだけ(管理画面のテーマエディターを使う場合は Web サーバーも) |
つまり、PHP(Web サーバー)が書き込む必要があるのは、主にアップロードやキャッシュなど wp-content/ の中の一部です。それ以外を PHP から書き換えられないようにしておくと、プラグインの脆弱性などで PHP が悪用されたときの被害を小さくできます。
ただし、管理画面からプラグインや本体を更新するには、PHP がそのファイルを書き換えられる必要があります。どこまで絞るかは、管理画面での更新の手軽さとの兼ね合いで決めます(ステップ3)。
ステップ1:危険な設定を探す
SSH で次のコマンドを実行します。何も表示されなければ、該当するものはありません。
cd /var/www/html
# その他のユーザー(サーバー上の誰でも)が書き込めるファイル・フォルダー(777、666 など)
find . -perm -0002 ! -type l
# uploads の中にある PHP ファイル(通常は存在しない)
find wp-content/uploads -type f \( -iname '*.php*' -o -iname '*.phtml' -o -iname '*.phar' \)
# 最近7日間に変更された PHP ファイル(更新した覚えがないものが無いか見る)
find . -type f -name '*.php' -mtime -7
# wp-config.php の権限と所有者
stat -c '%a %U:%G %n' wp-config.php
結果の見方は次のとおりです。
- その他のユーザーが書き込めるもの:777 や 666 になっているファイル・フォルダーです。ステップ2で直します
- uploads の中の PHP ファイル:画像などを置くフォルダーに PHP があるのは不自然です。一部のプラグインが
index.phpを置くこともありますが、身に覚えのないものは中身を確かめ、改ざんを疑ってください - 最近変更された PHP ファイル:本体やプラグインを更新した日以外に変更されたファイルが無いか確認します
改ざんが疑われる場合は、WP-CLI で WordPress 本体と、WordPress.org で配布されているプラグインのファイルを、公式のチェックサムと比べられます。
# WordPress 本体のファイルを公式のチェックサムと比べる
wp core verify-checksums
# WordPress.org で配布されているプラグインを比べる
wp plugin verify-checksums --all
wp core verify-checksums が確認するのは本体のファイルだけです。wp-content/ の中のテーマやアップロードされたファイルは確認しないため、問題が出なくても安心はできません。
ステップ2:777 や 666 をやめて基本の値に戻す
フォルダーは 755、ファイルは 644 に戻します。chmod -R 755 のようにまとめて付けると、すべてのファイルに実行権限が付くため、フォルダーとファイルを分けて設定します。
cd /var/www/html
find . -type d -exec chmod 755 {} +
find . -type f -exec chmod 644 {} +
777 は、サーバー上のすべてのユーザーとプロセスが書き込めることを意味します。動かないからといって 777 にすると、ほかのサイトや別のプロセスが乗っ取られたときに書き換えられる危険があります。一時的なデバッグでも使わないでください。書き込めない原因はほとんどの場合、所有者が合っていないことです(ステップ3)。
ステップ3:所有者で書き込める場所を絞る
書き込めるかどうかは、権限の数字だけでなく、ファイルの所有者と PHP を動かしているユーザーの組み合わせで決まります。PHP の実行ユーザーは次のコマンドで確認できます(root の行はマスタープロセスなので、それ以外の行を見ます)。
ps -eo user,comm | grep -E 'php-fpm|php[0-9.]*-fpm|apache2|httpd' | sort | uniq -c
レンタルサーバーの場合
多くのレンタルサーバーでは、PHP が契約者自身のユーザーで動くため、PHP はすべてのファイルを書き換えられます。所有者による絞り込みはできないので、ステップ2の値、ステップ4の wp-config.php、ステップ5の PHP 実行の禁止、管理画面のファイル編集の無効化を組み合わせます。
VPS で、PHP が www-data などで動く場合
ファイルの所有者を作業用のユーザー(例 deploy)、グループを PHP の実行ユーザー(Debian/Ubuntu では多くの場合 www-data)にし、PHP が書き込む必要のあるフォルダーだけにグループの書き込みを許可します。
# 所有者は deploy、グループは www-data にする
sudo chown -R deploy:www-data /var/www/html
# 基本は 755/644(PHP は読むだけ)
sudo find /var/www/html -type d -exec chmod 755 {} +
sudo find /var/www/html -type f -exec chmod 644 {} +
# アップロード用のフォルダーだけ、グループ(PHP)に書き込みを許可する
sudo find /var/www/html/wp-content/uploads -type d -exec chmod 775 {} +
sudo find /var/www/html/wp-content/uploads -type f -exec chmod 664 {} +
キャッシュ系プラグインなど、ほかにも PHP が書き込むフォルダー(プラグインの説明に書かれています)があれば、同じようにそのフォルダーだけを 775/664 にします。
この形にすると、PHP は本体・プラグイン・テーマのファイルを書き換えられません。その代わり、管理画面からの更新やインストールはできなくなる(「接続情報」の画面が出る)ため、更新は deploy ユーザーで WP-CLI を使って行います。
# deploy ユーザーで更新する例
cd /var/www/html
wp core update
wp plugin update --all
wp theme update --all
管理画面のテーマ・プラグインのファイルエディターも止めておくと、管理者アカウントが乗っ取られた場合に PHP のコードを書き込まれるのを防ぐ助けになります。wp-config.php の「編集が必要なのはここまでです」という行より前に書きます。
define( 'DISALLOW_FILE_EDIT', true );
ステップ4:wp-config.php の権限を絞る
wp-config.php にはデータベースのパスワードが書かれています。公式ドキュメントでは、自分(と Web サーバー)だけが読めるようにすること、一般には 400 または 440 にすることを勧めています。PHP が読めない値にするとサイトが表示されなくなるので、所有者に合わせて選びます。
| 状況 | 設定例 |
|---|---|
| PHP がファイルの所有者と同じユーザーで動く(多くのレンタルサーバー) | 400(所有者だけ読める)。自分で編集する必要があるときは一時的に 600 |
所有者は作業用ユーザー、PHP はグループ(www-data)として読む |
440(所有者とグループが読める)。編集するときは一時的に 640 |
# PHP が所有者と同じユーザーで動く場合
chmod 400 /var/www/html/wp-config.php
# 所有者 deploy・グループ www-data で運用している場合
chmod 440 /var/www/html/wp-config.php
変更したら、サイトのトップページと管理画面が表示されることを確認してください。表示されない場合は 644 に戻し、所有者とグループを見直します。レンタルサーバーでは、権限の値に制限がある場合があるため、サーバー会社の案内も確認してください。
ステップ5:uploads フォルダーで PHP を実行させない
万一 uploads に PHP ファイルを置かれても実行されないように、Web サーバーで止めます。
Apache の場合
wp-content/uploads/.htaccess を作り(すでにあれば追記し)、次を書きます。Apache 2.4 の書き方です(Order・Deny from all は Apache 2.2 の古い書き方です)。.htaccess が使える設定(AllowOverride)になっている必要があります。
<FilesMatch "\.(?i:php[0-9]?|phtml|phar)$">
Require all denied
</FilesMatch>
php_flag engine off を使う方法もありますが、PHP を Apache のモジュール(mod_php)で動かしている場合にしか効かず、PHP-FPM の構成では使えません。上の書き方は、どちらの構成でも動きます。
Nginx の場合
Nginx は .htaccess を読みません。サイトの server ブロックに書きます。Nginx の正規表現の location は、書いた順に調べて最初に一致したものが使われるため、PHP を処理する location ~ \.php$ より前に書きます。
location ~* ^/wp-content/uploads/.*\.(?:php[0-9]?|phtml|phar)$ {
deny all;
}
sudo nginx -t && sudo systemctl reload nginx
設定したら、テスト用に uploads へ PHP ファイルを置いてブラウザで開き、403 になることを確かめてから、そのファイルを削除します。
echo '<?php echo "PHP-RAN";' > /var/www/html/wp-content/uploads/test-deny.php
curl -s -o /dev/null -w '%{http_code}\n' https://example.com/wp-content/uploads/test-deny.php
rm /var/www/html/wp-content/uploads/test-deny.php
ステップ6:定期的に点検する
ステップ1の点検をスクリプトにして、毎日実行します。結果をログに残し、メールを送れるサーバーなら cron の MAILTO で受け取れます。
#!/bin/sh
# WordPress のファイル権限を点検して結果を表示する
WP_ROOT=/var/www/html
echo "== その他のユーザーが書き込めるファイル・フォルダー"
find "$WP_ROOT" -perm -0002 ! -type l
echo "== uploads の中の PHP ファイル"
find "$WP_ROOT/wp-content/uploads" -type f \( -iname '*.php*' -o -iname '*.phtml' -o -iname '*.phar' \)
echo "== wp-config.php の権限と所有者"
stat -c '%a %U:%G %n' "$WP_ROOT/wp-config.php"
これを /usr/local/bin/wp-perm-check.sh として保存し、実行できるようにして、/etc/cron.d/wp-perm-check に登録します。
sudo chmod 755 /usr/local/bin/wp-perm-check.sh
# 毎日 6 時に実行し、結果をログに上書きする
echo '0 6 * * * root /usr/local/bin/wp-perm-check.sh > /var/log/wp-perm-check.log 2>&1' | sudo tee /etc/cron.d/wp-perm-check
各見出しの下に何も出ていなければ問題はありません。
注意点
- 権限や所有者を変えたら、画像のアップロード、記事の保存、(管理画面で更新する運用なら)プラグインの更新が動くか確かめてください
sudoや root で WordPress のファイルを作ると、所有者が root になり、あとで PHP や作業用ユーザーが書き換えられなくなることがあります。作業は所有者のユーザーで行います- 権限を絞っても、プラグインの脆弱性やパスワードの漏えいを防げるわけではありません。本体・プラグイン・テーマの更新と、管理者アカウントの保護も合わせて行ってください
まとめ
find . -perm -0002で誰でも書き込めるファイルを、find wp-content/uploadsで uploads 内の PHP を探す- フォルダー 755、ファイル 644 に戻し、777 は使わない
- VPS では所有者を作業用ユーザー、グループを PHP にして、書き込みは uploads など必要な場所だけに許可する。更新は WP-CLI で行う
wp-config.phpは 400 や 440 など、PHP が読める範囲で絞る- uploads での PHP 実行を Web サーバーで止める。Nginx では PHP の
locationより前に書く - 点検をスクリプトにして毎日実行する
関連記事: