Skip navigation

Debian 9 : HAproxy avec SSL – SSL Termination

Debian 9 : HAproxy avec SSL – SSL Termination

Articles liés : HAproxy : afficher les statistiques Debian 9 : HAproxy avec SSL – Pass-Through

IP Rôle Nom de l’hôte
172.16.0.10 HAproxy ha
172.16.0.11 Server web 1 web1
172.16.0.12 Server web 2 web2

: le type de load balancing pour cette procédure est le roundrobin.

Sur ha, installation de haproxy.

root@debian~#: apt install -y haproxy

Configuration de HAproxy avec SSL

Définit la taille maximale des paramètres Diffie-Hellman utilisés pour générer la clé Diffie-Hellman éphémère / temporaire.

global
    […]
    tune.ssl.default-dh-param 2048
    […]

Changer le type de redirection de tcp (couche 4 du modèle OSI) vers http (couche 7 du modèle OSI).

root@debian~#: vim /etc/haproxy/haproxy.cfg

aperçu du contenu du fichier

[…]
defaults
    log     global
    option forwardfor except 127.0.0.1
    mode    http
    option  httplog
[…]

La ligne option forwardfor except 127.0.0.1 permet de ne pas faire suivre les entêtes si elles proviennent de HAproxy.

Dans ce même fichier ajouter les frontend et les backend.

aperçu du contenu du fichier

[…]
frontend www
    bind *:80
    bind *:443 ssl crt-list /etc/ssl/private/crt-list.txt
    mode http
    default_backend web

backend web
    mode http
    option httpchk HEAD / HTTP/1.1\r\nHost:localhost
    http-request set-header X-Forwarded-Port %[dst_port]
    http-request add-header X-Forwarded-Proto https if { ssl_fc }
    balance roundrobin
    server web1 172.16.0.11:80 check
    server web2 172.16.0.12:80 check

option httpchk HEAD / HTTP/1.1\r\nHost:localhost et http-request […] permettent de rediriger les entêtes.

Créer le fichier /etc/ssl/private/crt-list.txt.

root@debian~#: vim /etc/ssl/private/crt-list.txt

contenu du fichier

/etc/ssl/private/stan.pem

: HAproxy s’attend a 1 fichier par domaine pour gérer les certificats SSL. Il faut donc créer ce fichier à partir du certificat et de la clé de ce certificat.

Génération du *.pem.

root@debian~#: cat /etc/apache2/ssl/stan-selfsigned.crt /etc/apache2/ssl/stan-selfsigned.key > /etc/ssl/private/stan.pem

Vérifier tester le fichier de configuration.

root@debian~#: haproxy -c -V -f /etc/haproxy/haproxy.cfg

sortie

Configuration file is valid

Redémarrer le service.

root@debian~#: systemctl restart haproxy

haproxy est en place, pour le tester il suffit naviguer sur http://172.16.0.10/ qui mène à l’un des serveur web.

Pour s’assurer que le load balancing fonctionne comme attendu, faire un tail -f sur le fichier de logs haproxy.

root@debian~#: tail -f /var/log/haproxy.log

aperçu du contenu du fichier

Jan 12 14:01:59 ha haproxy[842]: 172.16.0.1:51560 [12/Jan/2019:14:01:50.314] www web/web1 1/0/8963 1513 -- 0/0/0/0/0 0/0
Jan 12 14:02:13 ha haproxy[842]: 172.16.0.1:51564 [12/Jan/2019:14:02:05.964] www web/web2 1/0/8002 503 -- 0/0/0/0/0 0/0
Jan 12 14:02:30 ha haproxy[842]: 172.16.0.1:51566 [12/Jan/2019:14:02:14.537] www web/web1 1/0/15912 1266 -- 0/0/0/0/0 0/0
Jan 12 14:02:43 ha haproxy[842]: 172.16.0.1:51572 [12/Jan/2019:14:02:31.980] www web/web2 1/0/11195 754 -- 0/0/0/0/0 0/0
Jan 12 14:02:45 ha haproxy[842]: 172.16.0.1:51576 [12/Jan/2019:14:02:44.026] www web/web1 1/0/1685 754 -- 0/0/0/0/0 0/0
Jan 12 14:02:49 ha haproxy[842]: 172.16.0.1:51580 [12/Jan/2019:14:02:47.417] www web/web2 1/0/1962 752 -- 0/0/0/0/0 0/0

: On voit que le frontend www fait appel au backend web lui-même renvoyant vers web1 ou web2.

Redirection HTTP vers HTTPS

Pour forcer la navigation en https, il faut créer un ACL dans le frontend.

aperçu du contenu du fichier

[…]
frontend www
    bind *:80
    bind *:443 ssl crt-list /etc/ssl/private/crt-list.txt
    redirect scheme https if !{ ssl_fc }
    mode http
    default_backend web

backend web
   balance roundrobin
   mode http
   server web1 172.16.0.11:80 check
   server web2 172.16.0.12:80 check

Configuration des logs de Apache

Pour avoir l’IP du client (et non cette du proxy) dans les logs de Apache, il faut modifier le format des logs.

root@debian~#: vim /etc/apache2/apache2.conf

aperçu du contenu du fichier
La ligne :

[…]
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
[…]

Devient :

[…]
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
[…]

by | February 3, 2019 | No Comments | Système