ディレクトリとファイルのパーミッション

ネットビジネスでレンタルサーバーにソフトウェアをインストールする時、パーミッション(権限)を設定することがあります。パーミッションとは何なのか、どういった意味があるのか、正しく設定しないことの脅威を説明します。

ファイルは誰の物か

インターネット関連のサーバーに多く採用されているUNIX系OSでは、ディレクトリやファイルは誰の物であるのかを明確に区別します。
そしてディレクトリやファイルの所有者から見て、
  • 所有者本人(User、Owner)
  • 所有者と同じグループ(Group)
  • その他(Others)
の関係の人に与えられた権限、これがパーミッションです。

実生活に置き換えてみます。
日記:見ていいのは自分(所有者)だけ、他人(その他)は勿論家族(所有者と同じグループ)も見ちゃ駄目、
プロジェクトの資料:見たり読んだりしてよいのは自分(所有者)を含めたプロジェクトメンバー(所有者と同じグループ)、
チラシ:どんな人にも見て欲しい、
このような設定をディレクトリやファイルに行うのです。

所有者

UNIXサーバーにログインしてディレクトリやファイルを作ったり、FTPからディレクトリやファイルをアップロードした場合、通常所有者は操作を行っているユーザーアカウントになります。
PHPやPerlなどのスクリプトからファイルを作った場合、そのスクリプトがどの実行権限で動かされているかで所有者が変わってきます。 実行権限がWebサーバーなら作成されたファイルの所有者はWebサーバーに、実行権限がユーザーならユーザーに設定されるのが通常です。

所有者と同じグループ

所有者は1つ以上のグループに含まれています。グループの範囲はレンタルサーバーに拠ります。
同じサーバーに属するアカウントが1つのグループになっている場合もあるようです(この場合見知らぬ赤の他人が同じグループになります)。
レンタルサーバーの場合、所有者と同じグループには権限を与えない設定で大丈夫ですが、レンタルサーバーによってはcron設定に関係してきます。cronをサポートしているサーバーならマニュアルにパーミッション値が書いてあるはずなので参照してください。

その他

その他はWebページの訪問者(正確にはWebサーバーソフトウェア、Apahceのことが多い)など第三者です。 たとえファイルの所有者でもブラウザからファイルにアクセスする場合はその他になります。

ファイルパーミッションの設定値

パーミッションはアルファベットあるいは数字で設定します。

アルファベットでの表記

最初によりわかりやすいアルファベットでの表記について書きます。

【r】【w】【x】【-】の4つの文字を使って表します。
r:読み込み
w:書き込み
x:実行
-:権限を与えない
という意味になります。

読み込みの権限だけ与えるなら、【r--】
読み込み、書き込み権限を与えるなら、【rw-】
読み込み、書き込み、実行権限を与えるなら、【rwx】
読み込み、実行権限を与えるなら、【r-x】
となります。

3文字をひとかたまりとして、左から所有者、所有者と同じグループ、その他の順番で表します。
【rwxr--r--】 の場合、
所有者:【rwx】 → 読み込み、書き込み、実行、
所有者と同じグループ:【r--】 → 読み込み、
その他:【r--】 → 読み込み、
の権限を与えるという意味です。

同じようにして【rwxr-xr-x】 の場合、
所有者:【rwx】 → 読み込み、書き込み、実行
所有者と同じグループ:【r-x】 → 読み込み、実行
その他:【r-x】 → 読み込み、実行
です。

数字での表記

次はパーミッションを数字での表記について書きます。

4:読み込み
2:書き込み
1:実行
0:権限を与えない
となります。

数字で表す場合は、更に数字を足し合わせます。
なので3がありません。1+2と区別がつかなくなってしまいますので。

読み込みの権限だけ与えるなら、【4】
読み込み、書き込み権限を与えるなら、【6】(4+2)
読み込み、書き込み、実行権限を与えるなら、【7】(4+2+1)
読み込み、実行権限を与えるなら、【5】(4+1)
となります。

アルファベット形式と同じように、左から、所有者、所有者と同じグループ、その他の順に表記します。
【744】(アルファベット形式では【rwxr--r--】) の場合、
所有者:【7】 → 読み込み、書き込み、実行、
所有者と同じグループ:【4】 → 読み込み、
その他:【4】 → 読み込み、
の権限を与えるという意味です。

同じようにして【755】(アルファベット形式では【rwxr-xr-x】) の場合、
所有者:【7】 → 読み込み、書き込み、実行
所有者と同じグループ:【5】 → 読み込み、実行
その他:【5】 → 読み込み、実行
です。

ディレクトリパーミッションの設定値

ディレクトリの場合も表記方法は同じなのですが、権限の意味がファイルと少し違っています。
r:ディレクトリ内に何のファイルがあるのか取得する権限
w:ディレクトリ内のファイルの追加、削除、リネーム、パーミッションを変更する権限
x:ディレクトリに移動する権限(この権限がないとディレクトリ内のファイルの所有者やサイズなどの情報が取得できません)
を与えるという意味になります。

またディレクトリパーミッションは、下位ディレクトリにも影響を与えます。
ディレクトリAの下にディレクトリBがあるとします。 ディレクトリAのパーミッションで自分に実行権限を与えていない場合、ディレクトリBで実行権限を与えてもディレクトリBの下にあるファイルを実行できません。
ディレクトリA ・・・ パーミッション704
 └ディレクトリB ・・ パーミッション705
  └ファイルB  ・・ パーミッション604
の場合、ファイルBを実行できません。

スクリプトファイルのパーミッション

レンタルサーバーにいくつかソフトウェアをインストールされたことがある方なら、ここまでお読みになって「あれ?Perlのスクリプトファイルにはパーミッション設定したけれど、PHPのスクリプトファイルにはパーミッション設定をしたことはないな。」と思われたかもしれません。

PHPファイルは【644】など、実行権限がない設定になっているかもしれません。
これはWebサーバーから動かすPHPが特殊、と思ってください。普通は【755】など実行権限を与える設定にします。Perlなどは実行権限を設定しているはずです。
Webサーバーではなく、cronからPHPを動かす場合は、実行権限のあるパーミッションを設定しないといけません。cronをサポートしているサーバーならマニュアルにパーミッション値が書いてあるはずなので参照してください。

外部へ漏れてはいけないファイルは権限を与えない設定を

Webサーバーに外部から書き込みはおろか、読み込み(閲覧)すらできてはいけない大切なファイルを置くことがあります。 この場合、ディレクトリやファイルのパーミションを正しく設定しないと大切な情報が丸見えになってしまいますのでご注意ください。

所有者がユーザーのファイルに、パーミッション【600】(【rw-------】)と【604】(【rw----r--】)を設定してリンクを貼っておきます(ディレクトリパーミッションは【755】です)。どのような振る舞いをするか試してみてください。
パーミッション【600】 403 Forbidden(アクセス禁止)エラーが出でアクセスできません。
パーミッション【604】 アクセスできるのでファイルの中身が見えます。