ファイルパーミッションの変更

このページ「ファイルパーミッションの変更」は一部未翻訳です。和訳や日本語情報を加筆してくださる協力者を求めています

コンピュータのファイルシステムでは、ディレクトリやファイルの一つ一つにパーミッションが設定されており、その読み込み、編集、アクセスを誰に (何に) 許可するかが指定されています。これは、WordPress が特定の関数を有効化するために wp-content ディレクトリ内のファイルに書き込むためのアクセスが必要になる場合があるので、重要です。

パーミッションモード

  7       5    5
 user   group  world
 r+w+x  r+x    r+x
 4+2+1  4+0+1  4+0+1 = 755

パーミッションモードは、以下の値を所有者 (user)、グループ (group)、他のユ―ザ (other) に割り当てて算出します。 算出は、以下の図のように行えます。

  • Read 4 – 読み込みを許可
  • Write 2 – ファイルの書き込み / 変更の許可
  • eXecute1 – 読み込み / 書き込み / 削除 / 変更 / ディレクトリ
  7       4     4
 user   group  world
 r+w+x    r      r
 4+2+1  4+0+0 4+0+0  = 744

トップ ↑

パーミッションモードの例

文字列説明
0477-r–rwxrwx所有者に read (4)、グループと他のユーザに read、write、execute (7) を許可
0677-rw-rwxrwx所有者に read、write (6)、グループと他のユーザに read、write、execute (7) を許可
0444-r–r–r–所有者、グループ、他のユーザに read (4) を許可
0666-rw-rw-rw-所有者、グループ、他のユーザに read、write (6) を許可
0400-r——–所有者に read (4) を許可、グループと他のユーザは権限なし (0)
0600-rw——-所有者に read、write (6) を許可、グループと他のユーザは権限なし (0)
0470-r–rwx—所有者に read (4)、グループに read、write、execute (7) を許可、他のユーザは権限なし (0)
0407-r—–rwx所有者に read (4) を許可、グループは権限なし (0)、他のユーザに read、write、execute (7) を許可
0670-rw-rwx—所有者に read、write (6)、グループに read、write、execute (7)を許可、他のユーザは権限なし (0)
0607-rw—-rwx所有者に read、write (6) を許可、グループは権限なし (0)、他のユーザに read、write、execute (7) を許可

トップ ↑

WordPress のパーミッションスキーム

パーミッションはホストごとに異なるため、このガイドでは一般的な原則のみを詳しく説明します。 すべてのケースをカバーできるわけではありません。 このガイドは、標準な設定で稼働しているサーバーに適用されます(「suexec」メソッドを使用した共有ホスティングについては、以下を参照してください)。

一般的に、すべてのファイルの所有権はWebサーバー上のユーザー(ftp)アカウントに設定され、またそのアカウントから書き込み可能である必要があります。 共有ホストでは、ファイルの所有権をWebサーバープロセス自体にすべきではありません(所有権がwwwapachenobodyユーザーなどにはならないということです)。

WordPressからの書き込みアクセスが必要なファイルは、WordPressが使用するユーザーアカウント(サーバーアカウントとは異なる場合があります)が所有またはグループ所有する必要があります。 たとえば、サーバーとファイルをFTPでやり取りできるユーザーアカウントを持っている場合でも、サーバー自体はdhapacheやnobodyなどの別のユーザーグループ内の別のユーザーを使用して実行できます。 WordPressがFTPアカウントとして実行されている場合、そのアカウントには書き込みアクセス権が必要です。つまり、ファイルの所有者であるか、書き込みアクセス権のあるグループに属している必要があります。 後者の場合、アクセス許可はデフォルトよりも寛容に設定されます(たとえば、フォルダーの場合は755ではなく775、644の代わりに664)。

WordPress でのパーミッションは、基本的にほぼすべてのユーザで共通の設定になりますが、使用するサーバ、ユーザの行うインストールのタイプ、およびインストール時のシステム全体の umask 値などにより異なる場合があります。 

