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ユーザでなければ保存出来ないように
    なっているので、所有者変更やパーミッションの調整が必要になってきます。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA