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