sessões php - é possível acionar um script de servidor executado por um usuário DIFERENTE do www-data?

sessões php - é possível acionar um script de servidor executado por um usuário DIFERENTE do www-data?

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:

  1. qualquer coisa executada (ou chamada) pelo código php será executada sob o usuário www-data
  2. 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-datapara 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.cgido Apache e o script fornecido no arquivo acima deve ser executado como o usuário especificado no arquivo acima.

informação relacionada