恥ずかしながら、いや本当に恥ずかしながら、ファイルを変更するときのパーミッションにいて混乱してしまったので少しまとめておく。
OSはCentOS 5.2。



まず重要なことはこれ。

ファイルを変更、削除するのに必要なのはそのファイル自体のパーミッションではなく、そのファイルを格納しているディレクトリのパーミッション

...。
(そうだったのか...)


ディレクトリのパーミッション毎に可能な操作は以下の通り。

  • [r] そのディレクトリの一覧の参照が可能
  • [w] そのディレクトリ内のファイルの削除、名前変更が可能。新規作成が可能
  • [x] そのディレクトリにアクセス可能

ディレクトリの所有者と処理(例えば削除)を実行するユーザとを勘案すると、パーミッションと出来ることの例は次のような感じになる。

パーミッション毎に変更/削除できるユーザーの違い

誰でも削除できる

dir(777)
├ file1(755)
└ file2(644)

オーナーだけが削除できる

dir(755)
├ file1(755)
└ file2(644)

オーナーとグループメンバーが削除できる

dir(775)
├ file1(755)
└ file2(644)


ちなみに、プログラムで作成したディレクトリの所有者はApacheユーザ(例えばnobody)になる。変更や削除をプログラムでのみ行うのであれば、パーミッションはオーナーだけ触れるもの(7xx)で良いけれど、FTPでも操作したい場合には通常Apacheユーザとは違うユーザーでログインするので、操作ができなくなってしまう。

FTPユーザーがApacheユーザと同一グループに所属しているのであればグループユーザにも許可(77x)を、そうでなければその他のユーザに許可(7x7)を与える必要がある。まぁ、7x7はセキュリティ的に好ましいとは言えないけれども。



PHPでディレクトリを作成するときの注意

PHPでパーミッションを付加しつつディレクトリを作成するのは次の通りで出来る。

mkdir($new_dir, 0777);

...のだけど、umaskが設定されていると、0777で作成してもその通りにならない。
umaskが0022の場合、0777は自動的に0755になる。


このような設定でパーミッション0777のディレクトリを作る方法は以下のどちらか。

umask(0);
mkdir($new_dir, 0777);

mkdir($new_dir, 0777);
chmod($new_dir, 0777)


どちらも一手間掛かることを考えると、設定をいじらなくて済む2番目の方法の方が安心なような気はする。