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"

<Directory "/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 が解消されたか確認する。