Execução segura de comandos do sistema como sudo do PHP [closed]

1

É possível?

Eu escrevi uma ferramenta de linha de comando em PHP para criar novos ambientes para nossa empresa. Ele cria usuários do sistema, diretórios, bancos de dados, VHosts e reinicia o apache, entre outras coisas. Esses comandos exigem sudo privileges. Eu pensei que seria uma boa idéia ter uma interface web para isso, para facilitar o uso de outros não-desenvolvedores. O aplicativo da web estaria por trás da autenticação.

Ao executar a partir da linha de comando, apenas corro sudo tool.php , obviamente não posso fazer isso de um aplicativo da Web.

Como posso fazer isso com segurança? Dar ao usuário do apache acesso ao sudo parece bobo, já que isso significaria que todos os sites hospedados na caixa (por exemplo, todos os nossos ambientes) teriam acesso ao sudo. É possível fazer com que essa ferramenta seja executada com um usuário diferente? esse usuário pode ter privilégios sudo apenas para os comandos que eu preciso?

Como coisas como plesk e cPanel fazem isso?

Alguma ideia?

    
por Aydin Hassan 18.08.2014 / 22:00

3 respostas

5

Enquanto esta abordagem se presta a gerar sentimentos ruins, se isso é um mal necessário, eu começaria certificando-se de que o servidor está segmentado da rede - acessível apenas por alguns hosts em uma LAN ou apenas ouvindo para hosts autenticados em uma VPN (ou túnel SSH). Em suma, tente não deixar que esse hospedeiro seja um fruto fácil.

É possível ter um usuário com acesso limitado ao sudo e eu recomendaria isso.

Para começar, crie um usuário sudoers que só pode executar tool.php e pode ser alternado para o seu usuário www-data (ou seja qual for o nome do usuário do seu webserving). Isso limitará o escopo das ações do sudo que podem ser tomadas no servidor (no entanto, se o seu tool.php for explorável, isso não ajuda).

Você pode fazer isso editando sudoers para conter uma linha como:

online_tool_user ALL=(www-data) NOPASSWD: /var/danger/tool.php

Isso permitirá que "online_tool_user" execute o comando /var/danger/tool.php sem digitar uma senha. Se este usuário tentar executar qualquer outro comando (iptables, adduser, et al), ele será negado.

Para tornar a exploração desse usuário menos divertida para um invasor, procure usar shells ou "jails" restritos.

Por fim, se você estiver apenas chamando exec via PHP, ative o usuário na chamada, por exemplo: exec("sudo -u online_tool_user -c 'php /var/danger/tool.php'") .

    
por 18.08.2014 / 22:29
2

Uma abordagem é separar a interface da web da camada de execução, ou seja, usar a interface da web como a interface do usuário e agendar ações. Em seguida, execute uma segunda tarefa com root privileges que busca a fila, valida e executa tarefas agendadas e quais relatórios retornam ao status de saída.

Uma ligeira modificação é onde, em vez de executar o poller de forma independente, seu aplicativo da web pode executar o poller sob demanda com o sudo.

Outra abordagem, menos segura, é executar uma segunda instância do apache para seu aplicativo seguro que é executado como root em vez de apache . A última vez que verifiquei (há muito tempo atrás) que era a abordagem dos painéis de controle da web usados.

    
por 18.08.2014 / 22:14
0

Que tal usar o setuid para que o processo possa ser executado como root?

 chmod 4555 tool.php
 chown root tool.php

Acho que isso deve ser feito corretamente.

    
por 18.08.2014 / 22:43