注記: 経験豊富なユーザーが WordPress をインストールしてくれた場合、ファイルのパーミッションを変更する必要はないでしょう。パーミッションエラーの問題が発生しない限り、あるいはそうしたい場合を除き、おそらくこれをいじる必要はありません。

注記: WordPress を自分でインストールした場合、ファイルのパーミッションを変更する必要がある場合があります。いくつかのファイルやディレクトリは、より厳しいパーミッションで「強化」されるべきです。特に、wp-config.php ファイルはそうです。このファイルは初期状態では644のパーミッションで作成されており、このままにしておくのは危険です。Security and Hardening を参照してください。

一般的に、WordPress のすべてのコアファイルは、あなたのユーザーアカウント (または異なる場合は httpd アカウント) だけが書き込み可能であるべきです。(時には、インストールを管理するために複数の ftp アカウントが使用され、すべての ftp ユーザーが知られていて信頼できる場合、すなわち、共有ホストではない場合、group writable を割り当てることが適切かもしれません。詳しくはサーバー管理者に聞いてください)。ただし、mod_rewrite Permalinks やその他の .htaccess 機能を利用する場合は、WordPress が /.htaccess ファイルにも書き込めることを確認する必要があります。

組み込みのテーマ エディターを使用する場合は、すべてのファイルをグループで書き込み可能にする必要があります。 ファイルパーミッションを変更する前に、この機能を使用してみてください。動作するはずです。 (これは、異なるユーザーが WordPress パッケージとプラグインまたはテーマをアップロードした場合に当てはまります。これは、管理者によってインストールされたプラグインとテーマの問題ではありません。異なる ftp ユーザーグループでファイルをアップロードする場合、書き込み可能なグループが必要です。共有ホスティングでは、 グループが信頼できるユーザー専用であることを確認してください… apache ユーザーはグループに含まれるべきではなく、ファイルを所有するべきではありません。)

一部のプラグインでは /wp-content/ フォルダーを書き込み可能にする必要がありますが、そのような場合はインストール中に通知されます。 場合によっては、755 のアクセス許可を割り当てる必要があります。/wp-content/cache/ およびおそらく /wp-content/uploads/ ( MultiSite /wp-content/blogs.dir/ についてもこれを行う必要がある場合があります)

/wp-content/ の下の追加のディレクトリは、それらを必要とするプラグイン / テーマごとに文書化する必要があります。 パーミッションは異なります。

