ApacheにはsuEXECという便利な機能があります。
suEXECの説明の前にUNIXのパーミッションやApacheの仕様について紹介したいと思います。

私はWindowsにてApacheをローカルサーバとしてCGIのテスト環境を構築していました。
今回FreeBSDサーバを立ち上げ、何気なくCGIを動作させようとしましたがなぜか実行できない。
WindowsではActive Perlをインストールしてperl.exeの絶対パスを指定したので当然以下のように変更しました。
#!/usr/local/bin/perl
とperlの絶対パスを指定しても無反応。

パーミッションとは?

実はUNIXではファイル、ディレクトリごとに所有者(アカウント)が決められていてファイル所有者の読み込み書き込み実行の三つの権限を設定できるようになっています。
所有者の権限だけでなく所有者に属しているグループ他人と三つの権限を設定できます。つまり9個の設定箇所があるんですね。
CGIを動作させるには実行を許可してあげましょう。

しかしここで疑問が。
Web上からアクセスするアカウントは一体なんなの?ということ。
このアカウントはApacheのhttpd.confというおなじみの設定ファイルに指定されています。

Apacheで動作するユーザ、グループを確認

ではviで確認してみましょう。(以下はapache22の場合)
vi /usr/local/etc/apache22/httpd.conf
このファイルの中にUserとGroupで指定されたアカウントがあると思います。
これがApacheのサーバよりアクセスしてくるアカウント名です。
私の場合では初期設定でユーザ、グループ共に「www」となってました。
他には「nobody」や「apache」などOSによって、Apacheのバージョンによって初期設定が異なるようです。
とにかくCGIの実行を許可するには所有者とは他人である「www」を許可しなければならないんですね。
三国志NETはファイル操作をするのでなぜか作成者が「www」となっていて「テンポラリファイルが作成できません。」などエラーが連発してました。
しかし他人に読み込み書き込み実行のすべての権限を与えることはあまり良いことではありません。
逆に私はファイルの所有者を「www」と設定しちゃってたんですが(これはやってはいけない!)、ファイルをアップロードしたり編集するアカウントと違うため権限が無く管理がしずらい。
というか最終的に所有者をwwwとしても他人を許可しなければならないわけで意味がない。

この問題を解決するためsuEXECという機能があります。

suEXECとは?

ようやく本題です。suEXECとはCGIやSSIの実行ユーザを指定したアカウントに変更してくれるものです。
CGIとSSIだけの実行時にユーザが変更してくれるので所有者だけに権限を与えたパーミッション設定が可能となります。
これは非常に便利かつセキュリティ的に良いのですが、実行するために必要な制限があるので注意してください。

参考:http://www.apache.jp/manual/suexec.html

Apacheの再構築

それではsuEXECを利用するためにApacheを再構築しましょう。
私は初期設定のままApacheをインストールしたため、まずはオプションであるsuEXECを有効にします。
cd /usr/ports/www/apache22
make config
portupgrade -f www/apache22
make configでsuEXECを選択し、portupgradeで再インストールしています。
参考:http://www.peach.ne.jp/freebsd/apache.html
portupgradeはインストールしていなかったのでこの時インストールしました。
参考:http://www.kishiro.com/FreeBSD/portupgrade.html

その後suEXECのオプションを指定して再び再インストールします。
make clean
make deinstall
make show-options
make WITH_SUEXEC=yes SUEXEC_DOCROOT=CGIがあるディレクトリ 他etc...
make reinstall
show-optionsでsuEXECのオプションを確認でき、make WITH_SUEXEC~でオプションの指定をしています。
最後に再インストール。

指定したオプションが設定されたか確認してみましょう。
suexec -V
suexecの設定を確認できます。

最後にsuEXECのユーザを指定する

お疲れ様です。suEXECのインストールが完了しましたが最後にモジュールの追加とsuEXECのユーザを指定します。
httpd.confに
LoadModule suexec_module libexec/apache22/mod_suexec.so

SuexecUserGroup user usergroup
ロードモジュールとsuEXECを実行するユーザを指定すれば完了です!
httpd.confを反映させるためApacheの再起動をしてください!
動作を確認するにはログを確認してみれば分かります。
私の場合以下の初期設定になっていました。
vi /var/log/httpd-suexec.log
CGIのディレクトリの所有者変更も忘れずに。

参考:http://blog.teachat.org/archives/50534970.html
   :http://www.toshikazu.org/archives/000009.html