Apacheの実行権限について

このQ&Aのポイント
  • Apacheがユーザーディレクトリにディレクトリを作成できない問題について
  • apacheユーザーが書き込み権限を持つにも関わらず、ディレクトリの作成やファイルの作成ができない理由について
  • Apacheの実行権限の設定やディレクトリの所有者の設定に問題がある可能性がある
回答を見る
  • ベストアンサー

Apacheの実行権限について

Apacheがユーザーディレクトリに、ディレクトリを作成したり画像を(アップロードして)作成したりする場合、以下のように設定していますができません。 httpd(子プロセス)の実行ユーザー/グループはそれぞれapacheです。 親プロセスはrootになっています。 以下のディレクトリは次のようになっています。 (ドキュメントルートはwordpressです) /var/www/html/projectName/wordpress/wp-content/uploads drwxrwxr-x(775) owner=yamada group=apache このように、group(apache)に書き込み権限を与えているのですが、uploads以下にディレクトリやファイルの作成ができません。このディレクトリのownerをapacheにするとできるようになります。 apacheユーザーはapacheグループに属しているので、書き込み権限(w)をもってディレクトリの作成やファイルの作成ができるはず、という認識だったのですがなぜかできません。私の認識が間違っているのでしょうか。

noname#221560
noname#221560

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.4

うーん、色々実験してみたけど今のあなたに有用な情報は得られなかった感じ。 環境:お名前.comのVPS(KVM)向けにちょいとカスタムされてるCentOS6.6(でもノーマルに比べてapacheの動作に影響はないはず) 前提:SELinux無効、ApacheとPHPとMySQLはCentOS標準リポジトリーのもの 条件1:httpdを動かしてるのはapache.apache 条件2:sshであれこれ操作する人はanmochi.users 条件3:$(wproot)とはwp-config.phpの親ディレクトリーの事 条件4:wp-config.phpには何も追記していない。 シナリオ1: $(wproot)から全部所有者anmochi.users、ファイルは0644、ディレクトリーは0755 →メディアのアップロードできない(当然) シナリオ2: $(wproot)から全部所有者anmochi.users、ファイルは0644、ディレクトリーは0755で$(wproot)/wp-content/uploadsは0777 →アップロードできる。$(wproot)/wp-content/uploads/2015とか2015/04はapache.apacheの0777になった。 シナリオ3: $(wproot)から全部所有者apache.apache、ファイルは0644、ディレクトリーは0755 →超普通 シナリオ4: $(wproot)から全部所有者anmochi.users、ファイルは0644、ディレクトリーは0755で$(wproot)/wp-content/uploadsはanmochi.apacheで2775 →アップロードできる。$(wproot)/wp-content/uploads/2015とか2015/04はapache.apacheの2775になった。 シナリオ5: $(wproot)から全部所有者anmochi.users、ファイルは0644、ディレクトリーは0755で$(wproot)/wp-content/uploadsを削除、$(wproot)/wp-contentをanmochi.apacheで2775 →アップロードできる。$(wproot)/wp-content/uploadsがWordPressにより作られてapache.apacheの2775になった。 うーん、後はもうあなたが実験あるのみだなぁ。 $(wproot)をあなたのユーザーとあなたのグループで0755、$(wproot)/wp-contentをあなたのユーザーでグループapacheの2775、($wproot)/wp-content/uploadsを完全にデリった状態で試してみて、「うまくいったかいかなかったか」ではなく「どうなったか」を補足していただけたらと思う。具体的に言えば、WordPressのメディアのアップロード画面で「書き込みできませんでした」と表示されるかされないか、($wproot)/wp-content/uploadsは作られたか作られなかったか、などだな。

noname#221560
質問者

お礼

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

noname#221560
質問者

補足

