Proxy reverso com ModSecurity no Debian Etch

Depois de horas de sono perdidas procurando implementar o Apache 2 de forma "reversa", eis que decido partilhar a minha experiência na implementação do mesmo de forma segura e funcional. O mesmo artigo é uma miscelânea de várias compilações e alguma experiência pessoal na implementação do mesmo.

[ Hits: 15.551 ]

Por: Arafat Bique em 28/01/2008


Introdução



Depois de algum tempo de horas de sono perdidas procurando implementar o APACHE 2 de forma "reversa", eis que decido partilhar a minha experiência na implementação do mesmo de forma segura e funcional. O mesmo artigo é uma miscelânea de várias compilações e alguma experiência pessoal na implementação do mesmo.

Nele procurarei demonstrar como podemos instalar o Reverse-Proxy com módulo de segurança (ModSecurity). O cenário usado é o seguinte, temos um servidor em Windows Exchange na DMZ (ou Rede-Interna) que disponibiliza o serviço de Webmail. Como é sabido o Windows possui uma lenda de segurança que não vamos aqui detalhar e por esses motivos recorremos ao bom amigo APACHE com o ModSecurity, que vai responder a todos os pedidos direcionados ao Exchange.

Instalação:

Baixe os pacotes do Apache e o ModSecurity:
Antes de começarmos a compilar vamos instalar os seguintes "packages" de forma a não existirem erros futuros:

# apt-get install apache2-threaded-dev
# apt-get libxml2


Compilando:

Apache:

# tar zxvf httpd-2.2.6.tar.gz
# cd httpd-2.2.6
# ./configure
# make
# make install


Agora vamos instalar o ModSecurity:

# tar zxvf modsecurity-apache_2.1.4.tar.gz
# cd modsecurity
# cd apache2
# /usr/local/apache2/bin/apxs -cia modsecurity.c


Chegado aqui temos todos os pacotes desejados instalados na Linux Box, restando apenas as configurações do httpd.conf. Então de seguida iremos editar o arquivo httpd.conf de forma a indicar os módulos a serem carregados pelo APACHE. Aqui é importante sublinhar que se devem ativar também os Sub-Módulos visto esta versão ser DSO.

# cd /usr/local/apache2/conf
# vi httpd.conf


Inserir as seguintes linhas:

LoadFile /usr/lib/libxml2.so
LoadModule headers_module /usr/local/apache2/modules/mod_headers.so
LoadModule rewrite_module /usr/local/apache2/modules/mod_rewrite.so
LoadModule ssl_module /usr/local/apache2/modules/mod_ssl.so
LoadModule include_module /usr/local/apache2/modules/mod_include.so
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so
LoadModule proxy_http_module /usr/local/apache2/modules/mod_proxy_http.so
LoadModule proxy_connect_module /usr/local/apache2/modules/mod_proxy_connect.so
LoadModule unique_id_module /usr/local/apache2/modules/mod_unique_id.so
LoadModule security2_module /usr/local/apache2/modules/mod_security2.so

Salvar e sair. De seguida deve-se gerar as chaves que vão possibilitar a conexão de forma segura (HTTPS) para fora:

# mkdir /etc/ssl/apache2
# cd /etc/ssl/apache2
# openssl req -new > new.cert.csr
# openssl rsa -in privkey.pem -out new.cert.key
# openssl x509 -in new.cert.csr -out new.cert.cert -req -signkey new.cert.key -days 1800
# cp new.cert.cert server.crt
# cp new.cert.key server.key


Configuração:

Esta parte que se segue poderia já ter sido feita quando editamos os módulos, mas o meu objectivo aqui é detalhar os passos de forma que a compreensão seja mais fácil e saiba-se exatamente o que se está a fazer. Então voltamos ao httpd.conf de forma a publicarmos o Exchange e carregar as regras básicas do ModSecurity:

# vi httpd.conf

<VirtualHost 1.2.3.4:80>
        ServerName webmail.example.org
        DocumentRoot /var/www/html/webmail
        RedirectMatch ^/(index.html?)$ https://webmail.example.org/exchange/
        RedirectMatch ^/exchange$ https://webmail.example.org/exchange/
