Apacheでsuexec

Apacheから呼び出されるCGIで他のホストのファイルを削除するというリクエスト。sshでrmを叩けばいいんだけど、当該仮想ホストはnobody:nobodyで動作しているため鍵の交換がうまくいかない。
そこでsuexecを利用して他のユーザでcgiを動作させる。

再configure

以下のオプションをつけてapache2.4.3を再conigure,make,install

$ ./configure --enable-suexec 以下略
$ make
# make install

CGIが入っているディレクトリのオーナを変更

当該CGIが入っているディレクトリ以下のオーナを変更。以下で指定するsuexecする後のuserid,groupidはデフォルトでは500以上でないとNGです。それ以下の場合はconfigureで指定。
以下の例では user/group = hoge/hoge で実行する場合です。

# chown -R hoge:hoge /usr/local/apache2/htdocs/hogehoge
# chmod 755 /usr/local/apache2/htdocs/hogehoge

httpd.confを編集後、apacheを再起動して確認。

httpd.confに以下の行を追加。

LoadModule suexec_module modules/mod_suexec.so

また当該仮想ホストの設定中に以下の一行を追加。

    SuexecUserGroup     hoge hoge

apacheを再起動して確認。

# /usr/local/apache2/bin/apachectl stop
# /usr/local/apache2/bin/apachectl start

で、確認すると500エラー。
suexec_logを確認すると以下の一行。

[2012-08-28 17:20:00]: user mismatch (nobody instead of www)

ああ、callerを設定していなかった。suexecを叩くのはこの環境ではnobodyですからconfigure時に--with-suexec-caller=nobodyをつけないと。ということで再configure。

再conigureする。

$ ./configure --enable-suexec --with-suexec-caller=nobody (以下略)
$ make
# make install

apacheを再起動して確認

こんどはうまく動作しました。
あとssh鍵を設定しないと。