WordPressのパーミッションとか

WordPressのパーミッションについてだが、
ほとんどの解説サイトがいい加減なので、一回真面目に書こうと思う。
一応であるが、なるべく安全性も目指して設定を試みる。

①ファイルの所有者はWebサーバーとしない
②必要なパーミッションだけ与える
③必要な時だけパーミッションを緩める

以上を前提とすると、コマンドによる操作が不可欠となる。
自動化するならシェルスクリプトを実行する必要がある。
正直コマンドやシェルスクリプトを使えない人はWordPressを管理するべきじゃない。
そのレベルじゃセキュリティに対する意識もメチャクチャだろうし、
もし今回の記事の意味が分からない人はブログサービスでも使った方が良い。

というわけで、当然意味が分かる人を前提で話を進める。

まず、通常運用時のパーミッションから解説する。
通常運用時では以下のようにすれば比較的硬くなる。

①WordPress全体のフォルダとファイルのオーナーをWordPress管理者に設定
②WordPress全体のフォルダとファイルのグループをWebサーバーに設定
③WordPress全体のフォルダを750、ファイル640に設定
④wp-config.phpを440に設定
⑤plugins配下のフォルダ770、ファイル660で設定
⑥pluginsを750に設定
⑦uploadsとuploads配下をフォルダを770、ファイルを660で設定

まず、全体を750、640としてWebサーバーによる書き込みを許可させない。
wp-config.phpは命なので最小限の設定にする。

ミソはplugins。これは権限与えないと動かないプラグインがある。
プラグインを個別に調査して設定もできるが面倒なので今回はパス。
ただしpluginsフォルダ自体には書き込みを許可しない。
これで外部から不正にプラグインを入れることを許さない。

あとはuploadsだが、まぁこれも書き込み権限必須だ。
書き込み出来るようにしないと、メディアがアップロードできなくなる。
ということで、以上が最小限の構成となる。
シェルスクリプトに書くと以下のような感じ。

#!/bin/bash

BaseDir="/var/www/wordpress"

chown -R ftpuser:apache $BaseDir

find $BaseDir -type d -exec chmod 750 {} +
find $BaseDir -type f -exec chmod 640 {} +

chmod 440 $BaseDir/wp-config.php

find $BaseDir/wp-content/plugins -type d -exec chmod 770 {} +
find $BaseDir/wp-content/plugins -type f -exec chmod 660 {} +

chmod 750 $BaseDir/wp-content/plugins

find $BaseDir/wp-content/uploads -type d -exec chmod 770 {} +
find $BaseDir/wp-content/uploads -type f -exec chmod 660 {} +

細かいパラメータは自分で変えて下さい。
どこ変えればいいか分からない人は使わないで下さい。

次にメンテ時のパーミッションについて解説する。
メンテ時は通常運用時と異なり、Webサーバーに書き込み権を与えねばならない。
例えば、WordPressやプラグインやテーマのアップデートで必要になる。

要は記事投稿とか以外の管理画面での操作は全てメンテ時かな。
といってもテーマカスタマイズとかはデータベース管理だから無関係だけどw
まぁ何かやってエラーが出ればメンテ用じゃないとできないって感じ。

メンテ中はメンテ用のパーミッションを使い、終わったら通常時に戻すのだ。
緩める状態を示すと以下になる。

①WordPress全体のフォルダとファイルのオーナーをWordPress管理者に設定
②WordPress全体のフォルダとファイルのグループをWebサーバーに設定
③WordPress全体のフォルダを770、ファイルを660で設定
④wp-config.phpを440に設定

シェルスクリプトにすると以下の感じ。

#!/bin/bash

BaseDir="/var/www/wordpress"

chown -R ftpuser:apache $BaseDir

find $BaseDir -type d -exec chmod 770 {} +
find $BaseDir -type f -exec chmod 660 {} +

chmod 440 $BaseDir/wp-config.php

一応注意だが、プラグイン側でwp-chofig.phpをいじる可能性がある場合、
wp-config.phpも緩めなくてはならない。
まぁセキュリティプラグインとかでも滅多にない操作だが・・・
こういう特殊ケースは手動で変えた方が良いだろう。

また一つ、ここで注意点。
WordPressはファイルの所有者がWebサーバーでない時、
本体とかプラグインのアップデート時にFTPアカウントを要求してくる。
このクソ仕様死ねよって感じ。

これを解消するにはwp-config.phpをいじる必要がある。

define('FS_METHOD', 'direct');

define( 'AUTOMATIC_UPDATER_DISABLED', true );

↑を末尾に追加する。ついでに自動アップデートも停止した。
どうせパーミッション強化したら自動アップデートも失敗するし。

こんな感じで運用するのが硬いパーミッションになると思う。
公式サイトとかでもメンテ時だけ緩めろとか言ってた気がするし。
まぁパーミッションがまともだから何なの?
とか言われると身も蓋も無い話になるのだが、一応、ね(`;ω;´)

あ、一応書きますけど、
今回の記事参考にして何か自爆しても僕は責任取らないからよろしく。
記事で間違ってる所とかあったら直したりはしますけどね(`・ω・´)ゞ

ブログ主が運営しているゲームです。
こちらよりどうぞ

コメント

  1. K&K より:

    セキュリティの大原則はブラックリスト制を採用せずホワイトリスト制を採用することのはずなんだけどこの大原則を理解していないやつが意外と多かったり、ね。

  2. 山羊丸 より:

    あ、それ僕だ(`;ω;´)

  3. K&K より:

    言われてみるとそうだ。
    初期の&とか特殊記号の扱いがそうだった記憶があるぞ(^Д^)

  4. 山羊丸 より:

    (`;ω;´)

  5. K&K より:

    このパーミッション設定の考え方もそのベースになっているのはやっぱりこの原則ホワイトリスト制なんだよね。
    だからまず最初に全体を750設定するのも「管理者以外は原則として書き込み禁止」であって「必要な場合には例外的に必要な時・必要な場所にだけ書き込み権限を付与する」って意味やし。

  6. 山羊丸 より:

    そうっすねぇ