PHP

Apache2 で PHP をユーザー権限で動かす

問題

Apache2 で普通に DSO モジュールで PHP を動かす(mod_php)と、 Apache2 のユーザー権限で動いてしまう。(FreeBSD のデフォルトでは www:www ユーザー)

この場合、PHP スクリプトやそれによってアクセスされるファイルは www:www ユーザーでアクセスできる必要があり、other にアクセス権限を与えなくてはいけない。 すると、誰でもそのファイルにアクセスできてしまう。 これはセキュリティホールとなる。

対策

http://solaris.bluecoara.net/tdiary/?date=200402 を参考に

  • suEXEC でCGI版を動かす。
    • php ファイルの先頭行に #!/usr/local/bin/php が必要。多大な修正コストがかかる。
  • mod_become を使う
    • Apache1.3 なので Apache2 ではダメ。
  • mod_action で CGI 版を DSO 版に見せかける
    • スクリプトをかぶせないとダメ。
  • mod_proxy や mod_rewriteでユーザ権限のApacheに転送
  • mod_suid2 を使う
  • Perchild MPM を使う
    • VirtualHost 単位で uid:gid の設定はできるが、ユーザー単位ではない。
  • Metux MPM (Multiplexer MPM) を使う
    • VirtualHost 単位で uid:gid の設定はできるが、ユーザー単位ではない。
  • suPHP を使う
    • CGI版 PHP に振っている。パフォーマンスは CGI 並に落ちる。
    • ファイルの所有者の権限に切り替わる。おそらくもっとも望ましい動き。

suPHP インストール

cd /usr/ports/www/suphp
make install WITHOUT_CHECKPATH=yes

WITHOUT_CHECKPATH の設定が必要。 これがないと、DocumentRoot 以下に PHP スクリプトがあるかどうか判定されるため、 標準の DocumentRoot では、~user/public_html にある PHP スクリプトがエラーになってしまう。

インストールすると以下の行が httpd.conf に追加されている。

LoadModule suphp_module       libexec/apache2/mod_suphp.so

最低でも、httpd.conf に以下の設定が必要。

suPHP_Engine on

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-07-04 (火) 18:30:53 (4344d)