Você está na página 1de 4

Utilizando PHP e Apache para desligar um Ubuntu

Idealizando o script
Para fazer um script em PHP para desligar um servidor com o Ubuntu instalado não é difícil, porém algumas medidas de segurança eu procurei utilizar para dar um pouco de segurança e não deixar o script muito rebuscado. Fazer o servidor desligar somente ao se acessar o script pelo browser seria uma fonte de pequenos desastres, pois o browser tem o seu histórico e a partir dele poderíamos ter usuários fazendo requisições desse script ao servidor por engano muitas vezes. Então o melhor seria deixar que somente usuários autorizados pudessem fazer isso. Usuário e senha é o mínimo de segurança que se poderia fazer, mas vincular o script a um SGBD só para dar as permissões deixaria o script muito mais complicado do que o que eu queria no início. O que fazer então? Bom, a solução que encontrei foi criar um único usuário e uma senha respectiva e usar um hash para encriptar ambos. Isso ainda não me deixava satisfeito, faltava algo ainda. Achei interessante também controlar o host de onde parte a requisição, que, é claro, só poderia partir da própria máquina, por qualquer um dos IPs que ela tivesse, fosse localhost, fosse o IP da LAN. Para completar as pequenas medidas de segurança, verificar se o método de envio for POST se torna necessário, pois assim sei que o formulário for enviado da forma certa

O script comentado
<? //VARIÁVEL QUE RECEBERÁ AS MENSAGENS DE ERRO OU DE SUCESSO $msg = null; //VERIFICA SE O MÉTODO DE ENVIO É POST if ( $_SERVER["REQUEST_METHOD"] == "POST" ) { //ARMAZENA O NOME DO HOST E O NOME DO SCRIPT LOCAL $host = $_SERVER["HTTP_HOST"] . $_SERVER["PHP_SELF"]; //ARMAZENA O HOST DE ONDE PARTIU A REQUISIÇÃO //EXCLUI O CARACTERE '?' DO FINAL DO ENDEREÇO //EXCLUI OS PROTOCOLOS http e https. $referer = preg_replace("/(http:\/\/|https:\/\/)/","", str_replace("?","",$_SERVER["HTTP_REFERER"])); //VERIFICA SE O LOCAL QUE REQUISITOU É O MESMO QUE RECEBE //IMPEDE QUE O DESLIGAMENTO SEJA REQUISITADO DE OUTRO LUGAR if ( $referer == $host ) { //COMPARA OS CAMPOS ENVIADOS POR POST AOS HASHES DE USUÁRIO E SENHA AUTORIZADOS if ( md5($_POST["usuario"]) == "HASH_MD5_DO_USUARIO" && md5($_POST["senha"]) == "HASH_MD5_DA_SENHA" ) { //EXECUTA O COMANDO HALT NO SISTEMA OPERACIONAL exec("sudo /sbin/halt"); //ARMAZENA A MENSAGEM DE SUCESSO EM $msg $msg = "<p class=\"ui-state-error\">Desligando o servidor</p>"; } else { //ARMAZENA A MENSAGEM DE ERRO EM $msg $msg = "<p class=\"ui-state-error\">Tentativa sem sucesso</p>"; } } else { //ARMAZENA A MENSAGEM DE ERRO EM $msg $msg = "<p>Tentativa sem sucesso</p>"; } } ?>

background-color: #EEE.3/themes/base/jquery-ui. bottom: 1px. charset=utf-8" http-equiv="content-type"> <style> body { font-family: "Trebuchet MS".css" type="text/css" /> <meta name="author" content="Evaldo Barbosa"> <meta name="author" content="Tryade Software"> <meta content="text/html.tag { position: absolute. height: 15px. height: 230px. nem perca tempo olhando detalhes e detalhes na interface. } p.w3. border: 1px solid #999. top: 50%. } p { font-size: 12px. arial. } .8. A ideia é um desligador. } label { display: block.com/ajax/libs/jqueryui/1.dtd"> <html xmlns="http://www. margin-top: -115px. left: 50%. text-align: center.googleapis. } </style> </head> <body> <fieldset class="ui-corner-all"> <legend>Desligar o servidor</legend> <form method="post" action="?"> <? echo $msg. width: 100px. ?> <p>Informe o seu usuário e sua senha para desligar o servidor da rede</p> <label>Nome do usuário</label> <input type="text" id="usuario" name="usuario" autocomplete="true"/> <label>Senha</label> <input type="password" id="senha" name="senha" autocomplete="true"/> <input type="submit" id="send" name="send" value="Desligar"/> </form> </fieldset> <div class="tag">Tryade Software</div> </body> </html> .0 Transitional//EN" "http://www. margin-left: -115px.ui-state-error { padding: 5px. font-size: 11px.w3. color: #AAA. width: 230px.org/1999/xhtml"> <head> <title>Desligador</title> <link rel="stylesheet" href="http://ajax.org/TR/xhtml1/DTD/xhtml1transitional. não um site cheio de firulas. } fieldset { position: absolute. mas nada de Javascript para dar um cara melhor para que o usuário não se depare com algo desleixado. right: 1px. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. Abaixo temos o que é necessário para essa interface.Dando cara ao script: fazendo uma interface simples ogo após o script eu inclui HTML e CSS.

