Installation et configuration d'un HaProxy avec du SSL.

1. Avant-propos
1.1. Présentation
1.1.1 HaProxy sans SSL
1.1.2 HaProxy avec SSL
1.2. Introduction
2. Installation du SSL sur HaProxy
2.1. Installation des binaires de l'OpenSSL
2.2. Installation du HaProxy avec SSL
2.2.1 Installation avec RPM
3. Configuration du HTTPS sur le HaProxy
3.1. Fichier haproxy.cfg

1. Avant-propos


1.1 - Présentation.



+------------------------------+                                               +--------------------------------------+ 
| Client FireFox               |                                               | Serveur HaProxy                      | 
| Hostname : windaube          |                                               | Version : 1.5.2                      | 
| Os : Windows 7               |                                               | Hostname : arecibo                   | 
|                              |                                               |                                      | 
| IP : 10.25.85.125            |                                               | IP : 10.25.85.56                     | 
|                              |                                               |                                      | 
| +--------------------------+ |        httpS://10.25.85.56                    | +---------------------------------+  | 
| | FireFox ou I.E (beurk)   |-|-----------------------------------------------|-|---> Proxy                       |  | 
| | Cookie : HaProxyTurlanID | |                                               | |                                 |  |
| +--------------------------+ |                                               | |                                 |  |
|                              |                                               | |  Load Balancing                 |  |
|                              |                                               | |                                 |  |
|                              |                                               | +---------------------------------+  | 
+------------------------------+                                               +--------------------------------------+ 
                                                                              /                      |
                                                                             /                       |
                                                                     +----------------+      +----------------+ 
                                                                     |Port 80 --> 443 |      | Port 80 --> 443|
                                                                     |Port 443        |      | Port 443       |
                                                                     +----------------+      +----------------+
                                                                         /                           |
                                                                        /                            |
                                                                       V                             V
                                                +---------------------------+             +--------------------------+
                                                |  Hostname : Jupiter       |             | Hostname : Saturne       |
                                                |  Apache : 2.2.15          |             | Apache : 2.2.15          |
                                                |  Php : 5.4.26             |             | Php : 5.4.26             |
                                                |  Zend : 2.4.0             |             | Zend : 2.4.0             |
                                                |                           |             |                          |
                                                |  I.P : 168.2.15.23        |             | I.P : 168.2.15.24        |
                                                |  Port : 443               |             | Port : 443               |
                                                +---------------------------+             +--------------------------+


Dans les chapitres ci-dessous je vous montre les capture d'écran d'un HaProxy avec et sans SSL.
Si vous ne voyez pas openssl dans les commandes suivantes, c'est que votre serveur HaProxy ne peut pas faire de SSL.

1.1.1 - HaProxy sans SSL


Afin de savoir si votre serveur proxy peut faire du SSL taper les commandes suivante :
[root@arecibo] # ldd /usr/sbin/haproxy
[root] # ldd /usr/sbin/haproxy
	linux-vdso.so.1 =>  (0x00007fff7dfff000)
	libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fb793f14000)
	libpcreposix.so.0 => /usr/lib64/libpcreposix.so.0 (0x00007fb793d12000)
	libpcre.so.0 => /lib64/libpcre.so.0 (0x00007fb793ae5000)
	libc.so.6 => /lib64/libc.so.6 (0x00007fb793751000)
	libfreebl3.so => /lib64/libfreebl3.so (0x00007fb7934da000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fb794153000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007fb7932d5000)
[root] # 
[root@arecibo] # haproxy -vvv
[root] # haproxy -vvv
HA-Proxy version 1.4.24 2013/06/17
Copyright 2000-2013 Willy Tarreau 

Build options :
  TARGET  = linux2628
  CPU     = generic
  CC      = gcc
  CFLAGS  = -O2 -g -fno-strict-aliasing
  OPTIONS = USE_REGPARM=1 USE_PCRE=1

Default settings :
  maxconn = 2000, bufsize = 16384, maxrewrite = 8192, maxpollevents = 200

Encrypted password support via crypt(3): yes

Available polling systems :
     sepoll : pref=400,  test result OK
      epoll : pref=300,  test result OK
       poll : pref=200,  test result OK
     select : pref=150,  test result OK
Total: 4 (4 usable), will use sepoll.

[root] # 

1.1.1 - HaProxy avec SSL


