usuário apache e acesso root

usuário apache e acesso root

Quero desenvolver alguns scripts em php que invocarão os seguintes comandos; usando a função exec()

service network restart

crontab -u root /xyz/abc/fjs/crontab

etc.

O problema é que o Apache executa o script como usuário do Apache (estou no CentOS 5), independentemente de adicionar o Apache ao wheel oufazendo o bem, o mal e o feio a atribuição de grupo não executa comandos (conforme mencionado acima).

A seguir estão minhas configurações;

Meu /etc/sudoers

root    ALL=(ALL)       ALL
apache  ALL=(ALL)       NOPASSWD: ALL
%wheel  ALL=(ALL)       ALL
%wheel  ALL=(ALL)       NOPASSWD: ALL

Como tentei algumas combinações com sudoer e httpd.conf, o recente httpd.conf se parece com o seguinte;

meu httpd.conf

User apache
Group wheel

meu script PHP

exec("service network start", $a);
print_r($a);

exec("sudo -u root service network start", $a);
print_r($a);

Saída

Array
(
    [0] => Bringing up loopback interface:  [FAILED]
    [1] => Bringing up interface eth0:  [FAILED]
    [2] => Bringing up interface eth0_1:  [FAILED]
    [3] => Bringing up interface eth1:  [FAILED]
)
Array
(
    [0] => Bringing up loopback interface:  [FAILED]
    [1] => Bringing up interface eth0:  [FAILED]
    [2] => Bringing up interface eth0_1:  [FAILED]
    [3] => Bringing up interface eth1:  [FAILED]
)

Sem nenhuma surpresa, quando invoco a reinicialização dos serviços de rede via ssh, usando um usuário semelhante como o apache, o comando é executado com sucesso. É tudo uma questão de acessar esses comandos via protocolo HTTP. Tenho certeza de que o tipo de software cPanel/Plesk usa algo como sudoer ou algo assim e o que estou tentando fazer é basicamente possível. Mas preciso da sua ajuda para entender qual peça está faltando?

Muito obrigado!

Responder1

Se você adotar a solução de troyengel de lançar uma entrada na tabela cron raiz e modificá-la um pouco, poderá ter uma solução viável.

Se você absolutamente precisa usar o Apache para sinalizar uma reinicialização da interface, por que não fazer com que o PHP crie um arquivo que atue como um sinalizador e, em seguida, faça com que seu cronjob raiz que é executado a cada minuto (ou o que quer que seja) verifique a existência desse sinalizador. Se existir, reinicie as interfaces. Se não, morra. (lembre-se de fazer com que o cronjob remova o sinalizador após reiniciar a interface com sucesso).

Isso atinge o objetivo (reiniciar a interface, acionada a partir do Apache/php) e contorna todos os possíveis problemas envolvidos na concessão de acesso de nível raiz a um serviço de web/script.

Responder2

Você terá que escrevê-los como ferramentas orientadas por linha de comando PHP (certifique-se de que o pacote php-cli esteja instalado via yum) e, em seguida, execute-os diretamente no crontab raiz, não como um usuário normal. Você provavelmente também deseja escrevê-lo em um script básico bash (shell), usar php seria um exagero se você estivesse apenas executando comandos via exec().

Responder3

Você deve invocar os comandos necessários para executar como um usuário diferente usando sudo-- e definir o sudoersarquivo de configuração apropriadamente para que o usuário que executa o script PHP tenha permissão para executar os scripts como o outro usuário. Veja sudoers(5) e cerca de uma dúzia de perguntas anteriores sobre o uso do sudo.

Responder4

você pode usar o sticky bit para fazer um script de shell ser executado como root. no entanto, fazer isso é um pouco mais complicado.

No entanto, você não pode simplesmente configurar um script de shell. Você precisa criar um executável regular com, digamos, C/C++, algo que não chame um intérprete como os scripts de shell fazem, e fazer com que execute o script de shell.

informação relacionada