WordPressディレクトリのパーミッションをセキュアに

別の記事(パーマリンクFTP接続情報)に記載したようにテーマやプラグインのインストール時に”FTP接続情報”が表示されしまう、.htaccessファイルの自動更新ができないといった事象を回避するために、WordPressディレクトリとファイルの所有者をWebサーバ実行ユーザである”apache”にする、という方法があります。
 
しかし、オンラインマニュアルを見るとセキュリティ的にあまり望ましくないようです。オンラインマニュアルの推奨設定に従って設定した例を示します。

(1)パーミッション設定の指針


 
下記参考情報を基にパーミッション設定の指針をまとめました。
『Hardening WordPress File Permissions』
『Changing File Permissions』
『Securing a Linux Web Server』
 
①WordPress用ディレクトリ、ファイルの所有者をどのユーザーにするか?
 
私の環境では、Webサーバーの実行ユーザーは”apache”ですが、ディレクトリ、ファイルの所有者を”apache”にすると冒頭で記載したような問題が回避できるメリットがあります。
 
しかし、WebサーバーのプロセスにWordPressディレクトリ内のすべてのディレクトリ、ファイルに対して書込み権限を与えてしまう事になるので、セキュリティ的に望ましくないようです。
 
公式サイトもWebサーバー実行ユーザーではなく、FTPなどファイル転送に使う通常のユーザーを所有者とすることを推奨しているようです。
 
従って、WordPress用ディレクトリ、ファイルの所有者は、”apache”などのWebサーバ実行ユーザーではなく、ファイル転送に使う通常のユーザーアカウントにします。
 
②WordPress用ディレクトリ、ファイルの所有グループはどのグループにするか?
 
.htaccessの自動更新や一部のプラグインなどでWebサーバーを実行しているユーザーの書込み権限が必要になる事があります。
 
その場合、一部のファイルやディレクトリに対してファイル所有者以外のユーザーにも書込み権限を付与する必要があります。
 
すべてのユーザーに書込み権限を付与するのはセキュリティ的に問題があるので、WordPressディレクトリ、ファイルの所有グループを”Webサーバ実行ユーザー”にし、所有グループのみに書込み権限を付与すれば、すべてのユーザーに対しては書込み権限を付与する必要はなくなります。
 
以上より、所有グループは”Webサーバ実行ユーザー(apahce)”にします。
 
③ファイル、ディレクトリのパーミッションについて
 
・ディレクトリのパーミッションは、基本は”750″とし、Webサーバー実行ユーザーの書込み権限が必要なディレクトリのみ”770″とする。
 
・ファイルのパーミッションは、実行権限は不要かと思いますので、基本は”640″とし、Webサーバー実行ユーザーの書込み権限が必要なファイルのみ”660″とする。
 

(2)Webサーバー実行ユーザーの書込み権限が必要なディレクトリ、ファイル


 
参考サイトによると下記があります。
 
・.htaccessファイル
パーマリンク設定などでWordPressから自動編集させたい場合は必要。(自動編集させたいので私は付与しました。)
 
・/wp-content/
ユーザーアップロードファイル、テーマ、プラグインなど。一部のプラグインなどで書込み権限が必要になる事がある。(公式サイトに必要とあったので私は付与しました)
 
・/wp-content/themes/
テーマファイル。WordPress管理画面のテーマエディタを使用する場合は、Webサーバープロセスによって書込み可能である必要がある。(今まで使用した事がなかったので、私は現状は付与していません。)
 

(3)設定変更手順


 
ここでは、WordPress用ディレクトリが”/var/www/html/wp”として手順を記載します。
 
①ディレクトリの権限を変更
 
/var/www/html/配下の全ディレクトリの権限を”750″にします。
 
find /var/www/html/ -type d -exec chmod 750 {} \;
 
②ファイルの権限を変更
 
/var/www/html/配下の全ファイルの権限を”640″にします。
 
find /var/www/html/ -type f -exec chmod 640 {} \;
 
③ファイル、ディレクトリの所有者、所有グループを変更
 
ファイル所有者をファイル転送ユーザー、グループをWebサーバー実行ユーザーに修正します。
 
chown -R ftpuse:apache /var/www/html/wp/
 
④.htaccessファイルの権限を変更
 
グループに書き込み権限を付与します。
 
事前確認
find /var/www/html/wp/ -name .htaccess -exec ls -al {} \;
権限変更
find /var/www/html/wp/ -name .htaccess -exec chmod 660 {} \;
事後確認
find /var/www/html/wp/ -name .htaccess -exec ls -al {} \;
 
⑤wp-contentディレクトリの権限変更
 
グループに書き込み権限を付与します。
 
find /var/www/html/wp/ -type d -name wp-content -exec ls -ald {} \;
find /var/www/html/wp/ -type d -name wp-content -exec chmod 770 {} \;
find /var/www/html/wp/ -type d -name wp-content -exec ls -ald {} \;
 
⑥不要なファイル、ディレクトリに書込み権限が付与されていないか確認
 
念のため④、⑤で設定した以外に書込み権限が付与されていないか確認します。
 
その他ユーザーに書込み権限が付与されていないか
# find /var/www/html -type d -perm -002
# find /var/www/html -type f -perm -002
 
