Sie sind auf Seite 1von 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 no difcil, porm algumas medidas de segurana eu procurei utilizar para dar um pouco de segurana e no 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 histrico e a partir dele poderamos ter usurios fazendo requisies desse script ao servidor por engano muitas vezes. Ento o melhor seria deixar que somente usurios autorizados pudessem fazer isso. Usurio e senha o mnimo de segurana que se poderia fazer, mas vincular o script a um SGBD s para dar as permisses deixaria o script muito mais complicado do que o que eu queria no incio. O que fazer ento? Bom, a soluo que encontrei foi criar um nico usurio e uma senha respectiva e usar um hash para encriptar ambos. Isso ainda no me deixava satisfeito, faltava algo ainda. Achei interessante tambm controlar o host de onde parte a requisio, que, claro, s poderia partir da prpria mquina, por qualquer um dos IPs que ela tivesse, fosse localhost, fosse o IP da LAN. Para completar as pequenas medidas de segurana, verificar se o mtodo de envio for POST se torna necessrio, pois assim sei que o formulrio for enviado da forma certa

O script comentado
<? //VARIVEL QUE RECEBER AS MENSAGENS DE ERRO OU DE SUCESSO $msg = null; //VERIFICA SE O MTODO 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 REQUISIO //EXCLUI O CARACTERE '?' DO FINAL DO ENDEREO //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 USURIO 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>"; } } ?>

Dando cara ao script: fazendo uma interface simples


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

Preparando o ambiente para fazer o desligador funcionar


No tpico 2 deste artigo falou-se em hashes de usurio e senha. Realizar isso em PHP fcil, porm mais seguro deixar o hash j criado dentro do script do que deix-lo para ser gerado dinamicamente. Algum mal intencionado por ter acesso ao arquivo e descobrir quem o usurio e sua senha e no s desligar o servidor, tambm pode us-lo para tentar acessar outros sistemas, e-mails e qualquer outra coisa que necessitem desses dados. Para termos, por exemplo, os hashes de usurio e senha para teste voc pode criar um outro arquivo ou usar o incio do script para fazer isso, simplesmente colocando isso:

<? echo md5('usrtryade'), "<br/>", md5('try4depwd'); ?>

Quando voc rodar o script no seu browser ele ento mostrar as duas primeiras linhas com os hashes que vamos substituir no script do desligador. Apague isso do script depois, no esquea. Para, finalmente, fazer o script funcionar ns devemos ter acesso a um arquivo de configurao do sistema operacional, o /etc/sudoers, para fazer uma configurao que permitir que o usurio do apache, o www-data, tenha permisso de utilizar comando /sbin/halt, que far o trabalho de desligamento.

Configurando o /etc/sudoers
Para acess-lo necessrio ter permisses de administrador. Acesse no seu terminal com o comando: $ sudo vim /etc/sudoers O arquivo tem algumas sees comentadas que garantem que voc coloque as coisas certas nos lugares certos. As que usaremos so "User alias specification", "Cmnd Alias Specification" e o mais importante ir ao final do arquivo. Na primeira seo que usaremos, a "User alias specification", escreveremos User_Alias WWW = www-data. Na primeira seo que usaremos, a "Cmnd Alias Specification", escreveremos Cmnd_Alias SHUTDOWN_CMDS = /sbin/halt. Ao final do arquivo escreveremos a permisso para que o usurio www-data (apache) realize o desligamento. Escreva: WWW ALL=(ALL) NOPASSWD: SHUTDOWN_CMDS

Verificando o funcionamento
Quando voc for fazer a primeira tentativa de desligamento da mquina a partir do browser lembre-se que qualquer erro que acontea ir para o log do apache e voc pode visualizar o movimento em tempo real usando comando tail com o parmetro -f seguido do nome do arquivo de log, que geralmente ser /var/log/apache2/error.log, ou seja, no terminal digite: tail -f /var/log/apache2/error.log. Assim que voc enviar o formulrio com usurio a senha corretos ele apresentar o resultado da requisio. Se aparecer no log a mensagem "halt: Need to be root" voc deve refazer os passos e verificar se errou alguma coisa na implementao.

Concluso
Como visto acima, configurar o apache no escopo do nosso artigo, voc pode colocar o desligador na DocumentRoot padro do apache e a partir o endereo http://endereco_do_servidor/nome_do_arquivo_desligador.php ter acesso funcionalidade.

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 escritrios de clientes. D liberdade para mim, pois no tenho que fazer atender tantos chamados e ao cliente porque ele pode desligar o servidor sem necessitar de interveno de algum com conhecimentos sobreLinux. O browser se torna suficiente. Esse artigo tem a funo de mostrar que podemos usar uma linguagem como o PHP para mais que s acesso a banco de dados para sites ou pequenos sistemas. D tambm para integr-lo a outras funes, usar comandos como o halt e outros, que s os superusurios tem, tambm possvel. Tudo vem da experincia.

1.

Das könnte Ihnen auch gefallen