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.516 ]

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

Desenvolvimento Web - Simples dicas de segurança

Implementação de WAF mod_security e integração com Graylog utilizando Filebeat e Logstash

As melhores ferramentas de segurança pra Linux

Cliente Linux no servidor LDAP

Instalando o Nagios via APT ou YUM

  
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