Linux Apache suexecでcgiが動かない

linux

yumでインストールしているapacheでsuexecが動作しなかったため、その解消法まとめ。いろんな方が情報公開してくれていますが、わかりやすいまとめ方をしてくれていた方のサイトは下記。

httpd CGI SuEXECで、[Internal Server Error] (CentOS7)
httpd 2.4、CentOS7系で、SuEXECで、Internal Server Errorに少しはまった件です。httpdは、yumでインストールをしています。「パーミッション」「権限」の重要性デザイン系のWEB制作者でも、「パーミ

なので、細かい説明は省略して、自分の環境で解消した方法だけ抜粋。

環境と作業前

・centOS7
・apache2.4

# apachectl -V | grep suexec
 -D SUEXEC_BIN="/usr/sbin/suexec"

# apachectl -M | grep suexec
 suexec_module (shared)

# /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"

テスト用のcgiファイルは下記

# ls -l
-rwxr-xr-x 1 ftptest ftptest 70  9月  2 19:24 test.cgi

# cat test.cgi
#!/bin/perl
print "Content-type: text/html\n\n";
print "Hello World";

まずはsuexec無しでアクセスすると正常にアクセスできること確認

続いて、virtualhostに下記を足して、apacheリスタート

  SuexecUserGroup  ftptest ftptest

アクセスしなおすと下記の様な状態
・ログにもいろいろ出てたけど、転記がめんどくさくなったので割愛

対応方法

環境によってUIDの最小値などが原因ということもあると思うが、自分の環境ではsuexecのDocumentRootの場所権限で治った。

suexecのDocumentRootの場所はapacheをソースから入れるとコンパイル時に指定したものが反映されるっぽいが、yumでインストールしていたのでデフォルトの「/var/www」となっていた。変更するには、binaryファイルを書き換えないといけない。。。壊れると使えなくなるので、やる前に必ずバックアップ取ることを推奨

バイナリーモードで開く

# vi -b /usr/sbin/suexec

開いた状態で下記を実行

:%!xxd

DocumentRootの場所を変更
・16進数の部分を変更するだけでOK。(右端はそのままでOK)
・バイナリ変換は下記サイトのツールを利用
 https://rakko.tools/tools/74/
・「/var/www」を「/home」に変更

0002100: 6170 6163 6865 002f 7661 722f 7777 7700  apache./var/www.
 ↓
0002100: 6170 6163 6865 002f 686f 6d65 0000 0000  apache./var/www.

編集後は元の表示に戻して保存

:%!xxd -r
:wq!

確認

# /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"

権限も変更

# ls -l /usr/sbin/suexec
-r-x--x--- 1 root apache 15368 11月 17  2020 /usr/sbin/suexec

# chmod 4711 /usr/sbin/suexec

# ls -l /usr/sbin/suexec
-rws--x--x 1 root apache 15368  9月  2 19:34 /usr/sbin/suexec

これで表示されるようになった。何故この権限なのかはまたの機会に。疲れた。

コメント