バーチャルホスト用サーバーの構築にあたり、suExecをやめてmod_ruidを導入した。
OSはCentOS5.x

suExecとは違って、DSO版のPHPに対してもuidが設定されるところが、suExecに対するメリット。

インストール手順

まずはじめに、suExecを無効にする。

# mv /usr/sbin/suexec /usr/sbin/suexec.disabled
# /etc/init.d/httpd restart

libcap-devel及びhttpd-develをインストール。

# yum install libcap-devel
# yum install httpd-devel

mod_ruidをダウンロードしてインストール

# wget http://websupport.sk/~stanojr/projects/mod_ruid/mod_ruid-0.6.tar.gz
# tar xvzf mod_ruid-0.6.tar.gz
# apxs -a -i -l cap -c mod_ruid.c

最後にhttpdを再起動

# /etc/init.d/httpd restart

テスト

httpd.confのVirtualHostディレクティブに以下のような行を挿入して再起動する。

RMode config
RUidGid user group

以下のようなphpスクリプトを作成して、作成されたファイルのパーミッションを確認したら、設定したuser、groupであることを確認できた。

<?php
file_put_contents(dirname(__FILE__).'/test.txt', 'test');
print 'OK';
?>

Perl/CGIでも同様のテスト。

#!/usr/bin/perl

print "Content-type: text/html\n\n";

open(OUT, "> test.txt");
print OUT 'test';
close(OUT);

print 'OK';
exit;

試しにcgiのオーナーをrootに変更してパーミッションを744(rootのみ実行可)に変更したら、期待通りエラーが出た。

さらにオーナーがrootのままパーミッションを755に変更したら、httpd.confで指定したユーザーでファイルが生成された。これも期待通り。

たしか、suExecではCGIスクリプトのオーナーがsuExecで指定されたユーザーと違う場合は動かないので、この挙動はsuEXecとは違うみたい。柔軟性がある?ということで。(笑)