/
|- index.php
|- wp-admin
|   `- wp-admin.css
|- wp-blog-header.php
|- wp-comments-post.php
|- wp-commentsrss2.php
|- wp-config.php
|- wp-content
|   |- cache
|   |- plugins
|   |- themes
|   `- uploads
|- wp-cron.php
|- wp-includes
`- xmlrpc.php

トップ ↑

suexec で共有ホスティング

上記は、PHP バイナリの実行に「suexec」アプローチを使用する共有ホスティング システムには適用されない場合があります。 これは、多くの ウェブホストで使用される一般的なアプローチです。 これらのシステムでは、php プロセスが php ファイル自体の所有者として実行されるため、共有ホスティングの特定のケースに対して、よりシンプルな構成とより安全な環境が可能になります。

注: suexec メソッドは、単一サイト サーバー構成では絶対に使用しないでください。共有ホスティングの特定のケースでのみ、より安全です。

このような suexec 構成では、正しいパーミッションスキームは簡単に理解できます。

  • すべてのファイルは、httpd プロセスに使用されるユーザー アカウントではなく、実際のユーザーのアカウントによって所有されている必要があります。
  • ウェブサーバープロセスの権限チェックに特定のグループ要件がある場合を除き、グループ所有権は関係ありません。通常、このようなケースはありません。
  • すべてのディレクトリは 755 または 750 である必要があります。
  • すべてのファイルは644または640であるべきです。例外: wp-config.php は、サーバー上の他のユーザーが読むのを防ぐために、440または400にする必要があります。
  • アップロードディレクトリも含めて、どのディレクトリにも777を与えてはいけません。php プロセスはファイルの所有者として実行されているため、所有者権限を取得し、755のディレクトリにも書き込むことができます。

この特定のタイプのセットアップでは、WordPress は適切な所有権を持つファイルを直接作成できることを検出するため、プラグインのアップグレードまたはインストール時に FTP 資格情報を要求しません。

このセットアップのためにシステム管理者が使用する一般的な方法は次のとおりです。

  • suPHP, php-cgiを通して実行される、2013年から現在未整備。
  • mod_ruid2, apache モジュール、シンプルだが効果的。
  • mpm-itk, apache モジュール。
  • mod_fcgid, Apache モジュールで、より広範な設定を持つ FastCGI サーバー。
  • PHP-FPM, Apache と Nginx で使用する、共有 OPCode を持つ代替 FastCGI サーバー。

トップ ↑

FTP クライアントの使用

FTP programs (“クライアント”) を使用すると、リモート ホスト上のファイルとディレクトリのアクセス許可を設定できます。この機能は、プログラムメニューで chmodまたは パーミッションの設定 と呼ばれることがよくあります。

In WordPress install, おそらく変更したくなる2つのファイルは、インデックスページと、レイアウトを制御する css です。ここでは、index.phpを変更する方法を説明します – プロセスはどのファイルでも同じです

下のスクリーンショットで、最後の列をご覧ください – これはパーミッションを示しています。少しわかりにくいですが、とりあえず文字の並びを確認してください。 

初期のパーミッション

「index.php」を右クリックし、「ファイルのパーミッション」を選択します
ポップアップ画面が表示されます。

ファイルパーミッションの変更

チェックボックスは気にしないでください。「Numeric value:」を削除して、必要な数字(この場合は「666」)を入力するだけです。そして、「OK」をクリックします。 

Permissions have been altered.

Don’t worry about the check boxes. Just delete the ‘Numeric value:’ and enter the number you need – in this case it’s 666. Then click OK. 

Permissions have been altered.

これで、ファイルのパーミッションが変更されたことが確認できます。

トップ ↑

隠しファイルの表示

デフォルトでは、ほとんどの FTP クライアント, (FileZilla を含む)がファイル名がピリオド (.) で始まるファイルを非表示にしています。しかし、パーミッションを変更するために隠しファイルを表示する必要があるかもしれません。例えば、パーマリンクを制御するファイルである「.htaccess」ファイルを作成する必要がある場合は、書き込み可能な状態にする必要があります。

FileZilla では、隠しファイルを表示する場合、メニューバーから [サーバ] → [強制的に隠しファイルを表示] にチェックを入れる必要があります。画面表示が更新され、常に隠しファイルが表示されるようになります。

To get FileZilla to always show hidden files – under Edit, Settings, Remote File List, check the Always show hidden files box.

In the latest version of Filezilla, the ‘Show hidden files’ option was moved to the ‘Server’ tab. Select ‘Force show hidden files.’

トップ ↑

コマンドラインによるパーミッションの変更

shell/SSH でサーバにアクセスする権限を持っているのであれば、chmod コマンドを使用してパーミッションを変更することができます。chmod コマンドを使用する前に、Unix Permissions や Apple Chmod Reference などのチュートリアルを読み、このコマンドについて必ず理解しておいてください。パーミッションを間違えて設定すると、Web サイトはオフラインになります。時間をかけて正確に行ってください。

chmod コマンドは、UNIX で使用されるコマンドで、任意のファイルのパーミッションを変更 (change mode) することを意味します。以下に 2 の例を挙げて、その手順を示します。

ここではまず、wp-content ディレクトリ内のすべてのファイルを、すべてのグループとユーザに対して書き込み可能にしてみましょう。コマンドに -R オプションを追加することで、wp-content 内のすべてのディレクトリおよびファイルに変更を適用するよう指定します。設定するパーミッションは 766 です。この場合 WordPress およびすべてのグループとユーザがディレクトリに読み込み、書き込みを行えるようになります。コマンドの最後に記述されるのは、変更対象となるディレクトリ名 wp-content です。766 でうまくいかない場合は、777 を設定してみてください。その場合、すべてのユーザ、グループ、プロセスが、すべてのディレクトリとファイルに読み込み、書き込み、実行を行えるようになります。 

以下の 2 つのステップで wp-content ディレクトリ内のすべてのファイルを、すべてのグループとユーザに対して書き込み可能にできます : 

1. コマンドラインで次の行を入力して WordPress のメインディレクトリに移動 

  cd wordpress/ 

2. コマンドラインで次の行を入力して該当ディレクトリ内のすべてのファイルのパーミッションを変更

  chmod -R 777 wp-content

この手順を使って、今度は .htaccess ファイルを、すべてのグループとユーザに対して書き込み可能にしてみましょう。 mod_rewrite によるパーマリンクを使用する場合、WordPress が .htaccess ファイルを更新できるようにパーミッションを以下のように設定する必要があります :

1. コマンドラインで次の行を入力して WordPress のメインディレクトリに移動します。

  cd wordpress/

2. コマンドラインで次の行を入力して、該当ファイルのパーミッションを変更します。

  chmod 666 .htaccess 

wp-content ディレクトリ内などですべてのファイルを書き込み可能にする前に、最初はディレクトリのみを書き込み可能にするなど、より安全な方法を試してみてください。下記のコマンドを利用できます。

chmod 746 -v DIR
chmod 747 -v DIR
chmod 756 -v DIR
chmod 757 -v DIR
chmod 764 -v DIR
chmod 765 -v DIR
chmod 766 -v DIR
chmod 767 -v DIR

うまくいかない場合は、recursive オプションを追加して、ディレクトリとその配下のパーミッションを再帰的に変更してみてください。上記コマンドの -v を –R に置き換えて実行します。 また、recursive オプションでは、ユーザが作成したディレクトリやファイルに対しても変更を行えます。 DIR を任意のファイル名に置き換えてください。ファイルを指定してパーミッションを変更できます。
これらの設定を行っても書き込みできない場合には、777 を試してください。 

  • 注記 :セキュリティの観点から、パーミッションを 777 (すべてのユーザが書き込み可能)に設定することは避け、最低限でも良いのでアクセス制限をかけてください。まずは744 などの限定的なパーミッション設定から始め、動作が確認できるまで順番に変更していきましょう。必要な際にのみ 777 を使い、できることならば短時間の使用にとどめてください。

トップ ↑

777の危険性

このパーミッションの問題の核心は、サーバーがどのように設定されているかにあります。FTP や SSH でサーバーにアクセスするときに使うユーザー名は、サーバーアプリケーション自体がページを提供するときに使うユーザー名ではないことがほとんどです。

  7      7      7
 user   group  world
 r+w+x  r+w+x  r+w+x
 4+2+1  4+2+1  4+2+1  = 777

多くの場合、Apacheサーバーは www-datadhapache あるいは nobody のユーザーアカウントによって「所有」されています。これらのアカウントは、サーバー上のファイルへのアクセスが制限されていますが、これには十分な理由があります。ユーザーアカウントが所有する個人的なファイルやフォルダをWorld-Writableに設定することで、文字通り World Writable にすることができるのです。これで、www-data、dhapache、nobody の各ユーザーは、サーバーの運営、ページの提供、php インタプリタの実行など、ユーザーアカウントのファイルへのフルアクセスを持つことになります。

これは、サーバー上の基本的にどのプロセスでも乗っ取ることによって、誰かがあなたのファイルにアクセスできるようにする手段を提供するものであり、これにはマシン上の他のユーザーも含まれます。ですから、自分のマシンのパーミッションを変更する際には、慎重に考える必要があります。私はこれまで767以上のパーミッションが必要なものに出会ったことはありません。

トップ ↑

最悪の結果

フォルダまたはファイルに777の許可を使用することで起こりうる最悪の事態は、悪意のあるクラッカーやエンティティが悪質なファイルをアップロードしたり、現在のファイルを改変してコードを実行できる場合、彼らがあなたのブログを完全に制御でき、データベース情報やパスワードを含むあらゆる情報にアクセスできることです。

トップ ↑

回避策

WordPress プラグインを使うことで、比較的簡単にセキュリティの強化を行い、リスクを回避することできます。プラグイン製作者、またはサーバのサポートサービスにコンタクトを取り、回避策を講じてください。 

トップ ↑

適切なファイル・パーミッション設定

.htaccess ファイルは、サーバプロセスの所有者がアクセスするファイルのひとつです。パーミッションを制限しすぎた場合、サーバがファイルにアクセスできなくなり、エラーの原因となります。しかし適切なパーミッション設定を得るときには、まず限定的な設定から始め、動作が確認できるレベルまで開放していく手順を踏みます。

トップ ↑

パーミッション設定例

パーミッションの設定例を説明します。cgi-bin ディレクトリ内に PHP スクリプトの実行のための php.cgi と php.ini ファイル、そしてアクセス制御のための .htaccess が設置されている場合、パーミッションは以下のようになります。

  • デフォルト設定 (umask 022) 
 644 -rw-r--r--  /home/user/wp-config.php
 644 -rw-r--r--  /home/user/cgi-bin/.htaccess
 644 -rw-r--r--  /home/user/cgi-bin/php.ini
 755 -rwxr-xr-x  /home/user/cgi-bin/php.cgi
 755 -rwxr-xr-x  /home/user/cgi-bin/php5.cgi
  • 適切な設定 
 600 -rw-------  /home/user/wp-config.php
 604 -rw----r--  /home/user/cgi-bin/.htaccess
 600 -rw-------  /home/user/cgi-bin/php.ini
 711 -rwx--x--x  /home/user/cgi-bin/php.cgi
 100 ---x------  /home/user/cgi-bin/php5.cgi

トップ ↑

.htaccess のパーミッション設定

644 > 604 グループから .htaccess の読み込み権限を取り除きます。通常は 644 が推奨設定です。 

トップ ↑

php.ini のパーミッション設定

644 > 600 パーミッション 644 では、すべてのグループとユーザに php.ini に対する読み込み権限が与えられおり、Web サイトから容易にアクセスされる可能性があります。設定変更に際して留意する点は、php.ini にアクセスするファイルは php.cgi のみであるため、最低限 php.cgi のプロセスに権限が与えられていれば動作に問題はないということです。パーミッション 600 では、php.cgi がファイル所有者の権限で動作しながら、グループや他のユーザからのアクセスを制限することができます。

トップ ↑

php.cgi のパーミッション設定

755 > 711 ここでは、プロバイダから標準で提供される vanilla PHP や mod_php の代わりに、カスタムコンパイルされた php.cgi バイナリを使用しています。通常は 755 が設定されています。

トップ ↑

php5.cgi のパーミッション設定

755 > 100 php5.cgi を実行するプロセスはファイル所有者の権限で動作するため、グループや他のユーザに対してアクセス権限を与える必要はなく、ファイル所有者の実行権限を残してすべて削除しても問題ありません。ファイル所有者からも、ファイルの読み込み、書き込み権限が取り除かれますが、PHP スクリプトを実行するための権限は維持されます。また、パーミッション設定を元に戻すことも、ファイル所有者の権限でいつでも可能です。

/* 755 > 100 – Because of the setup where the user account is the owner of the process running the php cgi, no other user or group needs access, so we disable all access except execution access. This is interesting because it really works. You can try reading the file, writing to the file, etc.. but the only access you have to this file is to run php scripts. And as the owner of the file you can always change the permission modes back again.

*/

$ cat: php5.cgi: Permission denied
./php5.cgi:  Welcome

トップ ↑

関連ページ

この記事は役に立ちましたか ? どうすればさらに改善できますか ?