読み取り権限と実行権限の違いについて理解が曖昧だったので、改めて調べてみた。
結論
Linuxにおいて実行とは exec というシステムコールを使用することであり、このシステムコールは実行権限のみをチェックするから。
誤解しやすい事象
ディレクトリの権限
ディレクトリの場合は、書き込み権限と実行権限がセットになってはじめてファイルの作成がOKな状態になる。
またカレントディレクトリにとあるディレクトリがある場合は、そのディレクトリのリネームができるかどうかは、親ディレクトリの権限に依存し、そのディレクトリ自体の権限は関係ない。
またファイルに読み取り権限があっても、ディレクトリの実行権限がなければファイルにアクセスできない。
所有者について
実行権限を使用して作成されたファイル(ディレクトリ)の所有者は実行元になる。
PHPについて
(Apacheの)PHPモジュール
PHPモジュールを使用する場合は、コマンドラインでの php コマンドの実行(読み取り権限のみが必要 ※)に近い状態で、Linuxサーバーが直接実行するのではなくWebサーバーアプリ(Apache)により実行されるため、実行権限は必要ない。
PHP は Apache のモジュールとして登録されているため、PHP の実行エンジンは Apache の機能のひとつとして働く。
つまり PHP プログラムは Apacheユーザー権限で実行される。
この場合、Apache にセキュリティホールが見つかって不正な攻撃を受けた場合に、一般のユーザーよりも権限の少ないApacheユーザーで実行した方が安全というメリットがある。
便利な側面もあるが、ホスティングする場合は無駄に実行権限を引き渡す必要が生じるため、セキュリティリスクが生じる。
PHP の実行によって新しく作られるファイルは Apacheユーザーの所有物となるため、他のユーザーがファイルを簡単に削除することが出来なくなる。
例えば WordPress の管理画面から画像をアップロードしたり新しいプラグインを追加すると、それらのファイルは Apacheユーザーの所有物になるため、他のユーザーは削除することが出来ない。
これを解決する場合はCGI版を用いる必要がある。
※なぜ読み取り権限だけでいいのか
Apache の suEXEC 機能により、Apache ユーザは Web サーバを実行しているユーザ ID とは 異なるユーザ ID で CGI プログラムや SSI プログラムを実行することができるから。
CGI プログラムまたは SSI プログラムを実行する場合、通常は Web サーバと同じユーザで実行される。
だから、suで実行しているのと等しく、読み取り権限で実行しているのに等しい。
CGI版のPHPについて
ユーザーごとに実行権限を制御できるためホスティングに最適。
ちなみにPHPでもCGI(Common Gateway Interface)で実行する場合は、実行権限が必要になるため注意。
# 読み取り権限で実行可能
$ php test.php
# 実行権限が必要(ファイルの行頭にスクリプトインタプリタ「#!/usr/bin/php 」を指定する必要あり)
$ ./test.php
CGIはクライアント側のWebブラウザの要求に応じてWebサーバが外部プログラムを呼び出して、その実行結果がHTTPを介してクライアントのWebブラウザに送信される仕組みのことである。
PHPをCGIで実行する場合は、PHPコードをHTTPサーバーのプロセスとは別で実行し、その結果をHTTPサーバーに渡すという流れになるため、遅くなる傾向にある。
それを改善したFast CGIというものがある。
Fast CGIについて
これはCGIを実行する際に、該当プロセスを一定時間サーバー内に保持することで、次回以降、実行時の「プロセスの起動/終了」を省略し、 高速化や、プロセスの起動/終了に伴うCPUへの負荷を軽減することで、速度面で優れるとされるモジュール版PHPと同等の処理能力を持つ動作方式である。
一度「プロセスの起動」をすると、一定時間は「プロセスの終了」を することなく起動し続けることで、処理時間の大幅な短縮と、プロセスの起動/終了に伴うCPUへの負荷を軽減する。