質問: PHPプログラムから、テキストや画像ファイルを出力するような仕組みをもったWebアプリケーションを作っています。 この時出力されるファイルの所有者について、ご質問させていただきたく思います。 環境は以下です。 * VPS(さくらVPS) * CentOS7 * Apache 2.4.6 * PHP 7.0.3 ※PHPはモジュールモードで動作 ※SELinuxはオフにしています。 #### 【やりたいこと】 Webアクセス時のドキュメントルート以下にあるファイルは、全てhogeユーザーが所有者ということにしたい。 hogeユーザーは、FTPでドキュメントルート以下にアクセスし、ファイル書き込み操作を行うことがあるため、所有者がすべてhogeの方が都合が良い。 ``` ディレクトリ構成 /var /www /html ← ownerはhoge index.php ← ownerはhoge generated.txt ← PHPで出力されるファイル。ownerをhogeにしたい ``` #### 各種設定 Apacheの設定 ``` # httpd.conf のユーザー設定 User apache Group apache # ドキュメントルート DocumentRoot "/var/www/html" ``` FTPの設定 ``` #vsftpd.conf #アップロードファイルのパーミッションが664になるように設定 local_umask=002 ``` ■ユーザーについて id hoge uid=1000(hoge) gid=1000(hoge) groups=1000(hoge),10(wheel) id apache uid=48(apache) gid=48(apache) groups=48(apache),1000(hoge) 上記のようにapacheにはhogeのグループを追加しています。 これで、hogeユーザーがFTPアップロードしたファイルを、PHP(apache実行ユーザー)が書き込み操作出来るというところまでは出来ました。 ### 問題点 この状態ですと、PHPが新規のファイルやディレクトリを生成したときの所有者はapacheになります。 ``` ディレクトリ構成 /var /www /html ← ownerはhoge index.php ← ownerはhoge /gdir ← PHPがmkdirしたディレクトリ。ownerはapache。パーミッションは755 generated.txt ← ownerはapache。パーミッション644で書き込み不可! ``` この時のgenerated.txtをhogeが消したりすることもあるため、書き込み権限が無いファイルが出来てしまうので困ります。 できれば、PHPが生成するファイルの所有者は、PHPスクリプトと同じに揃えたいと思います。 #### 解決策の方向性について お作法を含め、こういった時はどうするのが良いのか、アドバイスをいただけると幸いです。 **1Apacheの実行ユーザーを変える** ApacheのUserをhogeにしてしまうというやり方ですが、調べてみるとあまりいい方法ではないような記事が多いです。 実際のところどうなのでしょうか。 **2PHPスクリプトもすべて所有者をapacheにしてしまう** hogeユーザーによるファイル編集は諦め、逆にapacheユーザーで揃えてしまうようにする。それはそれでキレイなのかもしれませんが、ちょっと運用上面倒そうです。 **3PHPがファイル生成時に所有者を書き換える** 環境はこのまま、スクリプトの方で、ディレクトリ作成やファイル書き込みをした直後にsystem関数とsudoコマンドで所有者を無理やり書き換えていく方法です。出来なくはなさそうですがとても面倒くさそうですし、お作法としてどうなのか気になります。 ■その他 suEXECという方法があるようですが、ちょっと難易度が高そう・制約がありそうだったので、まずはそれ以外で実現出来ないかを検討したく、ご質問させていただきました。 そもそも一般的には、apacheユーザーとドキュメントルート以下のユーザーについてはどうされるものなのか等、ご意見いただけますと幸いです。
回答: 以前業務で作成したシステムでは3に該当する形でスクリプトを組みました。 使用した関数は下記のページに載ってるやつです。 http://www.php-ref.com/b2api/03_chmod.html ※注 PHPでスクリプトを組めない場合や、ファイルが多岐にわたる場合はcron等で定期的にファイルのオーナーと実行権限を変更していました。