今日は寒いですね。
まぁこれは氷点下行ったなと思ったが、アメダスは最低0.3度とのこと。
だけど場所によっては氷点下行ってるでしょうし。
あと今日は一日中気温が上がらなかったな。
寒い寒い。まぁそんな季節がきたということです。
昨日のPHP・FastCGI・SuExecの組み合わせを調べていた話の続き。
そうそう、PHPがphpinfo()で--enable-fastcgiとなってなくても、CGI動作で確かめてみると入ってるかも。
あと、Vineではphp5-fcgiとかなってたけど、php-cgiを使うこともあるし、それでもOK。
とにかくCGI動作でphpinfo()で–enable-fastcgiとなってれば間違えないでしょう。
さて、ユーザーごとにFCGIWrapperが必要であるという前提でいろいろ調べていた。
どこかのWebスペースでCGI版PHPの使い方として挙げられていた方法を参考にしてみた。
PHPを使うユーザーはFCGIWrapper用のシェルスクリプトを用意し、.htaccessで定義しろと。
というわけで、まず各人のpublic_htmlに置く、php5-fcgiというシェルスクリプト。
#!/bin/sh
exec /usr/bin/php5-fcgi
まぁそのままですね。これはパーミッション700で配置。
これでコピーしなくても各ユーザー所有のFCGIWrapperが用意できますね。
.htaccessでこれを定義する。残念ながらhttpd.confなどに埋め込むのは現実的でないので…
FCGIWrapper /home/hidemaro/public_html/php5-fcgi .php
これはパーミッションは644ですね。
.htaccessで定義できるようにAllowOverrideを設定しておく。
これでOK。各ユーザーの権限でPHPを実行できるでしょう。
もちろん動かすディレクトリではOptions +ExecCGIをしておいてね。
さて、SuExecでのパーミッションを検討してみる。
まずHTML・PNGなどはApacheユーザーから読めないとダメなので644、
けどPHPからのみ読み書きするファイルはApacheから読めなくていいので600。
そしてPHPはいままで読めればよかったが、CGI動作では実行権が必要、
だけど自分だけ実行できればよいので700、他のCGIも同様。
ディレクトリは711にするといいと思う。ディレクトリにファイル作るとしても自分だけだし。
あと、public_htmlは普通に711にすればOK。
というわけでめでたしめでたし、と行きたいのだが、以前から気になってたこと。
/home/foo/public_htmlを711にするのはよいのだが、
その前に/home/fooを711にする。
しかしこうすると他のユーザーから、例えば/home/foo/.bashrcとかにアクセスできてしまうことがある。
もちろん他ユーザーの読みこみ権などを消しておけばこんな問題は無い。
ディレクトリの実行権とは、その下のファイルにアクセスできるという意味。
だからディレクトリが実行可で、その下のファイルが読みこみ可だと…
というわけで標準では700となってるのだが、public_htmlがあると711にしないといけない。
けど誰からでも見えるのは、よろしくないよなぁ…
と考えるのならば/home/fooの所有グループをapacheにして、710とする。
これでapacheグループ以外は見れない。これでかなりましかなと。
ただ、所有グループの変更はrootがやる必要がありそう。
という非常にめんどくさい処理はPerlにやらせるのが正解ですね。
#!/usr/bin/perl
use strict;
use warnings;
my @users=qw( foo bar );
my $apachegid=( getgrnam('apache') )[2];
for(@users){
my ($uid,$gid)=( getpwnam($_) )[2,3];
my $homedir="/home/$_";
my $htmldir="$homedir/public_html";
mkdir($htmldir) if(! -e $htmldir);
chown($uid,$gid,$htmldir);
chmod(0711,$htmldir);
chown($uid,$apachegid,$homedir);
chmod(0710,$homedir);
my $fh;
open($fh,'>',"$htmldir/php5-fcgi") or die;
print $fh "#!/bin/sh\nexec /usr/bin/php5-fcgi\n";
close($fh);
chown($uid,$gid,"$htmldir/php5-fcgi");
chmod(0700,"$htmldir/php5-fcgi");
open($fh,'>',"$htmldir/.htaccess") or die;
print $fh "FCGIWrapper $htmldir/php5-fcgi .php\n";
close($fh);
chown($uid,$gid,"$htmldir/.htaccess");
chmod(0644,"$htmldir/.htaccess");
}
長いですね。非常にベタな書き方ですね。
ここでは、
public_htmlをなければ作成し、public_htmlの所有権をそのユーザーに、パーミッションを711に、
ホームディレクトリをapacheグループに設定して、パーミッションを710に、
FCGIWrapper用のphp5-fcgiを作成し、所有権をそのユーザー、パーミッションを700に、
.htaccessを作成し、所有権をそのユーザー、パーミッションを644に。
ということをやっている。
apacheの実行グループ名とか、phpの実行ファイル名とかは適当に設定すればいい。
既存の.htaccessがあるのなら’>’でなく’>>’とするべきだろうか。
これでOKなはず。
新規ユーザー作るときこれと同じ処理をすればいいですね。
これで一件落着。めでたしめでたし。