Permitir que o Apache execute um comando como um usuário diferente

5

Eu tenho um script que executa vários comandos no diretório pessoal de um usuário. Os arquivos são de propriedade do usuário e o Apache (o grupo www-data ) só tem privilégios de leitura para eles. O script precisa ser executado sob demanda pelo PHP via exec() , e executa algumas exclusões / untarring de arquivos, que falham, pois o Apache não tem permissões de gravação para os diretórios.

Eu tentei editar o arquivo sudoers da seguinte forma:

www-data ALL=(user) NOPASSWD: /bin/su user -c /home/user/bin/script.sh

mas me pede a senha do usuário

Eu também tentei

www-data ALL=(root) NOPASSWD: /usr/bin/sudo su user -c /home/user/bin/script.sh

mas que solicita www-data sudo password

Como faço para que isso funcione sem uma senha?

    
por Andrei 03.07.2010 / 17:47

4 respostas

4

Finalmente consegui trabalhar com essa linha:

www-data ALL=(ALL) NOPASSWD: /usr/bin/sudo -u user /home/user/bin/script.sh

Como eu precisava de argumentos para o meu script, tive que adicionar um "curinga ao estilo de shell" no final da linha:

www-data ALL=(ALL) NOPASSWD: /usr/bin/sudo -u user /home/user/bin/script.sh [[\:alpha\:]]*

Não é exatamente o que eu estava procurando, mas funciona (isto é, acontece que meus argumentos começam com caracteres alfabéticos, mas na verdade eu gostaria que a expressão correspondesse apenas a caracteres alfanuméricos, traços e pontos).

Eu não estou familiarizado com curingas de shell e classes de caracteres POSIX, o que eu uso é basicamente copiado e colado do manual sudoers. Qualquer um que saiba como isso se aplica a esse tipo de problema, por favor, deixe seus comentários!

    
por 04.07.2010 / 22:42
3

Por que você está executando o su dentro do sudo? (ou pior, sudo dentro do sudo)

www-data ALL=(user) NOPASSWD: /bin/bash /home/user/bin/script.sh

Isso deve funcionar.

    
por 03.07.2010 / 18:09
1

Se não fosse um script, você poderia ter apenas suid o executável e definir o grupo & permissões para que apenas o servidor possa executá-lo.

Você também pode usar suExec (somente apache) ou CGIWrap (qualquer servidor web) para executar CGIs sob outros usuários. Há também suPHP especificamente para PHP em modo não-CGI no Apache.

Eles oferecem opções ligeiramente diferentes (por exemplo, o CGIwrap pode definir limites de recursos), mas, em geral, eles executam programas como usuários alternativos.

    
por 04.07.2010 / 23:13
1

Eu fiz uma abordagem diferente para isso, para permitir que o usuário do apache sudo para um usuário especificado que pode, então, executar todos os comandos (ou você pode especificar uma lista se você precisar apenas de um ou poucos.

APACHEUSER        ALL=(USERNAME)        ALL
Defaults:APACHEUSER       targetpw
Defaults:APACHEUSER             !requiretty

isso permite que a senha seja enviada a partir do código (por exemplo, leitura do banco de dados) usando:

echo password | sudo -u username -S bash -c command_here arguments_here

Apenas certifique-se de usar um usuário dedicado para isso, e não coloque esse usuário no grupo wheel.

veja também aqui

geert

    
por 07.06.2011 / 11:10