24時間365日フルマネージドホスティングサービスのデイーネット

  • HOME
  •  
  • 技術情報ブログ
  •  
  • PHPコンテンツからファイルを出力してもapacheユーザ以外を指定する方法

PHPコンテンツからファイルを出力してもapacheユーザ以外を指定する方法

どうも、ディーネットの山田です。

8月は、夏休みってことで投稿してませんでしたw(単に忙しくて時間を割けませんでした。)

概要

Apache上で稼動しているPHPからファイルを出力するとapacheユーザになってしまい、
FTPユーザからではファイルの操作ができない課題に対処するべくmod_ruid2という
Apacheのモジュールを組み込んでみます。

※FTPユーザとapacheが動作しているユーザは違うため、どうしてもFTPから触れない
 だとかPHPから触れない問題が発生します。

簡単に解決しようとするならば、単にPHPの実行をApacheのモジュールではなくCGIとして
実行すればいいだけなのだがmod_phpのよさ(.htaccessでPHPのパラメータを制御できること)
を生かしたり、CGIでの動作は構築が面倒ということもあり比較的簡単に実装する方法となります。

検証環境情報

OS

CentOS Linux release 7.5.1804 (Core)

Apache

httpd-2.4.6-80.el7.centos.1.x86_64

今回Apacheに組み込むモジュールについて紹介

mod_ruid2.x86_64

mod_ruid2とは

リクエストを処理する際に、予め指定したユーザやグループで動作してくれるというもの

作業内容

epelをインストールする

# yum install epel-release.noarch

mod_ruid2をインストールする

# yum install --enablerepo=epel mod_ruid2.x86_64

設定内容

特定のフォルダ配下のみmod_ruid2を有効化しておく

<VirtualHost *:80>
        ServerName localhost
        ServerAlias root@localhost
        DocumentRoot /var/www/vhosts/localhost/WWW
        CustomLog /var/www/vhosts/localhost/LOG/access_log combined
        ErrorLog /var/www/vhosts/localhost/LOG/error_log
</VirtualHost>

<Directory "/var/www/vhosts/localhost/WWW/on">
        <IfModule mod_ruid2.c>
                RMode   config
                RUidGid ftpuser ftpuser
        </IfModule>
</Directory>
  • "/var/www/vhosts/localhost/WWW/on/"配下ではmod_ruid2を有効にする
  • "RMode"と"RUidGid"というパラメータ値がありますが、"RMode"は"config"のままにして下さい。
  • "RUidGid"に関しては、実際のFTPユーザなどに置き換えて下さい。

検証内容

以下のようなPHPスクリプトを設置して動作検証を行なう

"/var/www/vhosts/localhost/WWW/on/"と
"/var/www/vhosts/localhost/WWW/off/"配下に
それぞれ "create.php"という名前で設置する。

<?php
        $putfile = __DIR__ . "/temp/output.txt";

        $uid = posix_getpwuid(posix_geteuid());
        $gid = posix_getgrgid(posix_getegid());

        echo "実行ユーザは、" . $uid["name"] . "<br>\n";
        echo "実行グループは、" . $gid["name"] . "<br>\n";

        if ( ( file_put_contents($putfile, "HOGEHOGEHOGE") ) !== false )
        {
                echo "ファイルの書き込みが出来ました<br>\n";
        }
        else
        {
                echo "ファイルの書き込みが出来ませんでした<br>\n";
        }

動作確認

ブラウザから確認

  • http://{検証機のIP}/off/create.php
実行ユーザは、apache
実行グループは、apache
ファイルの書き込みが出来ました

と表示されました。

  • http://{検証機のIP}/on/create.php
実行ユーザは、ftpuser
実行グループは、ftpuser
ファイルの書き込みが出来ました

と表示されました。

想定通り、"/on/"配下はftpuserで動作していることが確認できましたね。

作成されたファイルの確認

# ls -la /var/www/vhosts/localhost/WWW/*/temp/output.txt
-rw-r--r-- 1 apache  apache  12  9月  4 19:59 /var/www/vhosts/localhost/WWW/off/temp/output.txt
-rw-r--r-- 1 ftpuser ftpuser 12  9月  4 20:00 /var/www/vhosts/localhost/WWW/on/temp/output.txt

こちらも想定通り、"/on/"配下はftpuserで動作していることが確認できましたね。

使い道

  • WordPressの管理画面から更新したファイルであっても、FTPユーザから触りたい。
  • FTPユーザで設置したファイルをPHPのプログラムから編集したい。
    このような煩わしさを感じている方が居れば、ぜひ導入を検討してみてはいかがでしょうか。

備考

標準で用意されているPHPのセッションフォルダは、apacheユーザでなければ保存出来ないように
なっているので、所有者変更やパーミッションの調整が必要になってきます。

  • このページの先頭へ

  • 東京本社
    〒105-0001東京都港区虎ノ門2-3-22 第一秋山ビル5F
    TEL:03-3591-8887 FAX:03-3591-8886
  • 大阪本社
    〒541-0041 大阪市中央区北浜2-6-11北浜エクセルビル5F
    TEL:06-6231-8887 FAX:06-6231-8897

  • 認証範囲はこちらをご覧ください。

Denet logo

クラウドサービス・データセンタ・高機能専有サーバ・共有サーバホスティングサービス 株式会社ディーネット
dot_bar