2

я использую сайт php+mysql на облачном сервере с лампой Ubuntu (amazon ec2). Я использую сессии PHP. пользователь apache php называется www-data.

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

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

Я работаю в предположении, что:

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

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

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

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

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

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

1 ответ1

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.cgi из Apache, и скрипт, указанный в приведенном выше файле, должен быть запущен от имени пользователя, указанного в приведенном выше файле.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .