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

2

Estou executando um site php + mysql em um servidor de nuvem ubuntu da lâmpada (amazon ec2). Eu uso sessões php. o usuário do apache php é chamado de www-data.

para cada sessão (SID), eu preciso criar uma pasta temporária que é um subdiretório de www e tem o Id da sessão como seu nome (imprevisível, portanto, não pode ser pré-criado). por exemplo: / var / www / fileStore / s35S10nT3Mp /.

mais tarde, acessarei os arquivos dessas pastas em uma função de javascript (cliente).

Eu 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. o javascript do lado do cliente não pode acessar um subdiretório FORA do www (por exemplo: / var / outsideFileStore / s35S10nT3Mp /, onde webroot = public_html = / var / www)

Eu adoraria estar errado em um ou ambos os itens acima, pois isso resolveria meu problema sem mais delongas. no caso eu não estou errado em qualquer uma das minhas suposições:

Eu tenho um problema de segurança ao dar permissões de gravação ao usuário www-data (necessário para php para mkdir a nova pasta) em um subdiretório de www, porque isso deixa o servidor e os dados nessas pastas expostos demais.

Eu 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 www-data. esse processo criaria (e coleta de lixo) essas pastas temporárias.

corolário: caso isso não possa ser feito sob o apache, o tomcat ajudaria (se eu rodasse o php sob o java ao invés do http_server)?

corolário 2: e se eu fiz uma conexão de soquete (de dentro do php) para um servidor de soquete (que eu tenho em c ++) e o servidor de soquete (outro usuário, obviamente) fez a criação do arquivo? isso é um exagero?

    
por tony gil 06.02.2013 / 17:03

1 resposta

1

Você pode usar a funcionalidade setuid() 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 de www-data para um propósito específico 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;
}

Apenas chame make_stats.cgi do Apache e o script dado no arquivo acima deve ser executado como o usuário especificado no arquivo acima.

    
por 06.02.2013 / 21:26