WordPressのディレクトリやファイルのパーミッションは何がベストなのか?

VPSでWordPressを運営していると頭を悩ますのがセキュリティ関係だが、今回はWordPressのパーミッションについて書いていく。

今回は色々な記事を参考にすることで「これがベストプラクティスだ」と言うところまでいけたので、備忘録として残しておく。

(参考記事は、最後に一覧として書いている)

本番環境

  • CentOS7
  • apache 2.4.2

今回はWEBサーバーにapacheを採用しているが、別にnginxでも同じだと思う。

あと、今回の説明は既にrootユーザー以外のユーザーを作成していることを前提に進めていく。

まずは、結論から。

まずは、結論から。WordPressのパーミッション関連は以下の様にすると良い。

  • /var/www/ディレクトリ・・・rootユーザーが所有。
  • wp-contentなどのWordPressのディレクトリ、ファイル・・・apacheユーザーとapacheグループが所有。
  • WordPressのディレクトリの権限は775, ファイルは664にする
  • ただし、.htaccessファイルは606、wp-config.phpは404の権限に設定

以下は詳しく見ていく。

/var/www/ディレクトリ・・・rootユーザーが所有。

これは、仮にWordPressが第3者に乗っ取られても、他のディレクトリやファイルを守るため。

特に設定しなくても/var/www/ディレクトリはrootユーザーになっていると思うが、ll /var/wwwなどのコマンドで確認すると良い。

wp-contentなどのWordPressのディレクトリ、ファイル・・・apacheユーザーとapacheグループが所有。

wp-contentなどのWordPressに関係があるディレクトリやファイルは、apache(nginx)をユーザーにするのが良い。なぜなら、WordPressでは、プラグインやテーマのインストール、画像のアップロードをする際に、「このディレクトリの所有者はapacheなのか?」をチェックして、正常に動作するかを決めるからだ。

例えば、apache以外のユーザーを所有者にしていた場合は、プラグイン、テーマのインストールや画像のアップロード時にFTPのパスワードを常に聞かれるようになるので、非常に面倒くさい。

実際にapacheユーザーに変更するには以下の様にする。

sudo chown -R apache:apache /var/www

-Rオプションを入れることで、/var/www以下のディレクトリやファイルもapacheユーザーに所有権が渡る。

WordPressのディレクトリの権限は775, ファイルは664にする

WordPressのディレクトリの権限は775, ファイルは664にする。要は、apacheとapacheグループのユーザーのみ、ディレクトリを自由に扱えて、ファイルの読み書きをできるようにしておく。

「ディレクトリの権限は755、ファイルは644にすべき」との声もあるが、775にした方がWordPressをいじる時に何かしらと都合がよい。

権限を変更するためには、以下の様にコマンドを実行する。

sudo find /srv/www/ -type f -exec chmod 664 {} \;
sudo find /srv/www/ -type d -exec chmod 775 {} \;

findコマンドは、引数に指定したディレクトリ以下の全てのディレクトリやファイルを検索する。オプションに-typeを入れることで検索するファイルの種類を絞り込める。

また、-execオプションを入れることで、findで検索した結果を使って別のコマンドを実行できる。その時に、{}は検索結果とエイリアスとして働く。詳しくは、「Man page of FIND」の記事を参考にしてね。

ただし、.htaccessファイルは606、wp-config.phpは404の権限に設定

先ほどの全てのファイルの権限を664にしたが、セキュリティ上重要になる.htaccesswp-configだけは権限を変えておく。なぜなら、htaccessはWordPressのアクセス関連に関わるファイルだし、wp-config.phpにはデータベースの情報が載っているからだ。

具体的には、.htaccessファイルは606、wp-config.phpは404の権限に設定しておくと良い。

さらに、wp-config.phpに直接アクセスできないようにするために、.htaccessに以下を記述しておくと、より安全だ。

<files wp-config.php>
  order allow,deny
  deny from all
</files>

参考記事

ReratedPosts

WordPressのget_template_part()はどのような仕組みになっているのか?
WordPressのplugin_basename()とかplugins_url()の使い方のまとめ
WordPressのapply_filters、do_action、add_filter、add_actionの使い方とか違いとか