Spawnzao

Proxy Reverso com Pound

Por em 07/01/2011 - 3,617 views

Quem administra servidores web tem uma grande preocupação com segurança, mas quando falo em segurança não digo somente a preocupação com os temidos “crackers” e os “script kiddies”, e sim em manter seu servidor web o máximo possível disponível, organizado e estruturado. E é ai que entra o Pound.

O Pound é nada mais que um proxy reverso e balanceador de carga, além disso ele filtra requisições incorretas, suporta hosts-virtuais, fail-over e é um frontend HTTPS. As requisições HTTPS são decodificadas e passadas para o backend em forma de HTTP. Se mais de um servidor backend está definido (cluster de servidor web), ele escolhe um deles aleatoriamente, baseado nas prioridades definidas. Por default, o Pound mantém registro de associação entre clientes e servidores backend (sessions).

Essa imagem ilustra o funcionamento do Pound:

Organização

A maioria dos servidores web são feitos para servir páginas web. Este é seu propósito de ser. Eles foram projetados sem muita preocupação, ou quase nenhuma, com segurança.

Com um proxy reverso como Pound, é possível negar as solicitações maliciosas que o seu servidor web não foi projetado para filtrar. Ao separar os maus clientes com um processo separado, o servidor web pode se concentrar no que foi projetado para fazer: servir páginas web.

Quando temos nossos serviços organizados e bem definidos, as chances de acontecerem falhas diminuem e a manutenção fica mais fácil e ágil.

Estruturação

Agora que nossos serviços estão organizados, podemos montar uma boa estrutura dos nossos servidores web.

O primeiro passo para isso, é limitar a quantidade de servidores que tem contato direto com a Internet e utilizar um proxy reverso para filtrar as requisições web dos nossos servidores. Com isso, somente os frontend terão um firewall apurado. O nosso cluster de servidores web vão passar a ficar numa nova DMZ (zona desmilitarizada) sem contato com os outros servers, para caso haja uma invasão os outros servidores não ficarem expostos.

Agora que explicamos um pouco o funcionamento do Pound e esclarecemos o cenário, podemos instalá-lo e configurá-lo.

Prática

Caso não possua o repósitório EPEL, instale-o com o comando abaixo:

32 bits

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm

64 bits

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm

Instalar o pound:

yum install pound

Agora vamos editar o arquivo de configuração do pound, que fica em /etc/pound.cfg:

vim /etc/pound.cfg

Vou mostrar uma simples configuração com o Pound:


ListenHTTP
    Address 1.1.1.1
    Port    80
End

ListenHTTPS
    Address 1.1.1.2
    Port    443
    Cert    "/etc/sslkeys/firstkey.pem"
End

Service
    BackEnd
        Address 10.1.1.1
        Port    80
        Priority 5
    End
    BackEnd
        Address 10.1.1.2
        Port    80
        Priority 4
    End
    BackEnd
        Address 10.1.1.3
        Port    80
        Priority 3
    End
End

Explicando:

O ListenHTTP e o ListenHTTPS definem como o Pound irá receberá as requisições, isto é, pelo endereço definido no Address, pela porta definida no Port e utilizando o certificado definido no Cert.

Com a configuração acima teremos sites HTTP e os mesmos sites HTTPS, somente se diferenciando pelo ip. E que redirecionarão as requisições para as máquinas do nosso cluster web que estão definidas em BackEnd, sempre levando em consideração a prioridade do servidor.

O exemplo acima foi baseado em ips, mas o Pound também aceita configuração baseada em dominios.

Mas agora teremos um outro problema, as máquinas que rodam o Apache no cluster web vão passar a ter contato somente com o Frontend, com isso, o ip associado a requisição será do Frontend.

Utilizando X-Forwarded-For no Apache

Para resolver esse problema vamos adicionar o módulo rpaf-2.0 no Apache.

Para instalar o módulo confirme se vc tem o httpd-devel instalado:

yum install httpd-devel

Para instalar e compilar o módulo rpaf-2.0 no Apache, siga os passos abaixo:

wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
tar -xzvf mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6
make rpaf-2.0 && make install-2.0

Agora vamos alterar o arquivo de configuração do Apache:

vim /etc/httpd/conf/httpd.conf

E adicionar as seguintes linhas:


....

LoadModule rpaf_module modules/mod_rpaf-2.0.so

....

#Mod_rpaf settings
RPAFenable On
RPAFproxy_ips IP_LOCAL_FRONTEND
RPAFsethostname On

Iniciar os Serviços

Para iniciar o serviço no Frontend:

service pound start

Para reiniciar o serviço no Backend:

service httpd restart

Para startar os serviços na inicialização da servidor, habilite com:

ntsysv

Até o próximo.

:, , , , , , , , , ,
1 comment for this entry:
  1. Fabiano

    Muito bom o artigo…

Leave a Reply

Licença

Creative Commons License

Techs

 Blog Tool, Publishing Platform, and CMS
Powered by PHP
Powered by MySQL
Mozilla Foundation
hacker emblem
Mozilla Foundation
Open Source Initiative
Creative Commons