Estou executando um site php + mysql em um servidor de nuvem Ubuntu Lamp (Amazon EC2). eu uso sessões php. o usuário apache php é chamado www-data.
para cada sessão (SID), preciso criar uma pasta temporária que seja um subdiretório de www e tenha o ID da sessão como nome (imprevisível, portanto, não pode ser pré-criado). por exemplo: /var/www/fileStore/s35S10nT3Mp/.
Posteriormente, acessarei os arquivos nessas pastas a partir de uma função javascript (lado do cliente).
estou trabalhando sob as suposições de que:
- qualquer coisa executada (ou chamada) pelo código php será executada sob o usuário www-data
- javascript do lado do cliente não pode acessar um subdiretório FORA de www (por exemplo: /var/outsideFileStore/s35S10nT3Mp/, onde webroot = public_html = /var/www)
eu adoraria estar errado em um ou em ambos os itens acima, pois isso resolveria meu problema sem mais delongas. caso eu não esteja errado em nenhuma das minhas suposições:
Eu tenho um problema de segurança ao conceder permissões de gravação ao usuário www-data (necessárias para o php mkdir a nova pasta) em um subdiretório de www, porque isso deixa o servidor e os dados nessas pastas muito expostos.
gostaria de saber se uma sessão php pode acionar (ou chamar) um script/processo de servidor que é executado sob outro usuário (que receberia permissão de gravação em/var/www/fileStore/), não em www-data. esse processo criaria (e coletaria o lixo) essas pastas temporárias.
corolário: caso isso não possa ser feito no Apache, o Tomcat ajudaria (se eu executasse o php em java em vez de http_server)?
corolário 2: e se eu executasse uma conexão de soquete (de dentro do php) para um servidor de soquete (que tenho em c++) e o servidor de soquete (outro usuário, obviamente) fizesse a criação do arquivo? isso é um exagero?
Responder1
Você pode usarsetuid()
funcionalidade para executar scripts e outras coisas como outro usuário.
Eu uso o script wrapper abaixo para executar outro script como um usuário diferente do que www-data
para uma finalidade específica em um servidor web 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;
}
Basta chamar make_stats.cgi
do Apache e o script fornecido no arquivo acima deve ser executado como o usuário especificado no arquivo acima.