詳細に本当にありがとうございます。 問題の件ですが、原因が判明しました。 まず、いくつか情報が不足していた点についてお詫び申し上げます。 anmochi様が最初に懸念していた通り、WordPressの実装による影響でした。 WordPressのバージョンは4.0.1です。 このアップロードは通常のメディアアップローダーではなく、WP_Filesystem APIというWordPressの実装により行っており、その中に原因がありました。これはWordPressの仕様でセキュリティを考慮されているためだと思われます。 WP_Filesystem APIは、WordPress上でファイルを操作するためのAPIですが、このAPIはファイルを操作するにあたり、システムが「安全」に操作を行える方法を direct, ssh2, ftpext, ftpsockets の順に検証し、いずれかでファイルを操作します。 今回、この検証の中でdirect(直接の書き込み)ができないと判定されていました。 この理由はおそらく、セキュリティ上の理由(仕様)で現在実行しているスクリプト(今回だとカスタム分類の編集ファイルなので/wordpress/wp-admin/edit-tags.php)のファイル所有者と、その内部で/wordpress/wp-content以下に生成される一時ファイル(判定を行うためにWordPressが生成する一時ファイル。apacheが生成するのでファイル所有者はapache)のファイル所有者との比較が行われ、これに相違がある場合はWP_Filesystem APIでは直接書き込めない仕様になっていました。 つまりアプリケーション及びWordPressの実装上、パーミッションだけでなく実行スクリプトとapacheの生成するファイルの所有者が一致している必要があったということです。実際に/wordpress/wp-admin/edit-tags.phpのファイルの所有者をapacheにすると書き込み・削除を行えるようになりました。 上記の仕様はあくまでWordPress 4.0.1での場合で、 所有者の比較は以下のようになっています。 if ( getmyuid() == @fileowner($temp_file_name) ) {  $method = 'direct'; } 現行のWordPress 4.1.1では、 比較対象が__FILE__となっていてfile.phpと比較されるようになっています。 if ( function_exists('fileowner') ) {  $wp_file_owner = @fileowner( __FILE__ );  $temp_file_owner = @fileowner( $temp_file_name ); } if ( $wp_file_owner !== false && $wp_file_owner === $temp_file_owner ) {  // WordPress is creating files as the same owner as the WordPress files,  // this means it's safe to modify & create new files via PHP.  $method = 'direct';  $GLOBALS['_wp_filesystem_direct_method'] = 'file_owner'; } else if ( $allow_relaxed_file_ownership ) {  // The $context directory is writable, and $allow_relaxed_file_ownership is set, this means we can modify files  // safely in this directory. This mode doesn't create new files, only alter existing ones.  $method = 'direct';  $GLOBALS['_wp_filesystem_direct_method'] = 'relaxed_ownership'; } これらのWP_Filesystem APIがファイル操作にあたり行う検証は、/wordpress/wp-admin/includes/file.phpのget_filesystem_method()に実装があります。 ひとまずこの問題については、すべてのディレクトリとファイルの所有者をapache、グループをyamadaとすることで両者が操作を行えるようにして解決しました。 この設定が適切かについてはこれから勉強したいと思います。 長くなりましたが、最後までお付き合いいただき本当にありがとうございました。 最後に、以上のような結論についてanmochi様より何か一言ありましたらお願いします。 特になければ、その後ベストアンサーとして質問を締め切らせていただきたいと思います。 本当にありがとうございました。

その他の回答 (3)

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.3

> 以下のとおり、SGIDも試しましたがうまくいきませんでした。 あれ、こっちでは普通にできたけど・・・・。こちらはCentOS 6.6でSELinuxは無効。apacheとPHPとMySQLはCentOS標準リポジトリーのものだ。WordPressは4.0.1をZIP解凍したものをWordPressの自動更新にて4.1.1にしたものだ。 wp-contentの中身というかuploadsを drwxrwsr-x 7 anmochi apache 4.0K Apr 7 05:28 . drwxr-xr-x 5 anmochi apache 4.0K Feb 24 17:19 .. -rw-r--r-- 1 anmochi apache 28 Jan 9 2012 index.php drwxrwsr-x 4 anmochi apache 4.0K Nov 22 08:33 languages drwxrwsr-x 3 anmochi apache 4.0K Feb 1 02:08 plugins drwxrwsr-x 6 anmochi apache 4.0K Feb 1 02:12 themes drwxrwsr-x 2 anmochi apache 4.0K Apr 2 07:12 upgrade drwxrwsr-x 3 anmochi apache 4.0K Apr 7 05:26 uploads こんな風にオーナーanmochiのグループapacheにして2775というパーミッションにします。あれ、こんなのを公表したら駄目だったと言われて今あわてて実験してみたというのがバレちゃうじゃないか。ちなみに/からwp-contentまではオーナーapacheのディレクトリーとオーナーanmochiのディレクトリーが混在している。 そして管理画面のメディアから新規作成でここへファイルをドロップいう所に画像をドロップする。今このWordPressの設定では年月のディレクトリーを作ってファイルを入れる設定にしている。 そうするとwp-content/uploadsの中をls -lhすると drwxrwsr-x 3 apache apache 4.0K Apr 7 05:26 2015 のようになってちゃんとディレクトリーが作られてファイルもアップロードされているようだ。 SELinuxとか、他の要因がこれを阻害していると思う。

noname#221560
質問者

補足

ご丁寧にテストまでしていただき、ありがとうございます。 お返事遅くなってすみません。 まずSELinuxですが、getenforceで動作を確認するとPermissiveになっていました。 この時点で、まだディレクトリ・ファイルの作成・削除ができないので、 /etc/selinux/configにSELINUX=disabledを設定し、サーバーを再起動した上でgetenforceでSELinuxが無効(Disabled)になっているのを確認し、再度画像のアップロードしましたがうまくいきませんでした。 SGIDについては、wordpressからuploadsディレクトリまでのディレクトリに2775を設定してあります。 wordpressからuploadsディレクトリまでのディレクトリの所有者をapacheにすることでできるようにはなるのですが・・・。 環境は以下のとおりです。 OS:CentOS 6.4 Apache: 2.2.15 PHP:5.3.3 度々すみませんが、他にお気づきの点あればよろしくお願い致します。

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

WordPressを実行している環境はLinuxなのかな。こうしたらどうだろう。 /var/www/html/projectName/wordpress/wp-content/uploads drwxrwxr-x(775) owner=yamada group=apache ↓ /var/www/html/projectName/wordpress/wp-content/uploads drwxrwsr-x(2775) owner=yamada group=apache 簡単に解説しておくと、パーミッションの2000というのはSGIDと言い、これをディレクトリーに対して設定しておくと、その子供として作ったディレクトリーは自動的に親と同じグループになりさらにSGIDがつく、というものだ。 それが何を意味するかというのは是非とも自分で調べていただきたい。 ちなみに千番台のパーミッションには他に1000と4000がある。これもそれぞれ面白い意味を持っているので良ければ調べてみると良いだろう。

noname#221560
質問者

補足

回答ありがとうございます。 以下のとおり、SGIDも試しましたがうまくいきませんでした。 sudo chmod 2775 /var/www/html/projectName/wordpress/wp-content/uploads んーなんでだろ やはり、ドキュメントルートから当該ディレクトリまでの所有権がないとダメなのでしょうか

回答No.1

> 私の認識が間違っているのでしょうか。 Linuxの知識としては間違っていません。 なのでwordpressを使っていると言う所が気になります。 フォルダ毎の設定してもumask設定が有効であれば、 例えばumaskが755であればフォルダ側で何を設定しても022の部分は設定できないと言う事になります。 slowdancingさんのサーバ環境を見てみないとわからない事なので、 umask と言う単語に関連するコンフィグファイル等無いか調べてみてください。

noname#221560
質問者

補足

apacheのumaskは親プロセスのumask値を継承するようなので022になっていました。apacheのシステム設定ファイル(/etc/sysconfig/httpd)にumask 002を追記し、apacheを再起動することでumask値は変更できましたが、うまくいきませんでした。 また、WordPressはapacheのumask値を無視するという記事がありました。 http://www.teradas.net/archives/10547/ こちらの記事にあるとおり、以下をwp-config.phpのrequire_once(ABSPATH . 'wp-settings.php')の上に追記しましたが、こちらもうまくいきませんでした。 define('FS_CHMOD_DIR', ( 0775 & ~ umask() )); define('FS_CHMOD_FILE', ( 0664 & ~ umask() )); それと質問本文で1つ訂正ですが、wordpress/wp-content/uploadsの各ディレクトリ(ドキュメントルートからuploadsまで)のディレクトリ所有者(owner)をapacheにするとうまくいくのですが、uploadsディレクトリだけをapacheにしただけではうまくいきませんでした。 他に何か気づく点はありますでしょうか。 よろしくお願い致します。

関連するQ&A

  • apacheユーザの実行権限設定はどうすれば良い?

    ■環境 ・Cent OS ■状況 ・所有者hogeのディレクトリxに対して、スクリプト経由(apacheユーザ権限)でchmodしようとすると、エラーになります ・スクリプト経由(apacheユーザ権限)でディレクトリ作成しようとしても、エラーになります ■質問 ・どうすれば良いでしょうか? ・所有者hogeのグループにapacheユーザを入れたら効果あるでしょうか? ・ディレクトリ所有者がhogeであることが問題? apache所有にした方が良い? ・それとも、スクリプト実行を、apacheユーザ権限ではなく、所有者hogeにした方が良い? どうやって? ・そもそもapacheユーザ権限は、一般的にどう設定するものなのでしょうか? rootみたいに最強にする?

  • linux権限について

    CentOS5系を使用しています。 あるディレクトリ(下記のような権限を持つディレクトリ) の配下でのみrootと同様の権限を持つユーザを作成したいと思っています。 drwxr-xr-x 15 root root ディレクトリ名⇒Hoge グループの権限はrwxにしても良いと考えていますが、 useraddで新規ユーザを作成して usermod -Gでrootグループにユーザを追加してしまうと そのユーザは他のディレクトリでもrootと同様の権限を持てることとなってしまいます。 あくまでHogeディレクトリ配下でのみrootユーザと同様の権限を持たせたいと思っています。 どなたか知恵をお貸しください。

  • Apacheの公開ディレクトリの属性ついて

    Apacheで公開しているディレクトリのオーナーとグループは、root.rootがよいのでしょうか?それともApacheの設定によるオーナーとグループ(apache.apache)がよいのでしょうか? 今までどちらでも特に問題なく動作していたので、あまり気にしてなかったんですが、どちらが推奨なのでしょうか。どうか教えてください。

  • CentOSでのwordpress構築について

    CentOSでのwordpress構築について 現在、CentOSでwordpressを構築しようとしています。 wordpressディレクトリのパーミッションをどのように設定すればいいかで悩んでおります。 wordpressのインストール時に参考にしたHPでは、wordpressディレクトリの所有者を 「chown -R apache:apache /var/www/wordpress/」等でapacheに設定するようになっていました。 テスト環境で、wordpressを使用するユーザーがWinSCPを使用してファイルのアップロードや 上書きを行おうとした時に、パーミッションの関係上(ディレクトリが755、ファイルが644)、 ファイルを作成・変更できない状態となりました。 apacheグループにwordpressを使用するユーザーを追加しても、所有者がapacheのため、 パーミッションを変更したり、ファイルを削除したりすることができませんでした。 wordpressを使用するユーザー権限のみで、wordpress以下のファイルやディレクトリを 操作させるようにするにはどうすればいいのでしょうか? セキュリティと利便性のバランスが取れた運用方法を模索しています。 ネット上にはphpでパーミッションを変更すればできるとの記述がありましたが、 それを、wordpress使用者にお願いするのも変かな・・・と思いました。 ご指南のほど、お願い申し上げます。

  • Apache2実行ユーザでLinuxディレクトリへのアクセス制御をするには?

    Apache2・Tomcatを使用したWebアプリケーションよりLinuxOS(CentOS4.4)内の特定のディレクトリのファイル一覧を取得また特定ユーザにのみそのディレクトリ内へのファイルの書込みを許可するというようなアプリケーションを作成中です。またこのアプリケーションのユーザ以外は上記ディレクトリへのアクセス許可を与えないようにしたいと思っています。そこでApache2の実行ユーザと同ユーザによってLinuxOS内の該当ディレクトリにパーミッションを設定すれば実現できるのではと思い自分なりに設定してみたのですがうまくいきません。 クライアントとしてブラウザからApache2に接続したPCはLinux上ではApache2の実行ユーザとして認識されないのでしょうか? Apache2の実行ユーザはhttpd.confのUser nobody Group nobodyとなっているところを任意のユーザに変更しました。 User apa01 Group apa01(ここではapa01とします)Linux内にも同名のユーザ・グループを追加します。 LinuxOSのユーザはapa01(上記)とlxuserの2人がいるとします。 該当ディレクトリのパーミッションは d rwxr-x--- apa01 apa01 該当ディレクトリ名 とします。 これによりapa01と認識されている?と思われるwebアプリケーションのクライアントPCからは該当ディレクトり内のファイルを取得できました。ここでパーミッションをd rwxr-x--- lxuser lxuserと変更します。すると思惑ではWebアプリケーションのクライアントからはファイルの一覧が取得できなくなるはずでしたがしっかり取得してしまいます。ひょっとして・・と思いApache2のhttpd.confのUser Groupを変更してもしっかり取得してしまいます。 なにか考えが根本的に違っているのでしょうか? 長々と書きましたがもっと違う方法があるようでしたら是非ともご教授願えませんでしょうか?よろしくお願いいたします。

  • Linuxの権限管理

    こんにちは。 Windowsサーバの管理者をしています。 Linuxも興味があり、本を見たりなどしているのですが、権限管理について疑問が出てきたので質問させてください。 Windowsですと、あるフォルダに対して複数のアカウントを所有者(フルコントロール)権限を設定できますが、Linuxの場合はどうなりますか? 調べてみたところでは、グループを作ってそのグループに所有者権限を適用したいユーザーを入れてやれば解決するとは思うのですが、例えば、Linuxをファイルサーバとして公開するとして ユーザA~Fまでの6アカウントがある 共有ディレクトリとしてディレクトリ1~3まで用意 共有ディレクトリ1→ユーザーAとBに所有者権限 共有ディレクトリ2→ユーザーCとDに所有者権限 共有ディレクトリ3→ユーザーEとFに所有者権限 と所有者権限を設定したい場合は、 グループG1を作成してユーザーAとBを追加し、共有ディレクトリ1にグループG1を所有者権限設定 グループG2を作成してユーザーCとDを追加し、共有ディレクトリ2にグループG2を所有者権限設定 グループG3を作成してユーザーEとFを追加し、共有ディレクトリ3にグループG3を所有者権限設定 と、共有ディレクトリごとにグループを作らないと設定できないのでしょうか? 私が管理しているWindowsファイルサーバでは共有フォルダは山のようにあるのですが、Linuxでこれと同じような運用をするとなると膨大な数のグループを作成しないといけないのかな、と勝手にびっくりしていますが、どうなんでしょう?それか他にうまい方法でもあるのでしょうか? お教えいただけましたら幸いです。

  • php実行権限以外でのディレクトリ(ファイル)作成方法

    webからphpを起動し、ディレクトリを作る場合、 phpが実行された権限ではない権限で作ることはできますか? 所有者がapacheとなるディレクトリを作りたいのです。 試してみたこと。 ・mkdirでディレクトリ作成後、chownで所有者変更が出来ればいいのですが、 root権限で動いているわけではないので無理でした。 ・シェルを作って、シェルの所有者をapacheにしてphpからコマンドラインで シェルを呼び出してみましたが所有者apacheで作られません。

    • ベストアンサー
    • PHP
  • PHPプログラムを各ユーザ権限で実行させる(suEXEC)には?

    色々なCMSを試してみたくて、テスト用の自宅サーバ(外部には非公開)を構築しています。 サーバ環境はubuntu9.04+Apache2+PHP5+MySQL5で、Apacheのuserdirモジュールを有効にしています。この状態で各CMS専用のユーザを作成し、各ユーザのドキュメントルートにCMSをインストールして使っています。 具体的には・・・ xoopsユーザを作成して http://localhost/~xoops/ にXOOPSをインストール。 drupalユーザを作成して http://localhost/~drupal/ にDrupalをインストール。 ここで問題になったのは、PHPプログラムがwww-dataユーザの権限で実行されるので、自動的に生成されるファイルの所有者がwww-dataになってしまうということです。自分なりに調べて「suEXECを導入することで解決できそうだ」というところまでは解ったのですが、具体的な設定方法を見つけるには至っていません。 そこで質問なのですが、suEXECを導入することでxoopsユーザのドキュメントルート以下にあるプログラムはxoopsユーザの権限で、drupalユーザのドキュメントルート以下にあるプログラムはdrupalユーザの権限で実行されるようにするには、何をどの様に設定すれば良いのでしょうか。もしsuEXECを使う以外の方法で実現可能であれば、それでも構いません。 質問が冗長になってしまって申し訳ありませんが、サーバ構築の経験者様からのアドバイスを頂ければと思い質問させて頂きました。何卒よろしくお願い致します。

  • Linuxでのグループごとのディレクトリの権限について

    お世話になります。 Linuxで以下のようなことをしたいのですが、ディレクトリごとにグループの権限を設定するコマンドが分かりません。 説明が長いですが、よろしくお願いします。 やりたいこと 【必須】 ・group1とgroup2というグループがある。 ・user01とuser11はgroup1に所属し、user2はgroup2に所属する。 ・/test/folder1/と/test/folder2/がある。 ・folder1の中身はrootユーザとgroup1に所属する2人しか参照・更新・実行できない。 ・folder2の中身はrootユーザとgroup2に所属する1人しか参照・更新・実行できない。 ・今後folder1に作成される全てのファイルはroot,user01,user11しか参照・更新・実行できない。  (ファイルごとに権限を設定はしない。) ・rootユーザがグループ、ユーザの管理および/test/直下のフォルダの管理を行う。  root以外のユーザはグループ・ユーザの作成などはできない。  (root以外のユーザができることは/test/自分が所属しているグループが見れるディレクトリ 内の   ファイルの参照・更新・実行のみ) 【できれば】 ・rootユーザが/test/を見るとfolder1とfolder2がある。  user01,user11が/test/を見るとfolder1だけある。  (できない場合は、folder2にアクセスできないようにする) 【今自分が理解していること】 (1)グループの作成方法  #groupadd group1  #tail -1 /etc/group  #group1:x:500:   (2)ユーザの作成方法  # useradd -u 1001 -g group1 user01   (3)権限のつけかた  #chmod g+r /test/folder1/  (これはrootがやる場合、グループの指定ができるのかがわからない)

  • linuxのオーナーとパーミッションについて

    linuxのオーナーとパーミッションについて 下記の3ユーザーがあるとします。 user1:groupA user2:groupA user3:groupB root:root 下記のファイルがあるとします。 dir_1/ | +-dir_11/ |_| |_+-file_111 | +-fil1_12 以下の要件を満たすオーナーとパーミッションは可能でしょうか <要件> ■dir_1  root以外は名前の変更、削除はできない。  この下にuser1、user2はファイルやディレクトリを作成、変更、削除できる。 ■dir_11  user1、user2はこのディレクトリを削除、変更可能  この下にuser1、user2はファイルやディレクトリを作成、変更、削除できる。  user3はこのディレクトリの下は読み込みしかできない。  user3はこのディレクトリの下にファイルやディレクトリを作れない。 ■file_111  user1、user2はこのファイルを変更、削除できる。  user3はこのファイルを読み込みしかできない。 ■fil1_12  user1、user2はこのファイルを変更、削除できる。  user3はこのファイルを読み込みしかできない。 <設定内容> ■dir_11,file_111,fil1_12 オーナー、user1:groupA 権限、rw-rw-r-- ■dir_1 オーナー、????:???? 権限、????????? dir_1の設定がわかりません。