SSL Bridge com Pound e Stunnel
Apresentarei abaixo como configurar SSL Bridging de uma forma fácil e simples, com a utilização de Linux e de ferramentas OpenSource.
Situação Encontrada
Ter apenas 1 (um) IP externo disponível para agregação de vários serviços que utilizam SSL (porta 443).
Introdução
O Pound e o Stunnel juntos, são duas ferramentas que se atuarem juntas, conseguem prover uma excelente solução para SSL Bridging. O Pound será o responsável por examinar os pacotes e definir para onde encaminhar o mesmo. O Stunnel, atuará como o SSL Bridge, o responsável por receber esse pacote original e iniciar uma outra conexão SSL com a rede interna.
Necessidades
Foi utilizado no ambiente um servidor Linux (CentOS 5.3 x64) com os pacotes Pound v2.4.4 e Stunnel v4.15-2.
Instalação e Configuração
Passo #1: Pacotes
Foram feitos os downloads dos pacotes Pound (Pound-2.4.4-1.el5.i386.rpm) e Stunnel(stunnel-4.15-2.el5.1.i386.rpm) no site RPM Pbone.
# wget ftp://ftp.pbone.net/mirror/download.fedora.redhat.com/pub/fedora/epel/5/i386/Pound-2.4.4-1.el5.i386.rpm # wget ftp://ftp.pbone.net/mirror/ftp.centos.org/5.3/os/i386/CentOS/stunnel-4.15-2.el5.1.i386.rpm
Após o donwload, a instalação foi feita via utilitario yum, para evitar a necessidade de ficar buscando as dependencias apresentadas pelo SO instalado.
# yum install stunnel-4.15-2.el5.1.i386.rpm Pound-2.4.4-1.el5.i386.rpm
Passo #2: Criação dos certificados
Criou-se os certificados auto-assinados com a ferramenta openssl.
# openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout certificado.pem -out certificado.pem
Generating a 1024 bit RSA private key .......++++++ ........................................++++++ writing new private key to 'certificado.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [GB]:BR State or Province Name (full name) [Berkshire]:Estado Locality Name (eg, city) [Newbury]:Cidade Organization Name (eg, company) [My Company Ltd]:Organização Organizational Unit Name (eg, section) []:Área Common Name (eg, your name or your server's hostname) []:Nome do Servidor Email Address []:Email de Contato
Passo #3: Pound
O Pound atua como um proxy reverso, tanto publicando HTTP quanto HTTPS, e que será o responsável por encaminar as requisições para o Stunnel.
No cenário proposto, irei publicar os seguintes serviços:
- Microsoft Outlook Web Access
- Microsoft Outlook over RPC
- Portal de aplicações
Toda configuração referente ao Pound, é feito no arquivo pound.cfg que fica no diretório /etc.
/etc/pound.cfg
#
# Default pound.cfg
#
# Pound listens on port 80 for HTTP and port 443 for HTTPS
# and distributes requests to 2 backends running on localhost.
# see pound(8) for configuration directives.
# You can enable/disable backends with poundctl(8).
#
# Usuário que irá iniciar o serviço do Pound
User "root"
# Grupo que irá iniciar o serviço do Pound
Group "root"
# Nível de log
LogLevel 2
ListenHTTPS
# Configuração do IP externo que iremos publicar
Address XXX.XXX.XXX.XXX
# Adiciona no cabeçalho da requisição origem
AddHeader "Front-End-Https: on"
# Porta publicada
Port 443
# Localização do certificado
Cert "/etc/ssl/certificado.pem"
# Necessário para funcionar com o MS IE
Ciphers "ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL"
# Habilita extensões WebDav e MS
xHTTP 4
Service "owa"
# Url
URL "^/owa"
# Requisição de destino, verifica no cabeçalho da requisição
HeadRequire "Host: mobile.dominio.com.br.*"
# Redirect to:
BackEnd
# Redirect to: Localmente em uma porta que o Stunnel irá escutar e fazer a requisição
Address 127.0.0.1
# Porta Interna
Port 444
End
End
Service "rpc"
URL "^/rpc"
HeadRequire "Host: owa.hartwellcorp.com.*"
BackEnd
Address 10.11.10.14
Port 80
TimeOut 300
End
End
Service "applications"
# Url
URL "^/"
# Requisição de destino, verifica no cabeçalho da requisição
HeadRequire "Host: portal.dominio.com.br.*"
# Redirect to:
BackEnd
# Redirect to: Localmente em uma porta que o Stunnel irá escutar e fazer a requisição
Address 127.0.0.1
# Porta Interna
Port 445
End
End
End
No cenário, todas as aplicações provem do mesmo certificado, porém, podem-se criar vários níveis ListenHTTPS para cada aplicação, e configurar para cada um, um certificado diferente.
Após a configuração, basta iniciar o serviço com o seguinte comando:
# service pound start
Passo #4: Stunnel
O Stunnel, como dito, é o que faz o SSL Bridge, ponte entre as conexões SSL.
A configuração do Stunnel, é feito no diretório /etc/stunnel. Por padrão, não é criado nenhum arquivo de configuração na hora da instalação, para isso, criamos o arquivo stunnel.cfg para representar essa configuração. (O nome do arquivo escolhido não importa, pois iremos informar o mesmo na iniciação do serviço)
/etc/stunnel/stunnel.cfg
# Rodar como daemon foreground = yes client = yes # Stunnel para OWA [httpsowa] # Aceita local na 444 accept=127.0.0.1:444 # Encaminha para rede interna na 443 connect=192.168.0.100:443 # Stunnel para Portal de Aplicações [httpsportal] # Aceita local na 445 accept=127.0.0.1:445 # Encaminha para rede interna na 443 connect=192.168.0.101:443
Após a configuração, basta iniciar o serviço com o seguinte comando, que o mesmo irá iniciar em plano de fundo (daemon).
# /usr/sbin/stunnel /etc/stunnel/stunnel.cfg
Conclusão
O processo de SSL Bridge é uma técnica interessante que pode ser ainda mais explorada dependendo da complexidade do ambiente proposto. Recomendo a dar uma lida nos manuais e nos sites de referencia abaixo se você quiser saber mais sobre a técnica.
Fique a vontade nos comentários para compartilhar a sua experiência e expressar sua opinião sobre o assunto.
