====== suEXECを使いCGIをApacheの実行ユーザではなく、wwwユーザなどで実行する ======
csvファイルなどを open で開こうとした際に、以下のようなパーミッションエラーが発生した。
Can't open '< /var/www/.../test.csv' for reading: 'Permission denied' at test.cgi line 122
原因を調査したところ、どうやら CGI の実行を apache ユーザで行っているが、ファイルの所有者は www ユーザなためエラーが発生していた。
そこで suEXEC を使い、CGI の実行ユーザを www に変更する。
# まずは現在の設定を確認
$sudo 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"
# 上記のように表示される
# public_html 以下で suEXEC が有効となる
# suexec のパーミッションの確認
$ sudo ls -l /usr/sbin/suexec
-r-x--x---. 1 root apache 15448 6月 27 22:49 suexec
# suexec のパーミッションを変更
$ sudo chmod 4750 /usr/sbin/suexec
# httpd.conf の設定
# ドキュメントルートが「public_html」以外なら変更
$ sudoedit /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/public_html"
# vhost.conf、vhost-le-ssl.conf などのバーチャルホストの設定
sudoedit /etc/httpd/conf.d/vhost.conf
sudoedit /etc/httpd/conf.d/vhost-le-ssl.conf
# 実行ユーザを変更したいバーチャルホスト設定内に以下を追加
SuexecUserGroup www www
# 既存サイトが public_html 以外にあるなら移動する
sudo cp -a /var/www/test.co.jp /var/www/public_html
# 文法チェック
apachectl configtest
# 再起動
sudo apachectl graceful
# ログ確認
journalctl -f
サイトにアクセスし、Permission denied が解消されたか確認する。