Afin de savoir si votre serveur proxy peut faire du SSL taper les commandes suivante :
[root@arecibo] # ldd /usr/sbin/haproxy
Dans l'exemple ci-dessous on voit la librairie "libssl.so.10" qui va nous permettre de faire du SSL avec notre HaProxy.
[root] # ldd /usr/sbin/haproxy
	linux-vdso.so.1 =>  (0x00007fff945ff000)
	libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f5efd2f0000)
	libz.so.1 => /lib64/libz.so.1 (0x00007f5efd0da000)
	libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f5efce6d000)
	libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f5efca8d000)
	libpcreposix.so.0 => /usr/lib64/libpcreposix.so.0 (0x00007f5efc88b000)
	libpcre.so.0 => /lib64/libpcre.so.0 (0x00007f5efc65e000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f5efc2ca000)
	libfreebl3.so => /lib64/libfreebl3.so (0x00007f5efc053000)
	libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f5efbe0e000)
	libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f5efbb28000)
	libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f5efb924000)
	libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f5efb6f7000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f5efb4f3000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f5efd530000)
	libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f5efb2e8000)
	libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f5efb0e4000)
	libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f5efaeca000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f5efacad000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f5efaa8d000)
[root] # 
[root@arecibo] # haproxy -vvv
Dans l'exemple ci-dessous on voit les lignes OpenSSL qui vont nous permettre de faire du SSL avec notre HaProxy.
[root] # haproxy -vvv
HA-Proxy version 1.5.2 2014/07/12
Copyright 2000-2014 Willy Tarreau 

Build options :
  TARGET  = linux2628
  CPU     = generic
  CC      = gcc
  CFLAGS  = -O2 -g -fno-strict-aliasing
  OPTIONS = USE_LINUX_TPROXY=1 USE_ZLIB=1 USE_REGPARM=1 USE_OPENSSL=1 USE_PCRE=1

Default settings :
  maxconn = 2000, bufsize = 16384, maxrewrite = 8192, maxpollevents = 200

Encrypted password support via crypt(3): yes
Built with zlib version : 1.2.3
Compression algorithms supported : identity, deflate, gzip
Built with OpenSSL version : OpenSSL 1.0.1e-fips 11 Feb 2013
Running on OpenSSL version : OpenSSL 1.0.1e-fips 11 Feb 2013
OpenSSL library supports TLS extensions : yes
OpenSSL library supports SNI : yes
OpenSSL library supports prefer-server-ciphers : yes
Built with PCRE version : 7.8 2008-09-05
PCRE library supports JIT : no (USE_PCRE_JIT not set)
Built with transparent proxy support using: IP_TRANSPARENT IPV6_TRANSPARENT IP_FREEBIND

Available polling systems :
      epoll : pref=300,  test result OK
       poll : pref=200,  test result OK
     select : pref=150,  test result OK
Total: 3 (3 usable), will use epoll.


[root] # 

1.2 - Introduction


Maintenant que nous savons si nous avons oui ou non les librairies OpenSSL dans notre HaProxy, nous savons si nous devons installer les librairies.
Dans le cas ou nous n'avons pas les librairies OpenSSL, nous allons les ajouter au serveur HaProxy.
Pour se faire suivez toutes les étapes ci-dessous.
Si les librairies OpenSSL sont déjà installées allez directement dans la partie configuration.

2. Installation du SSL sur HaProxy


2.1 - Installation des binaires de OpenSSL


Avant d'insaller OpenSSL vérifier qu'il n'existe pas déjà sur votre serveur.
Pour se faire taper la commande suivante :
[root@arecibo] # openssl version

[root@arecibo] # openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013
[root@arecibo] #
Si vous avez déjà OpenSSL, il est inutile de le réinstaller.
Vous pouvez passer ce chapitre.
Pour installer les binaires d'OpenSSL, nous allons utiliser les binaires déjà présent sur notre repository.
Lancer la commande suivante :
[root@arecibo] # yum install openssl
Cependant, il est tout à fait possible de télécharger le fichier rpm adéquat (openssl-1.0.1e-16.el6_5.14.x86_64.rpm).
[root@arecibo] # rpm -i openssl-1.0.1e-16.el6_5.14.x86_64.rpm
Ou bien, passer via Internet avec la commande "apt-get".
[root@arecibo] # apt-get install openssl
[root] # yum install openssl
Loaded plugins: fastestmirror
Determining fastest mirrors
addons-socle-2012-2.31-jboss430-x86_64                                                                          | 2.5 kB     00:00     
errata-socle-2012-2.31-jboss430-x86_64                                                                          | 2.5 kB     00:00     
nua                                                                                                             | 2.9 kB     00:00     
socle-2012-2.31-jboss430-x86_64                                                                                 | 1.9 kB     00:00     
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package openssl-1.0.1e-16.el6_5.14.x86_64.rpm will be installed
--> Processing Dependency: .....
..
...
BLA BLA BLA
[root] # 

2.2 - Installation du HaProxy avec SSL


2.2.1 - Installation avec RPM


Puis qu'il existe une version HaProxy compilé avec du SSL, nous allons l'utilisée.
Notons que si OpenSSL n'est pas installé ou n'est pas dans le PATH, alors le rpm vous demandera des dépendances.

