como executar comandos shell do apache (através de php)

1

Estou usando o redhat 6  Eu tenho os seguintes comandos shell que eu preciso para executar a partir do servidor web (apache - > através de php) que basicamente movem & Sobrescrever um arquivo, matar um processo e inicia outro. Obviamente, por alguns motivos, todas as operações são negadas, por isso estou pensando se há alguma maneira de executá-las (por exemplo, que permissão e como devo dar ao apache)

echo  shell_exec('mv -f /etc/resolv.test /etc/resolv.conf');
echo  shell_exec('killall horas');
echo  shell_exec('/xg/eng/sbin/startme &> /dev/null &');

o log de erros é mv: não pode mover /etc/resolv.test' to / etc / resolv.conf ': Permissão negada horas (2105): Operação não permitida horas: nenhum processo morto

    
por user1963938 18.01.2013 / 19:01

3 respostas

1

well I'm aware that apache runs under apache but I think the question is how to give more permissions to apache so it can execute all these commands

a maneira típica de fazer isso é conceder acesso sudo ao apache com NOPASSWD. você vai querer ser excessivamente cauteloso com isso, porque isso pode ser extremamente perigoso se for mal configurado. algo como

apache    ALL=(ALL) NOPASSWD: killall horas

pode funcionar. Você também pode querer escrever a coisa toda como um script "wrapper" e, em seguida, apenas conceder acesso ao apache sudo para esse script. (outra resposta também recomenda isso.)

lembre-se de que você está concedendo ao apache a escalação de privilégios AND de execução. isso é potencialmente uma exploração remota em nível de raiz. teste seus scripts antes de implantá-lo e certifique-se de investigar o acesso seguro à página com a autenticação básica e / ou o IP permite. você também pode ser mais bem servido investigando soluções alternativas. o apache realmente precisa gerenciar seu resolv.conf? poderia um cronjob executar o killall ?

    
por 18.01.2013 / 19:47
1

Os processos do Apache são executados normalmente como um usuário especial ('apache' normalmente no Redhat). Descubra isso primeiro. Em seguida, você precisa verificar se esse usuário tem permissão para executar essa operação (permissões de arquivos / dirs).

É muito perigoso permitir que o usuário que executa o servidor da Web tenha grandes privilégios para executar scripts confidenciais que somente o root deve executar. Eu não sei exatamente o seu cenário, mas a julgar pelo trecho, eu iria com algo mais cautelos como ter um script cron com freqüência (uma vez por minuto) (para usuário root talvez) que apenas verifica a existência de algum arquivo , que é gerado pelo script php - se o arquivo estiver presente, ele executa a tarefa e remove o arquivo.

    
por 18.01.2013 / 19:12
0

Eu geralmente faço uma das coisas a seguir:

  • Faça com que o php atualize um banco de dados e tenha um cron cronograma minúsculo sendo executado como o usuário correto que verifica esse banco de dados. Isto irá introduzir um atraso, mas é mais seguro
  • Envolva todos esses comandos em um shellscript e faça o apache executar sudo -u correctuser_here /path/to/script e, claro, adicionar permissões para isso em / etc / sudoers: www-data ALL=correctuser /path/to/script
  • E meu favorito: usar software de enfileiramento (sou parcial ao beanstalk como é simples): Fazer o php adicionar um item a uma fila e ter um daemon em segundo plano constantemente recuperando e processando itens.

Na sua opção de uso 2 parece ser a coisa certa a fazer.

    
por 18.01.2013 / 19:44