yunomuのブログ

趣味のこと

ApacheでUserDir以下でCGIが実行できない

ApacheでUserDir以下でCGIが実行できないという話。

やったこと。
mod_userdirを有効化。

<IfModule mod_userdir.c>
    UserDir public_html
</IfModule>

......

<Directory /home/*/public_html>
    AllowOverride All
</Directory>

userのディレクトリをotherが読めるようにする。

# chmod 755 /home/user

CGIを実行できるようにする。

# cat > ~/public_html/.htaccess <<EOS
Options +ExecCGI
AddType application/x-httpd-cgi .cgi
EOS

CGIを書く。

# cat > ~/public_html/echo.cgi <<EOS
#!/bin/sh

echo "Content-Type: text/plain"
echo

echo "It will be fine, tomorrow!"
EOS

Apacheを起動してアクセスしたら500が出た。

userdir以下なのでsuexecのログを見てみる。suEXECというのは、sudoみたいにファイルオーナーの権限を使ってプログラムを実行するという仕組みです。この場合はuserの権限で実行してくれる。はず。なんだけど、(タイムスタンプは略)

# cat /var/log/httpd/suexec.log
uid: (222/user) gid: (500/user) cmd: echo.cgi
cannot run as forbidden uid (222/echo.cgi)

suexecがなんか文句言ってる。uidが見つからないって。ちゃんとあるよ。

suexecの設定を確認してみる。

# suexec -V
 -D AP_DOC_ROOT="/var/www"
 -D AP_GID_MIN=100
 -D AP_HTTPD_USER="apache"
 -D AP_LOG_EXEC="/var/log/httpd/suexec.log"
 -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
 -D AP_UID_MIN=500
 -D AP_USERDIR_SUFFIX="public_html"

userのUIDが500未満だからダメですって。
え、それどうすんの。

usermod -u UID USER
で変えて、chownでパーミッション変更してやるといいみたい。
リモート環境で、ログイン中のユーザのUIDは変えられないのでログインしなおすのがめんどい。