“su _www helloworld.php” não faz nada

4

No contexto de um esforço maior, eu me deparo com uma questão específica que está me desconcertando.

No Mac OS X 10.6.7, usando o sistema fornecido Apache e PHP, criei um script HelloWorld.php simples que, não é surpresa, apenas imprime Hello, World! e nada mais.

Funciona bem se eu o executar como php helloworld.php .

No entanto, se eu:

sudo su
su _www php helloworld.php

Não emite nada; php retorna praticamente imediatamente sem sinais de execução.

Onde eu escapei dos trilhos (e, mais importante, que informações de diagnóstico devo coletar para ajudar a deduzir o problema)?

sem dados.

 bash-3.2$ls -alF foo.php
-rw-r--r--  1 _www  _www  37 Apr  4 21:08 foo.php
bash-3.2$ ls -dalF .
drwxr-xr-x  56 _www  _www  1904 Apr  4 21:08 ./
bash-3.2$ whoami
bbum
bash-3.2$ php foo.php
Hello, World!
 bash-3.2$ sudo sh
sh-3.2# php foo.php
Hello, World!
 sh-3.2# su _www php foo.php
sh-3.2# 

Se eu copiar foo.php para os documentos do meu servidor Web, ele funciona. Como acontece no docroot do meu usuário; ele é executado através do servidor da Web, independentemente da localização.

Mesmo su _www php -v não lança nada. Algo suspeito aqui.

Derp. O usuário _www é apenas preso; sem casca Apara até o mais simples dos comandos quando tentado a partir do shell.

    
por bbum 04.04.2011 / 22:50

2 respostas

5

Isso é muito parecido com a minha pergunta "Executar cgi-script em linha de comando como usuário www? " (FreeBSD).

Aqui está o problema: O usuário '_www' tem um shell definido como /usr/bin/false . De acordo com a manpage "A falsa utilidade sempre sai com um código de saída diferente de zero". su _www sempre falhará, por design.

Isso é feito por motivos de segurança. Se alguém conseguir executar com sucesso uma exploração remota contra _www, qual conta é usada para executar seus aplicativos da Web, eles encontrarão um shell que sai imediatamente. Se este shell fosse deixado como algo como /bin/sh , então o usuário _www seria capaz de executar muitos comandos na linha de comando, e isso seria ruim para a segurança. Portanto, é definido como /usr/bin/false para limitar os danos causados por qualquer comprometimento em seu servidor da web. Não é aconselhável desabilitar isso.

No entanto, definir o shell _www como /usr/bin/false também significa que o usuário '_www' não pode executar comandos na linha de comando. Mesmo um comando simples como whoami falhará:

# su _www whoami
# echo $?
1

A solução também usa sudo , não su . Este exemplo simples mostra que agora posso executar comandos simples, como usuário '_www':

# sudo -u _www id
uid=70(_www) gid=70(_www) groups=70(_www)

Você também precisará garantir que o usuário _www possa ler o arquivo. Mas se você é capaz de executar este arquivo usando o servidor web Apache, então as permissões já estão corretas.

    
por 05.04.2011 / 07:35
1

a primeira coisa a observar são as permissões no arquivo. Em geral, os arquivos da web devem pertencer ao usuário do Apache.

tente chown _www: _www helloworld.php

tente executar o php como o usuário _www.

    
por 04.04.2011 / 23:20

Tags