HAPROXY : SSL Offloading

Neste post será apresentado como configurar o SSL Offloading onde a requisição é feita em https e convertida em requições http apontando para servidores backend .

Captura de Tela 2016-05-14 às 12.37.41

1) Ambiente :

10.0.0.38 – HAPROXY-01
10.0.0.40 – APACHE-01
10.0.0.41 – APACHE-02

Todos os servidores utilizam RHEL7 com 1 Gb de RAM e 1 vCPU .

2) Criando o certificado :

Criando um certificado auto assinado para o laboratório.

openssl req -x509 -nodes -newkey rsa:2048 -keyout /etc/pki/tls/certs/haproxy.pem -out /etc/pki/tls/certs/haproxy.pem -days 365

3) Configuração do HAPROXY :

Em nosso exemplo iremos configurar via YUM

yum install haproxy openssl openssl-devel -y 

Confirme a versão com o comando haproxy -v

Captura de Tela 2016-05-14 às 13.08.04

Arquivo de configuração


# Global settings
global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

    # max per-process number of SSL connections

      # set 2048 bits for Diffie-Hellman key
    tune.ssl.default-dh-param 2048

# Default config
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000


# Dashboard
listen stats :4997
mode http
stats   enable
stats   hide-version
stats   refresh 30s
stats   show-node
stats realm Haproxy\ Statistics
stats auth admin:haproxy
stats uri       /haproxy

# Frontends settings
frontend  http-in
    bind *:80
    bind *:443 ssl crt /opt/cert/haproxy.pem  ciphers RC4-SHA:AES128-SHA:AES256-SHA no-sslv3


# ACLs
  use_backend bk_webserver1 if { ssl_fc_sni webserver1.example.com }
  use_backend bk_webserver2 if { ssl_fc_sni webserver2.example.com } 
default_backend bk_fajlinux


# Backends settings
backend bk_fajlinux
 mode http
 server localhost 127.0.0.1:80

backend bk_webserver1 
mode http
server apache-01 10.0.0.39:80

backend bk_webserver2
mode http
server apache-02 10.0.0.40:80

Adicione no /etc/hosts as entradas :

10.0.0.38 webserver1.example.com webserver2.example.com

Valide as configurações com o comando haproxy -c -f /etc/haproxy/haproxy.cfg :

Captura de Tela 2016-05-14 às 16.40.55

Inicie o serviço

systemctl start haproxy 
systemctl enable haproxy 

4) Configuração dos Backends :

Instalação do Apache

yum install httpd -y 

Criação de cada vhost onde “X”é referente ao número do site :

/etc/httpd/conf.d/webserver.conf

<VirtualHost *:80>
ServerName webserverX.example.com
DocumentRoot /var/www/html

</VirtualHost>

Criação do index.html

echo "`hostname` Web Backend" >> /var/www/html/index.html

Arquivo /etc/hosts :

10.0.0.39 webserver1.example.com
10.0.0.40 webserver2.example.com

Inicie o serviço :

systemctl start httpd 
systemctl enable httpd  

5) Testes finais :

Para realizar o teste foram criadas de nome apontando para o ip de frontend do Haproxy :

10.0.0.38 webserver1.example.com webserver2.example.com

Durante o acesso será apresentada uma mensagem de alerta para adicionar uma exceção , pois não é uma CA conhecida.

Captura de Tela 2016-05-14 às 17.24.49

Acessando o webserver1.example.com :

Captura de Tela 2016-05-14 às 16.46.27

Acessando o webserver2.example.com :

Captura de Tela 2016-05-14 às 16.47.17

Com esses testes estamos validando a configuração de SSL termination para diversos backends.

Referências :

blog.filepicker.io/post/29422604907/improved-https-performance-with-early-ssl-termination

http://blog.haproxy.com/2013/02/26/ssl-offloading-impact-on-web-applications/