PHP セッション - www-data とは異なるユーザーによって実行されるサーバー スクリプトをトリガーすることは可能ですか?

PHP セッション - www-data とは異なるユーザーによって実行されるサーバー スクリプトをトリガーすることは可能ですか?

私は LAMP Ubuntu クラウド サーバー (Amazon EC2) で PHP+MySQL サイトを実行しています。PHP セッションを使用します。Apache PHP ユーザーは www-data と呼ばれます。

すべてのセッション (SID) に対して、www のサブディレクトリであり、名前としてセッション ID を持つ一時フォルダーを作成する必要があります (予測不可能なため、事前に作成することはできません)。例: /var/www/fileStore/s35S10nT3Mp/。

後で、JavaScript (クライアント側) 関数からこれらのフォルダー内のファイルにアクセスします。

私は以下の仮定のもとで作業しています:

  1. PHPコードによって実行(または呼び出され)されるものはすべて、ユーザーwww-dataの下で実行されます。
  2. クライアント側の JavaScript は、www の外側のサブディレクトリにアクセスできません (例: /var/outsideFileStore/s35S10nT3Mp/、webroot = public_html = /var/www)

上記のどちらか、または両方が間違っていたらうれしいです。そうすれば、これ以上の苦労なく問題が解決するからです。私の仮定のいずれかが間違っていない場合は、次のようになります。

ユーザーに www のサブディレクトリ内の www-data 書き込み権限 (php が新しいフォルダを mkdir するために必要) を与えると、サーバーとこれらのフォルダ内のデータが露出してしまうため、セキュリティ上の問題があります。

PHP セッションが、www-data ではなく、別のユーザー (/var/www/fileStore/ への書き込み権限を受け取る) の下で実行されるサーバー スクリプト/プロセスをトリガー (または呼び出す) できるかどうかを知りたいです。このプロセスは、これらの一時フォルダーを作成 (およびガベージ コレクション) します。

結論: これを Apache で実行できない場合、Tomcat が役立ちますか (http_server ではなく Java で PHP を実行した場合)?

帰結 2: ソケット接続 (PHP 内から) をソケット サーバー (C++ で作成) に実行し、ソケット サーバー (明らかに別のユーザー) にファイル作成を行わせたらどうなるでしょうか。これはやりすぎでしょうか。

答え1

使用できますsetuid()別のユーザーとしてスクリプトなどを実行する機能。

www-data以下のラッパー スクリプトを使用して、Apache Web サーバー上で特定の目的とは異なるユーザーとして別のスクリプトを実行します。

suid_wrapper.c:

#include <stdlib.h>

/*
 * C wrapper to run script as other user from Apache.
 *
 * Instructions:
 *   Run as root:
 *     gcc suid_wrapper.c -o make_stats.cgi
 *     chmod a+s make_stats.cgi
 */

// User ID and Group ID for wanted user.
int uid = 503;
int gid = 506;
// Path to script to be executed as above user.
const char* scriptpath = "/home/user/public/stats/make_stats.sh";

int main()
{
    // setgid() must be before setuid(); otherwise one has forsaken the privilege to change group.
    setgid(gid);
    setuid(uid);
    system(scriptpath);
    return 0;
}

Apache から呼び出すだけmake_stats.cgiで、上記のファイルで指定されたスクリプトが、上記のファイルで指定されたユーザーとして実行されます。

関連情報