php sessions - возможно ли запустить серверный скрипт, выполняемый ДРУГИМ пользователем, а не www-data?

php sessions - возможно ли запустить серверный скрипт, выполняемый ДРУГИМ пользователем, а не www-data?

Я запускаю сайт php+mysql на облачном сервере Lamp Ubuntu (Amazon EC2). Я использую сессии php. Пользователь Apache PHP называется www-data.

для каждого сеанса (SID) мне нужно создать временную папку, которая является подкаталогом www и имеет идентификатор сеанса в качестве своего имени (непредсказуемое, поэтому не может быть создано заранее). Например: /var/www/fileStore/s35S10nT3Mp/.

Позже я получу доступ к файлам в этих папках с помощью функции JavaScript (на стороне клиента).

Я работаю, исходя из следующих предположений:

  1. все, что выполняется (или вызывается) php-кодом, будет работать под пользователем www-data
  2. Клиентский javascript не может получить доступ к подкаталогу ВНЕ www (например: /var/outsideFileStore/s35S10nT3Mp/, где webroot = public_html = /var/www)

Я был бы рад ошибиться в одном или обоих из вышеперечисленных утверждений, поскольку это решило бы мою проблему без дальнейших церемоний. На случай, если я не ошибаюсь ни в одном из своих предположений:

У меня возникла проблема безопасности при предоставлении пользователю www-data прав на запись (необходимых для php для mkdir новой папки) в подкаталоге www, поскольку это оставляет сервер и данные в этих папках слишком уязвимыми.

Я хотел бы узнать, может ли сеанс php запустить (или вызвать) серверный скрипт/процесс, который выполняется под другим пользователем (который получит разрешение на запись в /var/www/fileStore/), а не под www-data. Затем этот процесс создаст (и соберет мусор) эти временные папки.

Следствие: если это невозможно сделать под Apache, поможет ли tomcat (если я запущу php под Java, а не под http_server)?

Следствие 2: что, если я запустил сокетное соединение (изнутри php) с сокет-сервером (который у меня есть в C++) и поручил сокет-серверу (другому пользователю, очевидно) создать файл? Это излишество?

решение1

Вы можете использоватьsetuid()функциональность для запуска скриптов и других вещей от имени другого пользователя.

Я использую приведенный ниже скрипт-оболочку для запуска другого скрипта от имени другого пользователя, а не www-dataдля определенной цели на веб-сервере Apache.

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;
}

Просто вызовите make_stats.cgiApache, и скрипт, указанный в файле выше, должен быть запущен от имени пользователя, указанного в файле выше.

Связанный контент