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.