Executa um script como root do apache

1

Gostaria de atualizar meu arquivo hosts e reiniciar dnsmasq de uma interface da Web (php / apache2). Eu tentei brincar com suid bits (a demonstaration) . Eu tenho os dois apache e dnsmasq em execução em uma instância do EC2.

Eu entendo que o Linux ignora o bit setuid em scripts de texto, mas funciona em arquivos binários. (Eu tenho algo errado?) Eu adicionei exec("whoami"); ao exemplo do programa C na Wikipedia. Embora o UID efetivo do programa C seja 0, whoami não retorna root : - (

Eu gostaria de evitar completamente

echo password | sudo service dnsmasq restart

ou adicionando o apache aos sudoers sem senha! Há alguma saída? Como o webmin faz essas coisas?

    
por Lord Loh. 09.04.2012 / 20:20

2 respostas

3

Eu gostaria de outra abordagem e configurar um script incron que é executado como como root, que monitora algumas alterações no arquivo e responde aplicando suas alterações no arquivo / etc / hosts.

Com a abordagem de incron, você define uma entrada de inotificação para assistir a algumas alterações no arquivo e responde executando um script;

/var/www/hosts IN_CLOSE_WRITE /run/this/as/root

Portanto, o apache tem permissões para gravar em / var / www / hosts usando php ou qualquer outra coisa e o script / run / this / as / root é executado como root para aplicar as alterações ao arquivo / etc / hosts

    
por 09.04.2012 / 20:41
2

Eu tenho a tendência de endereçar isso permitindo que o processo que executa o servidor, neste caso o servidor web, execute o comando relevante, e somente esse comando, via sudo sem senha.

Por exemplo, aqui está a minha entrada sudoers para permitir que um usuário chamado NAGIOS (que executa meu servidor de monitoramento local) execute um plug-in que verifica esse hardware RAID como root:

nagios  ALL=(root) NOPASSWD: /usr/lib/nagios/plugins/check_md_raid

Você teria algo semelhante, talvez:

apache  ALL=(root) NOPASSWD: /sbin/service dnsmasq restart

Para resolver suas preocupações acima, isso não permite que qualquer pessoa que possa subverter o processo do apache execute sudo bash , sudo shutdown -h now ou mesmo sudo service dnsmasq stop . Ele permite exatamente o que é especificado no arquivo sudoers.

É verdade que, se o comando service estiver mal escrito e alguém puder encontrar uma maneira de executar service dnsmasq stop como root via sudo, altere o modo no arquivo passwd ou inicie uma% de permissão.sshd na porta 22222, ou mesmo fazer qualquer coisa nefasta, então você tem um problema. Mas, nesse caso, você tem um problema, no entanto, você executa o comando de serviço como root , seja via sudo ou qualquer outro mecanismo. sudo faz o melhor para higienizar o ambiente, e o comando de serviço é um componente da maioria dos GNU / Linuxes (e já existe há algum tempo) e, portanto, provavelmente não tem falhas óbvias.

Executar o comando service via passwordless sudo não é menos seguro do que qualquer outro método de executá-lo, e provavelmente mais seguro do que muitas formas caseiras ou outras menos testadas.

    
por 10.04.2012 / 08:37