</VirtualHost>

<VirtualHost 1.2.3.4:443>
        
        ProxyRequests Off
        SSLProxyEngine On
        DocumentRoot /var/www/html/webmail
        RequestHeader set Front-End-Https "On"
        ServerName mail

        SSLEngine On
        SSLCertificateFile /etc/ssl/apache2/server.crt
        SSLCertificateKeyFile /etc/ssl/apache2/server.key  


        ProxyPass /exchange/ http://mail.example.org/exchange/
        ProxyPassReverse /exchange/ http://mail.example.org/exchange/

        ProxyPass /exchweb/ http://mail.example.org/exchweb/
        ProxyPassReverse /exchweb/ http://mail.example.org/exchweb/

        ProxyPass /public/ http://mail.example.org/public/
        ProxyPassReverse /public/ http://mail.example.org/public/

        ProxyPreserveHost On
</VirtualHost>

E agora no fim do nosso httpd.conf vamos inserir algumas regras do nosso ModSecurity:

<IfModule mod_security.c>

    # Only inspect dynamic requests
    # (YOU MUST TEST TO MAKE SURE IT WORKS AS EXPECTED)
    SecFilterEngine DynamicOnly

    # Reject requests with status 403
    SecFilterDefaultAction "deny,log,status:403"

    # Some sane defaults
    SecFilterScanPOST On
    SecFilterCheckURLEncoding On
    SecFilterCheckCookieFormat On
    SecFilterCheckUnicodeEncoding Off

    # Accept almost all byte values
    SecFilterForceByteRange 1 255

    # Server masking is optional
    SecServerSignature "GNU Tomcat"

    SecUploadDir /tmp
    SecUploadKeepFiles Off

    # Only record the interesting stuff
    SecAuditEngine RelevantOnly
    SecAuditLog logs/audit_log

    # You normally won't need debug logging
    SecFilterDebugLevel 0
    SecFilterDebugLog logs/modsec_debug_log

    # Only accept request encodings we know how to handle
    # we exclude GET requests from this because some (automated)
    # clients supply "text/html" as Content-Type
    SecFilterSelective REQUEST_METHOD "!^GET$" chain
    SecFilterSelective HTTP_Content-Type "!(^$|^application/x-www-form-urlencoded$|^multipart/form-data)"

    # Require Content-Length to be provided with
    # every POST request
    SecFilterSelective REQUEST_METHOD "^POST$" chain
    SecFilterSelective HTTP_Content-Length "^$"

    # Don't accept transfer encodings we know we don't handle
    # (and you don't need it anyway)
    SecFilterSelective HTTP_Transfer-Encoding "!^$"

</IfModule>

Salvar e sair. Agora que a instalação e a Configuração está terminada deve-se arrancar o serviço:

# /usr/local/apache2/bin/httpd -k start

Verificar se o mesmo está correndo:

# ps aux | grep apache2

Chegado aqui tudo deverá já estar correndo conforme desejado e só me resta agradecer a comunidade Open Source pela força na impulsão do mundo livre, aos que me ajudaram nestes Puzzles, amigos e claro sem me esquecer SDA (pela inspiração) e a todos os leitores.

Um abraço!

   

Páginas do artigo
   1. Introdução
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Segurança em Software de Código Aberto

Servidor de DNS com DNS reverso, DHCP3 e wpad.dat

Consegue guardar um segredo?

Seu maior inimigo é você mesmo!

Bypass de firewall com tunelamento por DNS

  
Comentários
[1] Comentário enviado por y2h4ck em 29/01/2008 - 10:05h

Rapaz assim, na verdade não é o mod_security quem faz o Proxy, é o Mod_proxy do próprio Apache2, o mod_security simplesmente implementa as ACLs de controle de acesso para evitar alguns ataques que vc definiu no conf dele.

:)

[2] Comentário enviado por Bique em 29/01/2008 - 10:15h