Realizar isso em PHP é fácil.log. Conclusão Como visto acima. por exemplo. escreveremos User_Alias WWW = www-data. também pode usá-lo para tentar acessar outros sistemas. md5('try4depwd'). Apague isso do script depois. fazer o script funcionar nós devemos ter acesso a um arquivo de configuração do sistema operacional.Preparando o ambiente para fazer o desligador funcionar No tópico 2 deste artigo falou-se em hashes de usuário e senha.log. Ao final do arquivo escreveremos a permissão para que o usuário www-data (apache) realize o desligamento. não esqueça. . Configurando o /etc/sudoers Para acessá-lo é necessário ter permissões de administrador. para fazer uma configuração que permitirá que o usuário do apache. Na primeira seção que usaremos. Se aparecer no log a mensagem "halt: Need to be root" você deve refazer os passos e verificar se errou alguma coisa na implementação. e-mails e qualquer outra coisa que necessitem desses dados. a "User alias specification". Na primeira seção que usaremos. Para. finalmente. o /etc/sudoers. no terminal digite: tail -f /var/log/apache2/error. porém é mais seguro deixar o hash já criado dentro do script do que deixá-lo para ser gerado dinamicamente. que geralmente será /var/log/apache2/error. escreveremos Cmnd_Alias SHUTDOWN_CMDS = /sbin/halt. o www-data. a "Cmnd Alias Specification". tenha permissão de utilizar comando /sbin/halt. ?> Quando você rodar o script no seu browser ele então mostrará as duas primeiras linhas com os hashes que vamos substituir no script do desligador. Acesse no seu terminal com o comando: $ sudo vim /etc/sudoers O arquivo tem algumas seções comentadas que garantem que você coloque as coisas certas nos lugares certos. você pode colocar o desligador na DocumentRoot padrão do apache e a partir o endereço http://endereco_do_servidor/nome_do_arquivo_desligador. que fará o trabalho de desligamento. Escreva: WWW ALL=(ALL) NOPASSWD: SHUTDOWN_CMDS Verificando o funcionamento Quando você for fazer a primeira tentativa de desligamento da máquina a partir do browser lembre-se que qualquer erro que aconteça irá para o log do apache e você pode visualizar o movimento em tempo real usando comando tail com o parâmetro -f seguido do nome do arquivo de log. simplesmente colocando isso: <? echo md5('usrtryade').php ter acesso à funcionalidade. Alguém mal intencionado por ter acesso ao arquivo e descobrir quem é o usuário e sua senha e não só desligar o servidor. Assim que você enviar o formulário com usuário a senha corretos ele apresentará o resultado da requisição. As que usaremos são "User alias specification". "Cmnd Alias Specification" e o mais importante irá ao final do arquivo. "<br/>". Para termos. ou seja. os hashes de usuário e senha para teste você pode criar um outro arquivo ou usar o início do script para fazer isso. configurar o apache não é escopo do nosso artigo.

usar comandos como o halt e outros. . Dá também para integrá-lo a outras funções. Dá liberdade para mim. Tudo vem da experiência. Esse artigo tem a função de mostrar que podemos usar uma linguagem como o PHP para mais que só acesso a banco de dados para sites ou pequenos sistemas. que só os superusuários tem. 1.Esse script foi o resultado de uma pequena pesquisa e que resolveu boa parte dos meus problemas com o desligamento de alguns computadores que eu mantenho nos escritórios de clientes. O browser se torna suficiente. pois não tenho que fazer atender tantos chamados e ao cliente porque ele pode desligar o servidor sem necessitar de intervenção de alguém com conhecimentos sobreLinux. também é possível.