質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

5回答

20482閲覧

PHPが出力するファイルの所有者について

snic518

総合スコア39

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

4グッド

1クリップ

投稿2016/02/18 11:30

編集2016/02/19 07:28

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の設定

apache

1# httpd.conf のユーザー設定 2User apache 3Group apache 4# ドキュメントルート 5DocumentRoot "/var/www/html" 6

FTPの設定

FTP

1#vsftpd.conf 2#アップロードファイルのパーミッションが664になるように設定 3local_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スクリプトと同じに揃えたいと思います。

####解決策の方向性について
お作法を含め、こういった時はどうするのが良いのか、アドバイスをいただけると幸いです。

①Apacheの実行ユーザーを変える
ApacheのUserをhogeにしてしまうというやり方ですが、調べてみるとあまりいい方法ではないような記事が多いです。
実際のところどうなのでしょうか。

②PHPスクリプトもすべて所有者をapacheにしてしまう
hogeユーザーによるファイル編集は諦め、逆にapacheユーザーで揃えてしまうようにする。それはそれでキレイなのかもしれませんが、ちょっと運用上面倒そうです。

③PHPがファイル生成時に所有者を書き換える
環境はこのまま、スクリプトの方で、ディレクトリ作成やファイル書き込みをした直後にsystem関数とsudoコマンドで所有者を無理やり書き換えていく方法です。出来なくはなさそうですがとても面倒くさそうですし、お作法としてどうなのか気になります。

■その他
suEXECという方法があるようですが、ちょっと難易度が高そう・制約がありそうだったので、まずはそれ以外で実現出来ないかを検討したく、ご質問させていただきました。

そもそも一般的には、apacheユーザーとドキュメントルート以下のユーザーについてはどうされるものなのか等、ご意見いただけますと幸いです。

miyabi-sun, arly_times, afroscript, ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

sgidビットでいけるんじゃないですかね。

複数のユーザーで共有ディレクトリを使いたい

投稿2016/02/18 12:12

編集2016/02/18 12:13
ogaaaan

総合スコア765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

snic518

2016/02/19 05:18

コメントありがとうございます。 とても便利そうだったので、実際にやってみました。 chown hoge:hoge /var/www/html chmod g+s /var/www/html こうすると、確かにそれ以下で生成されるファイルやディレクトリのグループはhogeになりました。 ですが、ownerはapacheのままでした。 調べたところ、suidビットもあったので、それも試してみました。 chmod u+s /var/www/html これは、結果変わらずでした。 ですので、ファイル生成元のPHPファイルにもsuid,sgidを付けてみました。 chmod ug+s /var/www/html/index.php これを実行しても、やはり生成されるディレクトリ・ファイルのownerはapacheのままでした。suidビットでは、ownerまでは変わらないのでしょうか。
TaichiYanagiya

2016/02/19 06:25

ディレクトリへの setuid は効きません。 オーナーが違っても、hoge グループで Writable であれば、hoge ユーザーで変更、削除できますよね。
guest

0

自己解決

コメントくださった方々、ありがとうございました。
今回、下記の方法でやりたかったことが出来たので、自己解決とさせていただきます。

まず、環境のところなのですが

※PHPはモジュールモードで動作

これにこだわらず、PHP-FPMで動かせばuserは /etc/php-fpm.d/www.conf で指定出来るようだったので、試してみました。

yum install --enablerepo=remi-php70 php-fpm

これで下記がインストールされました。
php-fpm.x86_64 0:7.0.3-1.el7.remi

更に、Apacheのconf.dにconfファイルを新規作成しました。
※デフォルトでは作成されなかったみたいです。

vi /etc/httpd/conf.d/php-fpm.conf

apache

1# php-fpm用の設定 2ProxyPassMatch ^(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/$1 3DirectoryIndex /index.php index.php

※ドキュメントルートの所有者は、hogeに変更したままです。

また、PHP-FPMの実行ユーザーも変更します。

vim /etc/php-fpm.d/www.conf

php

1; RPM: apache Choosed to be able to access some dir as httpd 2;user = apache ←デフォルトの値 3user = hoge 4; RPM: Keep a group allowed to write in log dir. 5;group = apache ←デフォルトの値 6group = hoge

これで、PHP-FPMを起動、httpdを再起動します。

systemctl start php-fpm
systemctl enable php-fpm
systemctl restart httpd.service

それぞれ、無事に起動しました。

phpinfo();を実行したページを確認すると、
Server APIがFPM/FastCGIになっていました。

さらに、下記のPHPを実行してみます。

php

1//実行ユーザーとファイル所有者の確認 2echo "user : ".posix_getpwuid(posix_geteuid())['name']."<br>"; 3echo "file owner : ".get_current_user()."<br>";

user,file ownerともに「hoge」になっていました。

また、同様のスクリプトでディレクトリ作成、ファイル作成を行うと、所有者が「hoge」で作成されることも確認しました。
どうやらこれでやりたかったことが出来たようです。

ついでにですが、Apache2.4.6ですので、MPMをEventにしてみてパフォーマンスアップにもなるのではということもあり、このままPHP-FPMで運用するようにしようと思います。

ありがとうございました。

投稿2016/02/19 07:22

snic518

総合スコア39

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ogaaaan さんの回答のとおり、ディレクトリへ setgid + PHP側で umask(002) としてファイル、ディレクトリを作成すれば、オーナー:apache、グループ:hoge で g+w (ディレクトリならさらに g+s)なものが作成されます。
オーナーが違っても、hoge ユーザーで変更、削除できます。

他に、mod_suphp を使う方法もあります。

投稿2016/02/19 06:31

TaichiYanagiya

総合スコア12141

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

snic518

2016/02/19 07:25

コメントありがとうございます。 グループ権限の指定があれば、確かに読み書きする上では問題はなさそうですね。 ちょっと別の方法で解決できましたので、自己解決を書かせていただきました。 ご意見ありがとうございました。
guest

0

  • apacheユーザーがファイルを生成する
  • hogeもファイルを読み書きしたい

普通に考えればパーミッション666ですよね。
他にも664であれば同じグループのユーザーも触れるので、hogeとapacheは違うユーザーですが、
所属グループを同一にしてしまうというもの対策の一つかと思います。

投稿2016/02/18 12:31

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

snic518

2016/02/19 05:11

コメントありがとうございます。 apacheはすでにhogeと同じグループにしているので、パーミッションさえ合えば問題ないのですが、PHP出力するファイル・ディレクトリの標準のパーミッションが644だったり755だったりするので、常にchmodしないといけないようですね。
guest

0

以前業務で作成したシステムでは③に該当する形でスクリプトを組みました。

使用した関数は下記のページに載ってるやつです。
http://www.php-ref.com/b2api/03_chmod.html

※注
PHPでスクリプトを組めない場合や、ファイルが多岐にわたる場合はcron等で定期的にファイルのオーナーと実行権限を変更していました。

投稿2016/02/18 12:20

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

snic518

2016/02/19 05:12

コメントありがとうございます。 ファイル生成のたびに処理を入れる方向ですね。 cronは処理のタイミングや、ファイル・ディレクトリ数が膨大だったりする場合の負荷を考えるとちょっとむずかしそうですね…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問