Concordo plenamente contigo, creio que a minha descricao e o titulo podem deixar duvidas. Quem faz o Reverse Proxy é o mod_proxy do Apache e o Mod_Security esta la para prevnir certo tipo de Ataques.

Um abraço,

[3] Comentário enviado por Fabio2 em 12/03/2008 - 16:30h

Olá Bique,
Estou tentando implementar esse artigo escrito por vc, mas nao estou tendo sucesso será que vc poderia me dar uma ajuda?
O que eu tenho é o seguinte:
O Redirecionamento está funcionando corretamente, pois testei realizando o direcionamento para outro site externo, porém quando utilizo a seguinte configuração:

<VirtualHost webmail.teste.com.br:443>
ServerName webmail.teste.com.br

SSLEngine On
SSLCertificateFile /etc/ssl/webmail.teste.com.br.crt
SSLCertificateKeyFile /etc/ssl/webmail.teste.com.br.key

SSLProxyEngine On
DocumentRoot /var/www/apache2-default
RequestHeader set Front-End-Https "On"

ProxyPass /exchange http://192.168.10.2/exchange/
ProxyPassReverse /exchange http://192.168.10.2/exchange/

ProxyPass /exchweb/ http://192.168.10.2/exchweb/
ProxyPassReverse /exchweb/ http://192.168.10.2/exchweb/

ProxyPass /public/ http://192.168.10.20/public/
ProxyPassReverse /public/ http://192.168.10.2/public/

ProxyPreserveHost On

</VirtualHost>

Mas quando vou reiniciar o apache aparece o seguinte erro:

Forcing reload of web server (apache2)...[Wed Mar 12 08:20:48 2008] [error] VirtualHost webmail.teste.com.br:443 -- mixin
g * ports and non-* ports with a NameVirtualHost address is not supported, proceeding with undefined results
waiting [Wed Mar 12 08:20:50 2008] [error] VirtualHost webmail.teste.com.br:443 -- mixing * ports and non-* ports with a
NameVirtualHost address is not supported, proceeding with undefined results

OBS: Não instalei o ModSecurity, ja que como foi comentado o direcionamento é realizado pelo Mod_Proxy.

Um Abraço,

[4] Comentário enviado por Bique em 13/03/2008 - 06:58h

Fabio,

Verifica se tens todos os Modulos Carregados no teu config(excepto Mod_Security) e se nou ficheiro hosts resolves o IP do webmail.teste.com.br
Manda-me um Feedback para ver se continuo verificando o que possa estar a acontecer.

Um Abraco

[5] Comentário enviado por Bique em 13/03/2008 - 07:48h

Fabio,

Algures na tua configuracao na declaracao do VirtualHost tens "*" como mostra o teu log:

waiting [Wed Mar 12 08:20:50 2008] [error] VirtualHost webmail.teste.com.br:443 -- mixing * ports and non-* ports with a
NameVirtualHost address is not supported, proceeding with undefined results

[6] Comentário enviado por Fabio2 em 13/03/2008 - 10:21h

Opa
Esse problema eu consegui resolver informando a porta que deve ser utilizada em cadaum dos VirtualHost que tenho, inclusive os que utilizam a porta 80, porém agora estou enfrentando a seguinte situação:
Sempre que vou acessar o webmail no primeiro acesso recebo a seguinte mensagem:

Proxy Error

The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request GET /exchange/.

Reason: Error reading from remote server

Mas se atualizo a pagina passa a funcionar. O Problema nao seria para os casos do primeiro acesso mas o erro acontece algumas vezes depois da sessão ja estar autenticada tambem.
Tens idéia do que pode estar acontecendo?

[7] Comentário enviado por Bique em 21/03/2008 - 16:03h

Viva,

Vais me desculpar a demora andei fora do Pais por uns tempos. Como ficou o teu Problema? O serro que estas tendo agora no Browser nao e o Error 500. Quem esta gerando erro agora nao e o teu Exchange Server? Pelp Log parece-me. Diz-me algo.

Um Abraco

[8] Comentário enviado por durama em 08/06/2008 - 19:12h

Parabéns pelo artigo muito interessante.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts