Como obtenho scripts simples que parecem necessitar de priveliges de raiz para serem executados via usuário www-data?

2

Estou programando uma pequena interface web para controlar o samba no Debian (kernel 2.6.32-5-686). Comecei escrevendo scripts simples para adicionar usuários, criar pastas, etc. Eles funcionaram bem quando executados como root. No entanto, quando executado via web (apache + php) usando php: shell_exec() alguns deles não funcionaram. Eles se parecem com isso:

#!/bin/sh
#archive the userprofile
cp /home/samba/profile/$1 /home/samba/archive/$1
smbpasswd -LU $1 -x
userdel $1 
exit 0

Eu tentei usar o sudo para executar os scripts, o que parece não funcionar. Eu adicionei esta linha: (jupiter é o nome do servidor)

%sudo jupiter=(ALL)NOPASSWD:/bin/<script>

para o / etc / sudoersfile, deu ao meu usuário www-data o grupo sudo, nada.

Então eu li em algum lugar que eu deveria chmod 4755 e chown dos scripts. Ainda não funcionou.

Neste ponto, fiquei curioso sobre qual era o problema e redirecionei o STDERR para um arquivo. Executei um dos pequenos scripts, que chamaria cp , smbpasswd e userdel para excluir o usuário e arquivar sua parte. Todas as chamadas retornaram o código de saída 1, que indica que alguma coisa deu errado. STDERR me deu uma pequena pista:

userdel: cannot lock /etc/passwd; try again later.

Isso parece ser causado por alguns arquivos * .lock, mas não há nenhum em minha pasta / etc /.

Neste ponto, fiquei meio frustrado e tentei dar mais direitos de root ao www-data adicionando-o ao grupo raiz. As coisas ainda não funcionaram.

Até agora, para o meu progresso, não tenho ideia do que fazer a seguir. Minha pergunta é: Como obtenho scripts simples que parecem precisar de privilégios de root para rodar através do usuário www-data? Eu acho que pode ser um problema com o arquivo / etc / passwd, como eu posso imagine apenas o usuário root tem o direito de alterá-lo.

    
por skiddo 11.09.2012 / 12:04

2 respostas

2

minha resposta está relacionada apenas à linha

sudo jupiter=(ALL)NOPASSWD:/bin/<script>

Com essa linha, você permite que o usuário sudo execute /bin/<script> no host juptier como qualquer usuário sem autenticação. Eu não acho que você quer isso.

Se eu entendi corretamente, você deseja que o usuário www-data execute /bin/<script> como root. Neste caso, a linha apropriada se parece com

www-data jupiter=(root) NOPASSWD:/bin/<script>

Agora você pode executar /bin/<script> as www-data com root privileges invocando

www-data:~ $ sudo /bin/<script>

ou via shell_exec("sudo /bin/<script>") no seu script php (espero que você se importe com questões de segurança).

Para mais detalhes, consulte man sudoers ou a versão on-line sudoers.man . Para um entendimento rápido, recomendo dar uma olhada na seção EXAMPLES .

    
por 11.09.2012 / 13:11
0

Existem algumas maneiras diferentes ...

  • use o sudo como já foi descrito
  • configura o Apache com o recurso suEXEC (pode não ser uma opção com php?)
  • use um pequeno programa setuid que invoca seu código
  • e tem mais ...

O mais fácil é provavelmente usar o sudo, e isso já foi descrito.

Um resumo rápido da opção sudo:

  1. certifique-se de que o / etc / sudoers não tenha "Padrões requiretty"
  2. adicione esta linha ao arquivo "apache ALL = NOPASSWD: / caminho / para / comando", o que significa que "sudo / caminho / para / comando qualquer" será executado como root se invocado como apache. (Isso pressupõe que seu servidor da Web seja executado como o usuário do apache).

No entanto, se você fizer isso, deixe-me apontar o perigo de tudo isso. Qualquer um que possa acessar sua página pode fazer o que for feito - com o userdel, eles podem excluir usuários (e possivelmente todos os seus arquivos), e dependendo de como o código é escrito, eles podem enganá-lo e deixá-los execute qualquer comando arbitrário como root.

(Agora, se configurado corretamente, o sudo pode limitar o que eles podem fazer, assim como um programa escrito corretamente (apesar de escrever programas seguros setuid, CGI e php (que usam shell_exec () como você é) pode ser complicado pode ser bastante destrutivo por si só.)

Então ... se você fizer isso, no mínimo, certifique-se de que o sudo (se você usa o sudo) esteja configurado para executar apenas os comandos que precisam ser executados e certifique-se de que sua página não esteja acessível para qualquer pessoa - bloqueie-a atrás de uma senha no Apache, por exemplo, e seja especialmente cauteloso se ela estiver na Internet, e não atrás de um firewall corporativo (mas, mesmo assim - não confie no firewall para torná-lo seguro). Certifique-se de que outras pessoas não confiáveis não possam adicionar programas CGI ou PHP neste host, pois eles também poderão usar essa linha em / etc / sudoers.

Como você está usando o shell_exec () do php, tenha muito cuidado com os argumentos que seu código alimenta para esse comando. Se você deixar o usuário colocar o que ele quiser lá, ele pode fazer qualquer coisa.

Suponha que seu comando seja "userdel $ user" e $ user veio diretamente do usuário desta página da web. Se usuário="foo; reboot". Se isso estava sendo executado como root ... seu computador iria reiniciar. Mas mesmo que não seja executado como root, ele poderia executar o código como o usuário do apache que poderia tentar entrar na máquina.

Dito isso, como higienizar adequadamente suas entradas é um tópico mais longo do que essa simples resposta realmente permite - não estou realmente tentando abordar todo esse tópico, apenas para abordá-lo.

    
por 19.12.2016 / 16:57