Я запускаю сайт php+mysql на облачном сервере Lamp Ubuntu (Amazon EC2). Я использую сессии php. Пользователь Apache PHP называется www-data.
для каждого сеанса (SID) мне нужно создать временную папку, которая является подкаталогом www и имеет идентификатор сеанса в качестве своего имени (непредсказуемое, поэтому не может быть создано заранее). Например: /var/www/fileStore/s35S10nT3Mp/.
Позже я получу доступ к файлам в этих папках с помощью функции JavaScript (на стороне клиента).
Я работаю, исходя из следующих предположений:
- все, что выполняется (или вызывается) php-кодом, будет работать под пользователем www-data
- Клиентский 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.cgi
Apache, и скрипт, указанный в файле выше, должен быть запущен от имени пользователя, указанного в файле выше.