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!