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

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

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

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

PHP

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

Q&A

解決済

2回答

10017閲覧

PHPよりfopen('/path/to/file', 'ab'); が失敗する(Permission denied)

kyapiy

総合スコア16

Apache

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

PHP

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

0グッド

0クリップ

投稿2015/11/30 05:52

こちらの環境は、Apache2.4, PHP5.4 です。
お名前.comで借りたVPSサーバを利用し、PHPを利用しサーバ内のmysqlを利用したrssリーダーを作成していました。
管理上、csvファイルにRSSフィードを保存し、web上のフォームよりPHPを利用して新規登録を行う仕組みを作っています。
そこで、apache上のPHPからfopen関数を利用し追記モードでファイルを開こうとしたのですが、失敗します。
/var/httpd/error_logにはpermission deniedと書いてありました。

当該ファイルまでの、ディレクトリの権限は以下です。
root:root 775 /
root:root 1715 /var
root:apache 1770 /var/www
root:apache 1770 /var/www/html

追記したいファイル(/var/www/html/test.csv)の権限は root:apache 1660となっています。
httpd.confファイルのUser/Group設定も apache/apacheとなっています。
また、<Directory></Directory>設定もRequire all grantedとなっております。(ルートディレクトリのみRequire all denied)

また、sshを用いてmacより当該のサーバにrootユーザでログインし、そちらでsu apacheとしてからphp opencsvTest.phpでphpを実行した場合は書き込みできます。

ソースコードと実行結果は以下でございます。

PHP

1#opencsvTest.php# 2<?php 3 ini_set('display_errors', 1); 4 // $usr = posix_getpwuid(posix_geteuid())['name']; 5 exec('whoami', $usr); 6 exec('groups', $grps); 7 $lgnusr = posix_getlogin(); 8 echo '実行ユーザ=' . implode(', ', $usr) . '<br>所属グループ=' . implode(', ', $grps) . "<br>login=" . $lgnusr; 9 $args = array('/var', '/var/www', '/var/www/html'); 10 echo '<br>書き込み権限チェック開始...<br><br>'; 11 12 foreach ($args as $value) { 13 if(is_writable($value)) { 14 echo "{$value}は書き込み出来ます。<br>"; 15 $fp = fopen("{$value}/test.csv", 'ab'); 16 $val = array('this', 'is', 'test', 'file'); 17 fputcsv($fp, $val); 18 fclose($fp); 19 } 20 else { 21 echo "{$value}は書き込みできません。<br>"; 22 } 23 } 24?>

実行結果1(ssh root@hoge.com → su apache → php opencsvTest.php)

実行ユーザ=apache<br>
所属グループ=apache<br>
login=root<br>
書き込み権限チェック開始...<br>
<br>
/varは書き込みできません。<br>
/var/wwwは書き込み出来ます。<br>
/var/www/htmlは書き込み出来ます。<br>

実行結果2(webブラウザよりhoge.com/opencsvTest.phpを実行した場合)
実行ユーザ=apache<br>
所属グループ=apache<br>
login=<br>
書き込み権限チェック開始...<br>
<br>
/varは書き込みできません。<br>
/var/wwwは書き込みできません。<br>
/var/www/htmlは書き込みできません。<br>

しばらくweb上を検索して調べてみましたが解決法が見つからないのでこちらで質問させて頂きます。
当該ファイルを追記モードで開く方法、もしくは上の仕様を満たす妥協案などございましたらご教授願います。

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

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

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

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

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

guest

回答2

0

自己解決

結局最終的にパーミッションは合っていましたが、書き込みが出来ませんでした。
しかし、更にweb上を徘徊していた所SELinuxについての記述を見つけました。
こちらの設定を変更する事で問題は解決しました!

#semanage fcontext -a -t httpd_sys_rw_content_t /var/www//+++/dir
#restorecon -R /var/www/html/
/+++

semanage, restorecon コマンドにつきましては導入されていない環境もありますので探してインストールして頂ければ良いと思います。

投稿2015/12/02 17:19

kyapiy

総合スコア16

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

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

0

曖昧な回答で恐縮ですが、、

問題のディレクトリ・ファイルのユーザー・グループがroot:apache であることが気になります。
これを

sh

1chown -R apache:apache /var/www

として、apache:apacheに変更したら、結果が変わるかもしれません。

また、「実行結果1」の手順を

ssh root@hoge.com → su apache → php opencsvTest.php

から

ssh root@hoge.com → su - apache → php opencsvTest.php

suコマンドにオプション-を追加
とすると、「実行結果2」と同様に失敗できる(w)かも知れません。
http://www.obenri.com/_command/su01.html

投稿2015/11/30 09:42

KiyoshiMotoki

総合スコア4791

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

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

kyapiy

2015/11/30 14:24

回答ありがとうございます! 権限はそのままで、su - apacheからのphp opencsvTest.phpを実行してみた所、見事に失敗しました!w また、ディレクトリの所有者についても試してみた所、ssh root@hoge.com → su - apache → php opencsvTest.phpは期待した権限設定通り書き込む事が出来ました。 しかし、同環境にてブラウザよりhoge.com/opencsvTest.phpを実行した場合は質問文の実行結果2と同様の結果となりました。 回答に質問で返して申し訳ないのですが、所有者をapacheに変えたとしてapacheの脆弱性を突かれて鯖に侵入されてしまった場合、apache:apacheのファイルorディレクトリがすべて消されるかもしれないというのはいらぬ気遣いでしょうか? 結局鯖に入られた時点でrootも取られると考えるのが良いんでしょうか?
KiyoshiMotoki

2015/11/30 17:04 編集

kyapiy様、返信ありがとうございます。 > 同環境にてブラウザよりhoge.com/opencsvTest.phpを実行した場合は質問文の実行結果2と同様の結果となりました。 ブラウザから実行した場合はドキュメントルートが仮想のルートディレクトリとなるので、 /var/www/html/var/www/html/ とったディレクトリの書き込み可否を判定してしまっているはずです。 https://httpd.apache.org/docs/2.4/mod/core.html#documentroot > 所有者をapacheに変えたとしてapacheの脆弱性を突かれて鯖に侵入されてしまった場合... そのリスクは確かにありますが、ファイル・ディレクトリの権限で  正当なapacheユーザー => 書き込みを許可  不正なapacheユーザー => 書き込みを拒否 という制御はできません。 OSは、あるディレクトリにアクセスしようとしているユーザーが正当な手段でログインしているか否かを判断することができないからです。 セキュリティ対策は、別途、講じる必要があると思います。 > 鯖に入られた時点でrootも取られると考えるのが良いんでしょうか? これはサーバーの設定と、どのような手段で侵入したかによるので、一概には言えないと思います。
kyapiy

2015/11/30 15:53

KiyoshiMotoki様、またまたお早い返信感謝の限りです!m(_ _)m >ブラウザから実行した場合はドキュメントルートが仮想のルートディレクトリとなるので、 >/var/www/html/var/www/html/ >とったディレクトリの書き込み可否を判定してしまっているはずです。 これです!私はこの答えを待ちわびていました!!! なるほど、という事はブラウザから実行する場合にはローカル上で/var/www/html/inc/test.csvでも、 ブラウザ上で実行する時にはtest.csvをis_writable('/inc/test.csv')と参照するのがpathとして正しいという事ですね。 ありがとうございます!これで解決しそうです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問