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
これで表示されるようになった。何故この権限なのかはまたの機会に。疲れた。
コメント