Comme vous le voyez dans la capture d'écran ci-dessous, nous avons l'ancien HaProxy, nous devons donc faire un Upgrade.
[root@arecibo] # rpm -Uvh haproxy-1.5.2-2.el6.x86_64.rpm
[root] # rpm -i haproxy-1.5.2-2.el6.x86_64.rpm
attention: haproxy-1.5.2-2.el6.x86_64.rpm: Entête V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
	le fichier /usr/sbin/haproxy de l'installation de haproxy-1.5.2-2.el6.x86_64 entre en conflit avec le fichier du paquetage haproxy-1.4.24-2.el6.x86_64
	le fichier /usr/bin/halog de l'installation de haproxy-1.5.2-2.el6.x86_64 entre en conflit avec le fichier du paquetage haproxy-1.4.24-2.el6.x86_64
	le fichier /usr/share/man/man1/haproxy.1.gz de l'installation de haproxy-1.5.2-2.el6.x86_64 entre en conflit avec le fichier du paquetage haproxy-1.4.24-2.el6.x86_64
[root] # rpm -Uvh haproxy-1.5.2-2.el6.x86_64.rpm
attention: haproxy-1.5.2-2.el6.x86_64.rpm: Entête V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Préparation...              ########################################### [100%]
   1:haproxy                ########################################### [100%]
[root] # 

3. Configuration du HTTPS sur le HaProxy


3.1 - Fichier haproxy.cfg


Voici la configuration pour du https
# ============================
# Global
# ============================
global
  chroot  /var/lib/haproxy
  daemon
  group  haproxy
  log localhost local3
  maxconn  4000
  user  haproxy
  stats socket /var/run/haproxy.sock
  tune.ssl.default-dh-param 1024
  ssl-default-bind-ciphers ECDHE-RAS-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH


# ============================
# Defaults
# ============================
defaults
  log  global
  mode  http
  option dontlognull
  timeout client  50s
  timeout connect  5s
  timeout server  50s
  errorfile 403 /etc/haproxy/403forbid.http

# ============================
# front-ends
# ============================

# Redirection HTTP vers HTTPS
frontend unsecureFrontend *:80
  redirect scheme https code 301 if !{ ssl_fc }

# Le frontend écoute en SSL
frontend nuageFrontend
  bind            10.25.85.56:443 ssl crt /etc/ssl/haproxy/haproxy.pem
  option          forwardfor
  rspadd          Strict-Transport-Security:\ max-age=31536000
  acl             valid_url   path      /
  acl             valid_url   path_beg  /core/
  acl             valid_url   path_beg  /sync-clients/
  acl             valid_url   path_beg  /ocs/
  acl             valid_url   path_beg  /apps/
  acl             valid_url   path_beg  /index.php
  acl             valid_url   path_beg  /nuage_appli_dgfip.cer
  acl             valid_url   path_beg  /settings/
  acl             valid_url   path_beg  /server-status
  acl             valid_url   path_beg  /check
  acl             valid_url   path_beg  /status.php
  acl             valid_url   path_beg  /remote.php
  http-request    allow if valid_url
  option httplog
  http-request    deny
  reqadd          X-Forwarded-Proto:\ https
  default_backend owncloudBackend

# IP dédiée à l'administration
listen admin
  bind          10.25.85.57:80
  mode          http
  stats         enable
  stats         uri   /haproxy/stats
  stats         realm  HAProxy\ Statistics
  stats         auth   admin:PassAturlan94
  stats         refresh 10s
  acl           graphite path_beg /graphite/
  acl           graphite path_beg /browser/
  acl           graphite path_beg /dashboard/
  acl           graphite path_beg /composer/
  acl           graphite path_beg /content/
  acl           graphite path_beg /render
  acl           graphite path_beg /metrics/
  acl           graphite path_beg /account/
  acl           graphite path_beg /admin/
  acl           graphite path_beg /graphlot/
  acl           graphite path_beg /haproxy/
  http-request  allow if graphite
  http-request  deny
  use_backend   graphiteBackend if graphite

# ============================
# Backends
# ============================

# Répartition de charge entre les serveurs applicatifs:
# Chacun des serveurs doit répondre à http://ip_serveur/check par un code 200 pour
# qu'il soit considéré en vie.
backend owncloudBackend
  balance   roundrobin
#  balance   leastconn
  mode      http
  option    httpchk GET /check

# affinite de session
  cookie HaProxyTurlanID insert indirect nocache
  server    jupiter 168.2.15.23:80 cookie jupiter check
  server    saturne 168.2.15.24:80 cookie saturne check

# Graphite est sur un virtualhost bindé sur localhost:88
backend graphiteBackend
  server    localhost localhost:88 check