フォルダやファイルの所有者は誰にすべきか
WordPressを新規にインストールすると、様々なフォルダとファイルが作られる。
これらのフォルダやファイルに不用意にアクセスさせないことがセキュリティの第一歩。
なお、今回の対象 webサーバーの概要は次の通り。
OS | Ubuntu Desktop 22.04 LTS |
webサーバー | Apache 2.4.52 |
ドキュメントルート | /var/www/wordpress |
CMS | WordPress 6.2.2 |
FTP接続ユーザー名(仮称) | username |
WordPress公式サイトのサポートドキュメントには、書き込み権限を与えるユーザーやグループの考え方の例が記載されていて、簡潔にまとめると次のようになる。
- / –ルートディレクトリ–
ユーザーアカウントによってのみ書き込み可能とする。
WordPressが自動的に書き換えルールを生成する場合(パーマリンク機能など)を除く。 - /wp-admin/ –WordPressの管理領域–
ユーザーアカウントによってのみ書き込み可能とする。
- /wp-includes/ –WordPressアプリケーションロジック–
ユーザーアカウントによってのみ書き込み可能とする。
- /wp-content/ –ユーザー提供のコンテンツ–
ユーザーアカウントと一部は Web サーバープロセス(www-data)によって書き込み可能とする。wp-contentに格納されているフォルダを例として示す。
- /wp-content/themes/ –テーマフォルダ–
ユーザーアカウントによってのみ書き込み可能とする。組み込みのテーマエディタを使用する場合は、Webサーバープロセス(www-data)による書き込みも可能とする。
- /wp-content/plugins/ –プラグインフォルダ–
ユーザーアカウントによってのみ書き込み可能とする。
- /wp-content/themes/ –テーマフォルダ–
これを見ると、あらためて Webサーバープロセス(www-data)によって書き込み可能なフォルダやファイルはごく一部に限られていることがわかる。
WordPress公式サイトのサポートドキュメントにはこうも書かれている。
すべてのファイルは ユーザー (ftp) アカウントが所有者となるべきで、そのアカウントによって書き込み可能である必要がある。また、共有サーバーでは、ファイルは Web サーバープロセス(www-data)自身をファイルの所有者にすべきではない。
どうやら、所有者を ftpアカウントユーザーに設定し、必要に応じ www-dataをグループとして加え一部書き込みの許可を与えることを基本としているようだ。
ただし、こうしたフォルダやファイルのアクセス権の設定は、サーバーの管理ポリシーに属するものなので、最終的にはそれぞれの環境によって異なる。
例えば、自宅(自社)サーバーではなく、ホスティング会社から提供される環境でサーバーを運用する場合、そうしたサービスを提供する側で設定されているポリシーを無理に改変すべきではない。
元々あるポリシーを覆いかぶすような別の管理手法を無理矢理混在させようとする試みはとても危険なことなのだ。
パーミッションの操作設定例
WordPress公式サイトに記載の手法に則った設定方法を例として挙げてみたい。
なお、設定例は単純な公開サーバー用で、Eコマース(EC,E-Commerce)等の特殊なサイトは想定していない。
WordPressフォルダおよび中に含まれるファイル全般的な設定。
フォルダは所有者のみ作成と削除権限を与え、ファイルに対しては読み書き権限を与える。
またその他のユーザー・グループに対しフォルダはアクセスのみ、ファイルは読み取りのみの権限を付与する。
sudo chown -R username /var/www/wordpress sudo chmod 0705 /var/www/wordpress
cd /var/www/wordpress sudo find ./ -type d | xargs chmod 0705 sudo find ./ -type f | xargs chmod 0604
101行にある usernameはここでの暫定名称。これ以降の usernameはそれぞれの環境に応じたユーザーアカウント名に置き換えてほしい。
この設定を基に、厳しくするところはより厳しく、緩くするところは限りなく狭い範囲に抑える。そんなポリシーの下、パーミッションを変更してみる。
wp-config.phpのパーミッション設定
最も守るべきファイルが wp-config.php。
所有者およびApache(www-dataグループ)に対し読み取りのみの権限を与える。
所有者であっても読み取りのみにするのは、操作ミスによる上書きを防ぐためである。
cd /var/www/wordpress sudo chown username wp-config.php sudo chgrp www-data wp-config.php sudo chmod 0440 wp-config.php
また、外部からのアクセスを確実に防ぐため、.htaccessに次を記述する。
sudo nano /var/www/wordpress/.htaccess <files wp-config.php> Require all denied </files>
.htaccessのパーミッション設定
mod_rewrite によるパーマリンクの機能を利用するため、その他のユーザーに書き込み権限を付与する。
cd /var/www/wordpress sudo chown username .htaccess sudo chmod 0606 .htaccess
なお、.htaccess自体は apache2.conf中の次の設定で守られている。
<FilesMatch "^\.ht"> Require all denied </FilesMatc>
通常アクセスしてもブラウザには
「Forbidden You don’t have permission to access this resource.」の画面が出力され、中を閲覧することは叶わない。
ユーザーより提供されるコンテンツ格納フォルダ /wp-content/uploadsへのアクセス許可
このフォルダにはユーザーにより画像や動画等のアップロードされ、都度格納される。
/wp-content/uploadsへの書き込みは Apache(www-data)経由で行われるため、www-dataを書き込み許可グループとしてパーミッションを設定する。
cd /var/www/wordpress/wp-content/ sudo chgrp -R www-data uploads cd /var/www/wordpress/wp-content/uploads sudo find ./ -type d | xargs chmod 0664 sudo find ./ -type f | xargs chmod 0664
以上で基本的な設定は完了。単純にして明快。デフォルトからのこれ以上の設定変更は第三者(別の管理者がいる場合など)にとって難解なものとなる可能性があるので、やりたいと考えていてもやらないのが吉。