所有グループに不要な書込み権限が付与されていないか
# find /var/www/html -type d -perm -020
/var/www/html/test/wp-content
# find /var/www/html -type f -perm -020
/var/www/html/wp/.htaccess
 
当面はこの設定にしておき、問題が発生したら必要に応じて権限を追加しようと思っています。
 
(2013年11月2日追記) サイトマップファイルに書込権限必要
 
管理画面(左サイドメニューの「設定」→「XML-Sitemap」)のサイトマップの画面を見ると、
“Result of the last build processes・・”の欄に赤字で記載されていました。
 There was a problem writing your sitemap file.
 There was a problem writing your zipped sitemap file.
Webサーバーのプロセスが書き込む事が出来ずエラーとなっているようです。

# ls -al sitemap.xml*
-rw-r----- 1 ftpusr apache 44464 Nov 2 07:28 sitemap.xml
-rw-r----- 1 ftpusr apache 5182 Nov 2 07:28 sitemap.xml.gz

ファイルの所有グループであるapacheユーザーに書込権限を付与しました。
 
# chmod 660 sitemap.xml
 
その後、管理画面で手動でサイトマップを再構築すると、エラー表示がなくなりました。

関連記事の目次
VPSサーバーでスナップショットを取得
~障害に備え、リカバリーポイントを作成。
VPSサーバーにログインして、設定内容を確認
~グローバルIPアドレス確認、SSHキーを作成。
VPSサーバーにSSHでログイン
~Tera Term、SSH、公開鍵認証方式
yumコマンドで最新のパッケージにアップデート
~全パッケージを最新にアップデート
Apacheのインストール
~yumコマンドでApacheインストール、iptablesでファイアウォールの設定
PHPとMySQLをインストール
~yumコマンドでPHP、MySQLインストール
WinSCPを使ってWordPressをアップロード
~WinSCPをクライアントPCにインストール、ファイルアップロード方法
WordPressをインストール
~MySQLでWordPress用データベース作成、wp-config.phpファイルの設定
CentOSのファイアウォール設定
~iptablesを使ってネットワークフィルタリング設定を一から行う
OpenSSHの設定をよりセキュアに
~ログイン制限、ポート変更、認証方式
ApacheでTCPのTraceメソッドを無効にする
~Apacheの設定変更、Telnetで動作確認
ヘッダーにApacheバージョンが表示されないようにする
~Apacheの設定変更、Telnetで動作確認
Apacheでディレクトリ内一覧表示を無効にする
~autoindex_moduleのロードを無効にする
セキュリティを考慮し、MySQLの匿名ユーザーにパスワードを設定、または削除
~MySQLの匿名ユーザーにパスワードを設定、または削除
PHPのバージョンが表示されないようにする
~php.iniの設定変更
WordPressディレクトリのパーミッションをセキュアに
~WordPress用ディレクトリの所有グループ、ユーザー、パーミッション設定
パーマリンク設定時のApache設定
~WordPressパーマリンクの設定、Apache .htaccessの設定
WordPressテーマの選定
~テーマ追加の特徴フィルターの項目、テンプレートキング
WordPressで画像のアップロード、サイズ調整、リンクを設定
~アップロード画像の画像サイズ、サムネイル、画像編集、リンク設定
更新可能なRPMパッケージのリストをメールで送信する
~yumコマンド、Bashスクリプト、Cron
Linuxでディスク使用量が多いディレクトリを調べる方法(1)
~du --max-depth
Linuxでディスク使用量が多いディレクトリを調べる方法(2)
~duコマンド、sortコマンド
WordPressデータベースのバックアップとリストア
~コマンドラインでバックアップ、リストア
WordPressのバージョンアップと旧バージョンへの戻し
~データベースとディレクトリのバックアップ、リストア
BashスクリプトでWordPressデータベースを自動バックアップ
~MySQLデータベースをBash、Cronを使って自動バックアップ、メール通知
BashスクリプトでDos攻撃など大量アクセスのログを検知
~Apacheアクセスログ、Dos、Cron、メール通知
テーマ作成
 
ブートストラップ3を使って自作テーマ作成
~Bootstrap3、自作テーマ作成、TwentyFourteen
Bootstrapのフリーのテーマを使ってデザインを簡単にカスタマイズ
~Bootstrap3のスタイルをカスタマイズ
 
WordPresssショートコード
 
簡単なショートコードを作ってみる
~ショートコードの作り方
ショートコードを使って関連記事のリンクを自動で挿入
~ショートコードの簡単なサンプル
ショートコードを使ってディレクトリ内のファイル名を取得し、投稿内にリンクを挿入
~カスタムフィールド利用、PHPで日本語文字列検索などのコーディング
 
AJAX、AngularJSなどその他応用
 
WordPress投稿内でAngularJSを使用
~AngularJS、Bootstrap、アコーディオン
Bootstrap3で作成したナビゲーションメニューをAngularJSに変更
~AngularJS、Bootstrap、自作テーマheder.php
WordPressでAngularJSを使ったGoogleマップを使えるようにする
~AngularJSを使って投稿内にGoogleマップ

「WordPressディレクトリのパーミッションをセキュアに」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です