SuEXECの設定

Apache2.0でSuExecを使えるように設定しました。
割と引っかかった事があったのでメモ。

コンパイル

SuExecはデフォルトでは有効になっていません。
コンパイル時に指定する必要があります。
configureの時点で下記のオプションを設定します。

  • --enable-suexec
    • SuEXECを有効にします
  • --with-suexec-caller
    • SuEXECを実行するユーザーを設定します。実行専用ユーザーをapacheで設定したので「apache」に指定しました
  • --with-suexec-docroot
    • SuEXECを実行できるディレクトリを指定します。これを指定しないと思ったところで実行できなくなってしまいます
  • --with-suexec-userdir
    • ユーザーディレクトリで実行するディレクトリ名を決めます。「public_html」に指定しました
  • --with-suexec-uidmin
    • UIDの最小値を決めます
  • --with-suexec-gidmin=500
    • GIDの最小値を決めます

これらの値を指定して、下記のようにconfigureを実行します。(その他の指定も含んでいます)

./configure --enable-suexec \
--with-suexec-caller=apache \
--with-suexec-docroot=/home \
--with-suexec-userdir=public_html \
--prefix=/usr/local/apache2 \
--enable-rule=SHARED_CORE \
--enable-ssl \
--enable-rewrite \
--enable-proxy \
--enable-so \
--enable-module=so


あとは普通に「make; make install」です。


インストールしたあと、SuEXECの設定は下記のコマンドで確認できます。

$ /usr/local/apache2/bin/suexec -V
 -D AP_DOC_ROOT="/home"
 -D AP_GID_MIN=100
 -D AP_HTTPD_USER="apache"
 -D AP_LOG_EXEC="/usr/local/apache2/logs/suexec_log"
 -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
 -D AP_UID_MIN=100
 -D AP_USERDIR_SUFFIX="public_html"

httpd.confの編集

Apacheの実行ユーザーは「User」「Group」の部分で設定します。

User apache
Group apache


SuEXECバーチャルホストの設定を行ないました。
Apache2.0では「SuexecUserGroup」で実行ユーザーを指定します。


ServerAdmin memememomo@gmail.com
DocumentRoot /home/hoge/www
ServerName 192.168.0.5
ErrorLog /home/hoge/wwwlogs/error_log
CustomLog /home/hoge/wwwlogs/access_log common
SuexecUserGroup hoge hoge


あとは、CGIの実行許可の設定です。

#AddHandler cgi-script .cgi
AddHandler cgi-script .cgi


Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all

引っかかったところ

なかなかCGIが正常に動いてくれませんでした。
その時の対処メモです。

Forbiddenが表示されてしまう

「/usr/local/apache2/logs/suexec_log」に下記のようなエラーメッセージが出力されていました。

directory is writable by others: (/home/hoge/www)


パーミッションが原因だったので、ディレクトリとアクセスファイルをそれぞれ「755」に設定しました。

プログラムが実行される前にエラーがでてしまう

CGIのエラーログに下記のようなメッセージが出力されていました。

Premature end of script headers:


SuEXECに限らず、他の原因でも出るようなエラーなのですが、今回は「AP_DOC_ROOT」の設定が不適切だったことが原因でした。
「/usr/local/apache2/bin/suexec -V」で、「AP_DOC_ROOT」のパスが正確であるかを調べます。
ここで設定されているディレクトリ以外でSuEXECを実行することはできません。
間違っていたら、設定されている場所で実行されるようにするか、
コンパイルをしなおす必要があります(configure時の--with-suexec-docrootオプション)。