executa o comando shell como outro usuário chamado pelo PHP

5

Eu tenho um script PHP que é chamado por HTTP e não como script de linha de comando. Este script deve chamar um comando shell como um outro usuário que não o usuário atual www-data.

Exemplo:

<?php
echo shell_exec('sudo -u myusername -S /usr/bin/whoami'); // returns nothing :(
echo shell_exec('whoami'); // returns www-data

Ao chamar esses dois comandos sudo -u myusername -S /usr/bin/whoami e whoami diretamente na linha de comando, eles retornam

myusername
www-data 

Também não há resultado sobre isso:

<?php
echo shell_exec('echo "mypass" | sudo -u myusername -S /usr/bin/whoami');

Para mim, parece que o sudo não funciona em conjunto com os PHPs shell_exec ().

    
por powtac 04.02.2011 / 11:50

3 respostas

5

Em primeiro lugar, não entendo o comando sudo que você está executando. sudo -u username deve permitir que você, como usuário um, suote um comando como usuário dois, dizendo (como usuário um, neste exemplo, para executar o comando ls):

sudo -u usertwo ls

Peço desculpas se você tentou limpar seus comandos acima substituindo username pelo nome de usuário real, mas não posso ter certeza de que fez isso, por isso preciso levantar este ponto primeiro.

Em segundo lugar, o sudo precisa ser configurado para permitir que um usuário execute uma série de comandos como outro usuário. Vamos começar permitindo que www-data sudo o comando ls como fribble do usuário; você poderia testar isso colocando

www-data        ALL = (fribble) NOPASSWD: ls

no seu arquivo sudoers (substituindo um usuário real por fribble). Em seguida, tente fazer, digamos, ls -la /tmp de dentro do seu script PHP e veja se você obtém uma listagem de diretórios.

Concordo com James Lawrie que não é uma boa ideia permitir que o usuário do www-data suponha comandos arbitrários, como usuários arbitrários, sem senha, mas se você esclarecer quais comandos você está tentando executar www-data, essa pode ser uma maneira sensata de fazer isso.

Editar:

você tentou com ls no arquivo sudoers e sudo -u user2 ls -al /tmp no script PHP, e você obtém uma lista de diretórios, o que sugere strongmente que o sudo funciona bem com o PHP.

Para ter certeza, você poderia permitir /bin/touch no arquivo sudoers, colocar sudo -u user2 touch /tmp/TESTFILE no script PHP e depois executá-lo? Se um arquivo /tmp/TESTFILE aparecer, de propriedade de user2, podemos ter certeza de que o sudo e o PHP funcionam bem juntos.

Devo confessar que se eu soubesse que você estava tentando sudo java, eu nunca teria respondido a pergunta original, porque eu acho que o java é um saco gigantesco e imprevisível de porcaria, que se comporta como um bebê completo se não t obter o ambiente que requer (e sudo higieniza rigorosamente o ambiente). Mas pelo menos o teste acima deve ajudá-lo a ter certeza de que, qualquer que seja o problema aqui, não é um problema com o PHP e o sudo não estarem funcionando bem juntos.

    
por 04.02.2011 / 12:31
1

Não permita o acesso do sudo do usuário do servidor, você está apenas solicitando problemas. Olhe para o bit setuid:
chmod u+s some_file_that_needs_executing_as_another_user.pl
Sempre que esse arquivo for executado, ele será efetivamente executado pelo usuário que o criou.
Em uma nota lateral, tenho certeza que você não pode enviar uma senha para sudo ou passwd.

    
por 04.02.2011 / 12:28
0

Se você deseja conceder permissões especiais para o processo do servidor da Web que está sendo executado como usuário de dados de www, você pode executar um dos seguintes procedimentos:

1- Adicione o arquivo www-data ao sudoers, para que ele possa executar o comando / script requerido sem pedir uma senha.

2- Ative o módulo suexec apache. Isso permite que você altere o usuário de www-data para algum outro usuário privilegiado por host virutal. Então, você não precisa mudar o usuário para todo o servidor.

    
por 04.02.2011 / 12:36