sábado, 25 de fevereiro de 2012

Utilizando o iptables ou ngninx para responder requisições na porta 80 como usuário não-root


Por questões de segurança jamais devemos permitir que serviços num servidor unix sejam executados como root. Isso permitiria que uma falha nesse serviço (e como desenvolvedores sabemos que essas falhas realmente acontecem) comprometesse todo o sistema.

Pelas mesmas restrições de segurança, não é permitido que usuários não-root escutem (realizem o bind de sockets) em portas inferiores à 1024. A questão é: como então executar um serviço (HTTP, no nosso exemplo) na porta 80 como usuário não-root?

Utilizarei o HTTP - que roda na porta 80 - como exemplo, pois provavelmente é o caso de uso mais popular. Imagino que você precise que um Tomcat, um Glassfish ou um JBoss seja executado no seu servidor. Normalmente estes serviços são inicializados na porta 8080. Apresento então duas solução possíveis:
  1. Caso você possua somente um serviço e um domínio, pode utilizar o redirecionamento através do iptables.
  2. Caso você possua vários serviços em portas diferentes e possivelmente vários domínios (virtual hosts) no mesmo servidor, utilize o nginx como proxy. (Sim, é possível fazer o mesmo com o Apache e mod_proxy ou AJP, mas o ngnix provou-se uma solução mais fácil, rápida, prática e com menor consumo de memória).
Exemplo de configuração com o iptables redirecionando as requisições na porta 80 para a 8080:

O REDIRECT de PREROUTING atende as requisições externas, e o REDIRECT de OUTPUT serve para redirecionar as requisições originadas do próprio servidor que estejam direcionadas à porta 80.

Exemplo de configuração com o ngninx atuando como proxy de requisições na porta 80 e redirecionando para a porta 8080:

Com esta configuração do ngnix, basta duplicar as linhas acima com as alterações convenientes e você pode ter dois Tomcats sendo executados no mesmo servidor nas portas 8080 e 8081, por exemplo, e redirecionar o myserver.mydomain.com para a porta 8080 e o myserver2.mydomain.com para a porta 8081. Dois virtual hosts, cada um num Tomcat diferente, no mesmo servidor.