Proxy Reverso com Pound
Por Spawnzao em 07/01/2011 - 4,205 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:
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.
January 19th, 2011 on 17:15
Muito bom o artigo…