sábado, 10 de outubro de 2015

Disponibilizando o servidor na porta 80


Esses dias tive que reconfigurar meu servidor (um droplet do digitalocean) e me deparei com um problema antigo. Configurar o servidor na porta 80. Obviamente isso é extremamente básico de se fazer MAAAAAS a maioria das pessoas coloca o sistema em risco quando faz isso.

Primeiramente, porque colocar o servidor na porta 80 ? Os servidores Java que baixamos vem por default rodando na porta 8080 que é uma porta secundária destinada ao protocolo HTTP. Já o servidor padrão do ruby e do nodejs rodam na porta 3000. É uma questão básica de escolha. No entanto se você acessar um site que roda em um servidor configurado na porta diferente da porta 80, você deverá declará-la. Imagine como seria chato acessar o G1 com a url www.g1.com.br:8080. Isso sem contar que você deveria saber qual a porta cada site está rodando. Pra facilitar a vida, convencionou-se que a porta padrão HTTP seria a 80 e caso a porta fosse omitida, então significa que deve-se usar a porta padrão. Resumindo, digitar www.g1.com.br é a mesma coisa que digitar www.g1.com.br:80 . Massa né ? Pode tentar... Ambas funcionarão.

Os sistemas operacionais se comunicam com outros programas através de portas que vão da porta 1 até a porta 65 mil e alguma coisa... No entanto as primeiras mil portas são especiais pois são usadas pelo sistema operacional. Logo, para rodar um programa usando uma dessas portas, precisamos de duas coisas: que a porta não esteja sendo usada e usar a conta de administrador. É aí que começa o problema...

Quando você utiliza a conta de administrador pra iniciar o servidor na porta 80, o processo roda com os privilégios do administrador. CASO você seja vítima de um ataque de shell reverso por exemplo, o atacante poderá fazer absolutamente tudo na sua máquina. Nenhum arquivo será poupado de um ataque com privilégios de administrador. Percebe o tamanho do problema ? Ainda mais sendo tão simples de arrumar.

Ao meu ver, a forma mais simples de arrumar é com o firewall. Você roda o seu servidor com um usuário comum e com privilégios limitados AND na porta 8080 e usa o firewall pra redirecionar o tráfego da porta 80 pra porta 8080. Simples assim! Vou explicar melhor... Você coloca seu site rodando na porta 8080. Pra acessá-lo, bastaria digitar www.meusite.com.br:8080. Quando essa requisição chegar no servidor, o firewall a processará antes de passar para o servidor. No momento que o firewall ver que é uma requisição para a porta 80, ele irá mudar pra porta 8080. Com isso a requisição irá para nosso servidor e o usuário nem vai saber que estamos rodando o servidor na porta 80.

Para fazer essa configuração, vamos começar instalando o iptables (para isso precisamos do root).


Caso seu sistema já esteja com o iptables instalado e atualizado, exibirá uma mensagem igual a essa. Caso não esteja instalado, o apt-get irá baixar os pacotes necessários e instalar. 

Agora para configurar o redirecionamento da porta 80 pra porta 8080, basta digitarmos o seguinte comando:

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

Feito isso, todos pacotes do protocolo TCP vindos pela interface de rede eth0 com porta de origem 80, serão redirecionados para a porta 8080. E o melhor. Caso o sistema seja invadido, o máximo de estrago possível de causar estará de acordo com as permissões que VOCÊ deu para o usuário. Então, veja lá. Abraço !