apache-user e acesso root

3

Eu quero desenvolver poucos scripts em php que invoquem 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 na roda ou não executa comandos (como mencionado acima).

A seguir estão minhas configurações;

Meus / etc / sudoers

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

Como eu tentei um par de combinações com sudoer & httpd.conf, o recente httpd.conf parece algo como segue:

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);

Resultado

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 eu invoco os serviços de rede de reinicialização via ssh, usando um usuário semelhante como o apache, o comando é executado com sucesso. É tudo sobre como 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 eu preciso da sua ajuda para entender qual parte eu estou perdendo?

Muito obrigado!

    
por Ahmed Memon 18.01.2010 / 01:45

5 respostas

3

Se você pegar a solução da troyengel de lançar uma entrada na tabela cron do root, modifique-a um pouco, você pode ter uma solução viável.

Se você absolutamente, positivamente precisa usar o apache para sinalizar uma reinicialização de interface, por que não ter o PHP criar um arquivo que atua como um sinalizador, e então ter seu cronjob de root que executa a cada minuto (ou o que for) verificar a existência de essa bandeira. Se existir, reinicie as interfaces. Se isso não acontecer, morra. (lembre-se de fazer com que o cronjob remova o sinalizador depois que ele reiniciar a interface com sucesso).

Isso alcança o objetivo (reiniciar a interface, acionado a partir do apache / php) e afeta todos os possíveis problemas envolvidos na concessão de acesso ao nível da raiz do serviço de web / scripting.

    
por 18.01.2010 / 05:33
1

Você terá que escrevê-los como ferramentas orientadas pela linha de comando do PHP (certifique-se de que o pacote php-cli esteja instalado via yum), e então executá-los no root crontab diretamente, não como um usuário normal. Você provavelmente quer escrevê-lo no script bash (shell) básico também, usando php seria um exagero se você está apenas executando comandos via exec ().

    
por 18.01.2010 / 01:51
1

Você deve invocar os comandos necessários para ser executado como um usuário diferente usando sudo e, em seguida, definir o arquivo de configuração sudoers adequadamente 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.

    
por 18.01.2010 / 01:55
1

Dows isso responde à sua pergunta ?

    
por 18.01.2010 / 07:23
1

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

No entanto, você não pode simplesmente setuid em um script de shell. Você precisa fazer um executável regular com o C / C ++, algo que não chama um interpretador como os shell scripts, e que execute o shell script.

    
por 18.01.2010 / 11:14