CentOS 7 上で、Apache を 2.4.6 から 2.4.54 にバージョンアップしたら CGI が実行できなくなった。
一旦 2.4.6 をアンインストールして、iusレポジトリから yum で 2.4.54 をインストールしたんだが、CGI を実行すると Internal Server Error になる。
error_log には、
End of script output before headers: hogehoge.cgi
としか出てない「何が原因がわからないエラー」だ。「End of script output before headers」って、「Content-type: text/html;charset=UTF-8」のようなヘッダ部すら送られない、つまり「プログラムがまったく実行されていない」状態である。
まあ、こういう場合は suEXEC 関係だろうな・・・と思い、/var/log/secure を見てみると、
Jan 7 11:23:42 httpd suexec[15490]: command not in docroot (/home/www/htdocs/hogehoge.cgi)
って。やっぱり「docroot」関連か。
# /usr/sbin/suexec -V-D AP_DOC_ROOT="/var/www"-D AP_GID_MIN=100-D AP_HTTPD_USER="apache"-D AP_LOG_SYSLOG-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"-D AP_UID_MIN=500-D AP_USERDIR_SUFFIX="public_html"
Document Root が /var/www になっている。
Apache 2.4.6 のときに Document Root を /home で作り直したのだが(DOcument Root が /home/www/htdocs なので)、2.4.54 にした際に suexec コマンドも作り直されてしまった。
suEXEC の設定は、コンフィグファイルのようなもので簡単に指定できない。
再コンパイルしてプログラムを作り直す必要があるのだ。(これがなかなか手間)
ただし、suEXEC 自体はなにかセキュリティ上の問題が出ているわけではないので、2.4.54 で作られる最新のものでなくても問題ないはずだ。
残念ながら、Web サーバ上の suexec は書き換えられてしまったが、予備機にまだ 2.4.6 のときのプログラムが残っている。
FTP で suexec コマンドを持ってきて置いてみた。
・・・が、
# suexec -V-bash: /usr/sbin/suexec: Permission denied
実行権限エラーが・・・
error_log にも、
Permission denied: exec of '/usr/sbin/suexec' failed
と出ているので、オーナーと実行権限を直してみる。
# chown root:apache /usr/sbin/suexec# chmod 510 /usr/sbin/suexec# /usr/sbin/suexec -V-D AP_DOC_ROOT="/home"-D AP_GID_MIN=100-D AP_HTTPD_USER="apache"-D AP_LOG_SYSLOG-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"-D AP_UID_MIN=500-D AP_USERDIR_SUFFIX="public_html"
実行できた。
ちゃんと suEXEC で実行される CGI のある Document Root が /home 以下になっている。ばっちり。
しかし、これで、error_log に Permission denied は出なくなったがやっぱり CGI は実行されない。
/var/log/secure には「failed to setgid」と。
Jan 09 22:00:50 httpd suexec[31741]: uid: (1001/hogeusr) gid: (1001/hogegrp) cmd: hogehoge.cgiJan 09 22:00:50 httpd suexec[31741]: failed to setgid (1001: hogehoge.cgi)
そうかそうか。結局、SUID 設定をしないとダメなのだな。
# chmod u+s /usr/sbin/suexec# ls -la /usr/sbin/suexec-r-s--x--- 1 root apache 15368 Apr 3 2020 /usr/sbin/suexec
これで、ばっちり CGI も suEXEC 有効で実行されるようになった。
今後は、Apacbe のバージョンアップをするときに suexec コマンドを別名で退避しておいて、Apache インストール後にもとに戻すようにしよう。
コメントする