WEBサイトやWEBシステムをWEBサーバー上に設置する際に、ファイルのパーミッションの問題に遭遇するケースが度々あると思います。
そこで、WEBサーバーにおいてのファイル・ディレクトリのパーミッションについて考えてみたいと思います。
ファイルパーミッションとは
まず、ファイルのパーミッションとは何か。
ファイルには、ファイルの所有者(作成者)、ファイルの属するグループ、所有者、グループ、
その他のユーザーに対するファイルへのアクセス権限のデータを持っています。
ファイルのアクセス権限は3つあり、Read(読み込み)、Write(書き込み)、eXecute(実行)の権限が設定されています。
それぞれの権限を数字で表すことができ、Readは4、Writeは2、eXecuteは1とされていて、この数字を足すことでファイルの権限を表すことができます。
例えば、
6 => Read(4) + Write(2), 4 => Read
のような形です。
この数字をファイル所有者、グループ、その他のユーザーに対する権限として3つ並べることで、ファイルへのアクセス権限が表現されます。
例えば、
644はオーナーに読み込み・書き込み権限、グループに読み込み権限、その他のユーザーに読み込み権限が与えれている設定です。
WEBに公開するファイルはどう設定すればいいか?
例えばFTPでhtmlファイルをアップした場合、そのファイルの所有者はFTPにログインしたユーザーとなり、
グループはそのユーザーのメイングループ(メイングループ、サブグループについては後述します)となります。
WEBで公開されているファイルは、ブラウザを通して一般の人が見れる必要があるので、その他のユーザーに対して読み込み権限があれば良いと
考えてしまうかもしれませんが、それは間違いです。(結果としては同じ設定になりますが。)
上記が間違っている理由は、一般の人はブラウザを通して、WEBサーバー上に設置されているファイルに直接アクセスしているわけではないからです。
ファイルに直接アクセスしているのは、Apacheというプログラムで、Apacheはブラウザから指定されたファイルを読み込み、その内容をブラウザに渡しています。
なので、Apacheがファイルの読み込みを行えるパーミッションにする必要があります。
プログラムがファイルにアクセスする際のユーザーカテゴリーは、プログラムの実行者に属します。
一般的な設定では、Apacheのプログラムを実行しているユーザーは、apacheという名前の普通のユーザーでして、これはその他のユーザーのカテゴリに属します。
ですので、htmlファイルなどのWEBに公開するファイルのパーミッションは、その他のユーザーに読み込み権限を与えればいい、ということになります。
PHPファイルは?
PHPファイルはプログラムなどで、実行権限が必要と考えてしまいますが、Apacheのデフォルトの設定では読み込み権限があれば動作します。
Apacheのデフォルトの設定では、PHPはモジュールモードとして動作していて、PHPのソースコードをApacheが読み込み、PHPモジュールとして実行するので、
読み込み権限のみ与えておけば大丈夫です。
ログファイルなどのプログラムから書き込まれる必要があるファイルには、書き込み権限を与える必要があります。
ディレクトリは?
ディレクトリのパーミッションもRead、Write、eXecuteで表され、ファイルのように数字でも表現されますが、若干認識が異なります。
Readはディレクトリ内のファイルの一覧を閲覧できる権限
Writeはディレクトリ内にファイルを作成、削除できる権限
eXecuteはディレクトリ内のファイルにアクセスできる権限
となっています。
ですので、一般的なディレクトリのパーミッションとしては、その他のユーザーに5と設定すれば良いと思います。
プログラムからファイルをアップロードされるディレクトリには書き込み権限も与え、7と設定すれば良いと思います。
グループ?
ファイルの所有者やその他ユーザーというのはLinuxに慣れていなくてもイメージが付きやすいと思いますが、
Linuxになれていないとグループというものがイメージしづらいと思います。
グループって普通は1つのものが複数のグループに属することができますよね。
でも上記で見たとおり、1つのファイルに対してファイルのグループは1つになっています。
Linuxでのユーザーは複数のグループに属することができますが、メイングループとサブグループに分かれていて、
メイングループとしては1つのグループのみに属することしかできません。
なので、ファイルのグループというのは、ファイルの所有者のメイングループということになります。
ファイルにアクセスする際には、ユーザーの属しているメイン・サブグループのどちらかにファイルのグループがあれば、
グループのアクセス権限が適応されることになります。
まとめ
WEBに公開するファイルのパーミッションは基本的には644、ディレクトリは755となると思います。
ファイルをFTPでアップロードするユーザーが複数いて、アップできるディレクトリをグループで管理したい、という場合ですと、
上記のメイングループ、サブグループの違いを考慮してファイル・ディレクトリに対するパーミッションを設定する必要がでてきますね。