Permitindo que o PHP execute script bash específico com permissões de root

3

Eu tenho um script php chamando um script bash como este:

<?php
    $result = exec('sudo /bin/bash /var/www/my_bash_script.sh /var/www/vhosts/testsite/htdocs/');
    var_dump($result);
?>

Este é o conteúdo de my_bash_script.sh :

#!/bin/bash
svn export --force --no-auth-cache --username myusername --password mypassword http://1.2.3.4/repos/path/to/repo/ $1 2>&1
find $1 -print0 -type d | xargs -0 -n 1 -0 chown -R -v root:root 2>&1
find $1'storage' -print0 -type d | xargs -0 -n 1 chown -R -v apache 2>&1
find $1'shared' -print0 -type d | xargs -0 -n 1 chown -R -v apache 2>&1

O objetivo do script é fazer uma exportação a partir do meu repositório svn e definir permissões de usuário corretamente.

O PHP é executado como o usuário apache .

Para conceder permissão PHP para executar este script, adicionei a seguinte linha aos sudoers:

apache ALL=(ALL) NOPASSWD:ALL

Agora, obviamente, isso dá ao PHP muita energia, então eu quero restringir o PHP para apenas executar este script bash específico, mas parece que não consigo acertar a sintaxe:

apache ALL=(ALL) NOPASSWD:/var/www/my_bash_script.sh

O acima apenas retorna uma string vazia (para a variável $result PHP) - o que estou fazendo errado?

Obrigado!

Editar: - já comentei #Defaults requiretty em sudoers.

    
por bbeckford 22.04.2016 / 10:20

2 respostas

5

Posso estar errado, mas acredito que os sudoers também restringem os parâmetros que podem ser passados para um comando / script, não apenas para o comando em si.

Se você tentar executar o seu .sh sem o parâmetro, provavelmente funcionará, por exemplo,

  sudo /bin/bash /var/www/my_bash_script.sh

Então, para dizer aos sudoers para permitir que esse script seja executado com qualquer parâmetro (pelo apache), você precisaria ajustar a linha da seguinte forma:

  apache ALL=(ALL) NOPASSWD:/var/www/my_bash_script.sh *

O curinga permite que o apache execute esse script com qualquer parâmetro.

Você também pode precisar / bin / bash nessa linha, mas não tenho certeza

  apache ALL=(ALL) NOPASSWD: /bin/bash /var/www/my_bash_script.sh *

Se alguém puder confirmar ou refutar minha compreensão disso, será muito apreciado

    
por 22.04.2016 / 11:22
0

Você pode usar as seguintes configurações

Cmnd_Alias SVNUP = /root/webhooks/svn_update.sh
apache ALL=(ALL) NOPASSWD: SVNUP

Crie um script de teste simples

# cat test.sh
#!/bin/bash

set -u
echo "Param1: $1"

Faça testes simples

$ id alex
uid=506(alex) gid=506(alex) groups=506(alex)

$ cat /root/webhooks/test.sh
cat: /root/webhooks/test.sh: Permission denied

$ sudo /root/webhooks/test.sh val1
Param1: val1

$ sudo /root/webhooks/test.sh
/root/webhooks/test.sh: line 5: $1: unbound variable

Mas você deve ter muito cuidado devido a expansões variáveis, por exemplo,

$ sudo /root/webhooks/test.sh "$(rm -fr ~/*)"

P.S. Como alternativa, você pode usar o mpm-itk com o apache e executar este vhosts em particular com um usuário específico.

    
por 22.04.2016 / 11:01