Comment implémenter la résiliation SSL avec HAProxy sur Ubuntu 14.04

introduction

HAProxy, qui signifie High Availability Proxy, est un logiciel populaire open source d’équilibrage de la charge TCP / HTTP et une solution de proxy qui peut être exécuté sur Linux, Solaris et FreeBSD. Son utilisation la plus courante consiste à améliorer les performances et la fiabilité d’un environnement de serveur en répartissant la charge de travail sur plusieurs serveurs (par exemple, Web, application, base de données). Il est utilisé dans de nombreux environnements de premier plan, notamment GitHub, Imgur, Instagram et Twitter.

Dans ce didacticiel, nous verrons comment utiliser HAProxy pour la terminaison SSL, le cryptage du trafic et l’équilibrage de la charge de vos serveurs Web. Nous allons également vous montrer comment utiliser HAProxy pour rediriger le trafic HTTP vers HTTPS.

La prise en charge de SSL natif a été implémentée dans HAProxy 1.5.x, une version stable publiée en juin 2014.

Conditions préalables

Pour compléter ce tutoriel, vous devez avoir ou obtenir les éléments suivants:

  • Au moins un serveur Web, avec réseau privé, écoute sur HTTP (port 80)

  • Accès racine à un VPS supplémentaire sur lequel nous installerons HAProxy. Les instructions pour configurer l’accès root peuvent être trouvées ici (étapes 3 et 4): Présentation du serveur initial avec Ubuntu 14.04.

  • Un certificat SSL et une paire de clés privées avec un «nom commun» correspondant à votre nom de domaine ou votre adresse IP

Si vous ne possédez pas encore de paire de certificat SSL et de clé privée, veuillez en obtenir un avant de continuer. Voici quelques tutoriels contenant des étapes couvrant la création de certificats SSL:

Création d’un fichier de certificat / clé SSL PEM combiné

Pour mettre en œuvre la terminaison SSL avec HAProxy, nous devons nous assurer que votre certificat SSL et votre paire de clés sont au format approprié, PEM. Dans la plupart des cas, vous pouvez simplement combiner votre certificat SSL (fichier .crt ou .cer fourni par une autorité de certification) et sa clé privée respective (fichier .key que vous avez généré). En supposant que votre fichier de certificat s’appelle + exemple.com.crt +, et que votre fichier de clé privée s’appelle + exemple.com.key +, voici un exemple de la façon de combiner les fichiers:

cat .crt .key > example.com.pem
sudo cp .pem /etc/ssl/private/

Cela crée le fichier PEM combiné, nommé + example.com.pem + et le copie dans + / etc / ssl / private +. Comme toujours, veillez à sécuriser toutes les copies de votre fichier de clé privée, y compris le fichier PEM (qui contient la clé privée).

Dans certains cas, vous devrez peut-être copier votre certificat racine et vos certificats intermédiaires dans votre fichier PEM.

Notre environnement de départ

Voici l’environnement avec lequel nous commençons:

image: https: //assets.digitalocean.com/articles/HAProxy/ssl/web_server_http.png [Serveur Web sur HTTP]

Si votre environnement diffère de l’exemple, comme si vous utilisez déjà SSL sur le serveur Web ou si vous avez un serveur de base de données distinct, vous devriez pouvoir adapter ce didacticiel pour qu’il fonctionne avec votre environnement.

Si vous ne connaissez pas bien les concepts ou la terminologie d’équilibrage de charge de base, tels que l’équilibrage de charge de couche 7, les backends ou les ACL, voici un article qui explique les bases: https://www.digitalocean.com/community/articles/an-introduction- to-haproxy-and-load-balancing-concepts [Introduction aux concepts de HAProxy et de l’équilibrage de la charge].

Notre objectif

À la fin de ce tutoriel, nous souhaitons avoir un environnement qui ressemble à ceci:

image: https: //assets.digitalocean.com/articles/HAProxy/ssl/haproxy_ssl.png [Terminaison HAProxy SSL]

En d’autres termes, vos utilisateurs accéderont à votre site Web en se connectant à votre serveur HAProxy via HTTPS, qui décryptera la session SSL et transmettra les demandes non chiffrées à vos serveurs Web (c’est-à-dire serveurs dans www-backend) via leurs interfaces réseau privées sur le port 80. Vos serveurs Web enverront ensuite leurs réponses à votre serveur HAProxy, qui les chiffrera et les renverra à l’utilisateur qui a effectué la demande initiale.

Vous pouvez configurer votre www-backend avec autant de serveurs Web que vous le souhaitez, à condition qu’ils servent un contenu identique. En d’autres termes, vous pouvez configurer cela avec un seul serveur, puis le redimensionner ultérieurement en ajoutant autant de serveurs que vous le souhaitez. N’oubliez pas que si votre trafic augmente, votre serveur HAProxy peut devenir un goulot d’étranglement au niveau des performances s’il ne dispose pas de suffisamment de ressources système pour gérer votre trafic utilisateur.

  • Remarque: * Ce tutoriel ne couvre pas comment vous assurer que vos serveurs Web / d’applications servent le même contenu, car cela dépend souvent de l’application ou du serveur Web.

Installer HAProxy 1.6.x

Créer un nouveau VPS avec réseau privé. Pour ce tutoriel, nous l’appellerons haproxy-www, mais vous pouvez l’appeler comme vous voulez.

Dans notre VPS * haproxy-www *, ajoutez le PPA dédié à apt-get:

sudo add-apt-repository ppa:vbernat/haproxy-1.6

Puis mettez à jour votre cache apt:

sudo apt-get update

Puis installez HAProxy 1.6 avec apt-get avec la commande suivante:

sudo apt-get install haproxy

Maintenant que HAProxy 1.6 est installé, configurons-le!

Configuration HAProxy

Le fichier de configuration de HAProxy se trouve dans + / etc / haproxy / haproxy.cfg + et est divisé en deux sections principales:

  • * Global *: définit les paramètres de l’ensemble du processus

  • * Proxies *: comprend les sections defaults, listen, frontend et backend

Encore une fois, si vous ne connaissez pas HAProxy ni les concepts et la terminologie de base en matière d’équilibrage de charge, veuillez vous reporter à ce lien: https://www.digitalocean.com/community/articles/an-inintroduction-to-haproxy-and-load-balancing -concepts [Introduction aux concepts d’HAProxy et d’équilibrage de charge].

Configuration HAProxy: globale

  • Toute la configuration HAProxy doit être effectuée sur votre HAProxy VPS, _haproxy-www _. *

Ouvrez haproxy.cfg dans un éditeur:

sudo vi /etc/haproxy/haproxy.cfg

Vous verrez qu’il y a deux sections déjà définies: global et defaults.

La première chose que vous voudrez faire est de définir maxconn sur un nombre raisonnable. Ce paramètre affecte le nombre de connexions simultanées autorisées par HAProxy, ce qui peut avoir une incidence sur la qualité de service et empêcher vos serveurs Web de se bloquer en essayant de répondre à un trop grand nombre de demandes. Vous devrez jouer avec pour trouver ce qui fonctionne pour votre environnement. Ajoutez la ligne suivante (avec une valeur que vous jugez raisonnable) à la section global de la configuration.

  maxconn

Ajoutez cette ligne pour configurer la taille maximale des clés DHE temporaires générées:

  tune.ssl.default-dh-param 2048

Ensuite, dans la section defaults, ajoutez les lignes suivantes sous la ligne qui dit + mode http +:

  option forwardfor
  option http-server-close

L’option forwardfor permet à HAProxy d’ajouter des en-têtes X-Forwarded-For à chaque demande, tandis que l’option http-server-close réduit la latence entre HAProxy et vos utilisateurs en fermant les connexions tout en maintenant des connexions persistantes.

HAProxy Configuration: Stats

L’utilisation de statistiques HAProxy peut être utile pour déterminer comment HAProxy gère le trafic entrant. Si vous souhaitez activer la page de statistiques HAProxy, ajoutez les lignes suivantes dans la section defaults (remplacez l’utilisateur et le mot de passe par des valeurs sécurisées):

  stats enable
  stats uri
  stats realm Haproxy\ Statistics
  stats auth :

Cela vous permettra de consulter la page de statistiques HAProxy en accédant à votre domaine sous + / stats + (par exemple. https://example.com/stats).

Ne fermez pas encore le fichier de configuration! Nous ajouterons ensuite la configuration du proxy.

Configuration HAProxy: Proxies

Configuration frontale

La première chose que nous voulons ajouter est une interface pour gérer les connexions HTTP entrantes. A la fin du fichier, ajoutons une interface appelée www-http. Assurez-vous de remplacer + haproxy_www_public_IP + par l'* public IP * de votre VPS haproxy-www:

frontend www-http
  bind :80
  reqadd X-Forwarded-Proto:\ http
  default_backend www-backend

Voici une explication de ce que chaque ligne de l’extrait de configuration frontal ci-dessus signifie:

  • * frontend www-http *: spécifie une interface nommée «www-http»

  • * bind haproxy_www_public_IP: 80 *: remplacez + haproxy_www_public_IP + par l’adresse IP publique de haproxy-www. Cela indique à HAProxy que cette interface traitera le trafic réseau entrant sur cette adresse IP et le port 80 (HTTP)

  • * reqadd X-Forwarded-Proto: \ http *: Ajoute l’en-tête http à la fin de la fin de la requête HTTP

  • * default_backend www-backend *: spécifie que tout le trafic reçu par cette interface sera transféré à www-backend, ce que nous définirons dans une étape suivante

Ensuite, nous allons ajouter une interface pour gérer les connexions HTTPS entrantes. A la fin du fichier, ajoutons une interface appelée www-https. Assurez-vous de remplacer + haproxy_www_public_IP + par l'* public IP * de votre VPS haproxy-www:

frontend www-https
  bind :443 ssl crt /etc/ssl/private/
  reqadd X-Forwarded-Proto:\ https
  default_backend www-backend
  • * frontend www-https *: spécifie une interface nommée «www-https»

  • * bind haproxy_www_public_IP: 443 ssl crt… *: remplacez + haproxy_www_public_IP + par l’adresse IP publique de haproxy-www et + example.com.pem + par votre certificat SSL et votre paire de clés au format pem combiné. Cela indique à HAProxy que cette interface gérera le trafic réseau entrant sur cette adresse IP et le port 443 (HTTPS).

  • * reqadd X-Forwarded-Proto: \ https *: Ajoute l’en-tête https à la fin de la fin de la demande HTTPS

  • * default_backend www-backend *: spécifie que tout le trafic reçu par cette interface sera transféré à www-backend, ce que nous définirons dans une étape suivante

Configuration du backend

Une fois que vous avez fini de configurer les interfaces, continuez d’ajouter votre serveur en ajoutant les lignes suivantes. Assurez-vous de remplacer les mots en surbrillance par les adresses IP privées respectives de vos serveurs Web:

backend www-backend
  redirect scheme https if !{ ssl_fc }
  server www-1 :80 check
  server www-2 :80 check

Voici une explication de ce que chaque ligne de l’extrait de configuration principal ci-dessus signifie:

  • * backend www-backend *: spécifie un backend nommé www-backend

  • * schéma de redirection https if! \ {ssl_fc} *: cette ligne redirige les requêtes HTTP vers HTTPS, ce qui rend votre site exclusivement HTTPS. Si vous souhaitez autoriser HTTP et HTTPS, supprimez cette ligne.

  • * serveur www-1… *: spécifie un serveur principal nommé www-1, l’adresse IP privée (à remplacer) et le port sur lequel il est en train d’écouter, 80. L’option check permet à l’équilibreur de charge d’effectuer périodiquement une vérification de l’intégrité sur ce serveur.

  • * serveur www-2… *: similaire à la ligne précédente. Ajoutez des lignes supplémentaires comme celle-ci, avec les noms et les adresses IP appropriés pour ajouter davantage de serveurs à l’équilibreur de charge

Maintenant, sauvegardez et quittez + haproxy.cfg +. HAProxy est maintenant prêt à être démarré, mais commençons par activer la journalisation.

Activer la journalisation HAProxy

Activer la journalisation dans HAProxy est très simple. Commencez par éditer le fichier rsyslog.conf:

sudo vi /etc/rsyslog.conf

Recherchez ensuite les deux lignes suivantes et décommentez-les pour activer la réception UDP syslog. Cela devrait ressembler à ceci quand vous avez fini:

$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1

Maintenant, redémarrez rsyslog pour activer la nouvelle configuration:

sudo service rsyslog restart

La journalisation HAProxy est maintenant activée! Le fichier journal sera créé dans + / var / log / haproxy.log + une fois que HAProxy aura démarré.

Démarrer HAProxy

  • Sur haproxy-www *, démarrez HAProxy pour appliquer les modifications apportées à votre configuration:

sudo service haproxy restart

HAProxy procède maintenant à la résiliation SSL et à l’équilibrage de la charge de vos serveurs Web! Votre serveur à charge équilibrée est désormais accessible à votre utilisateur via l’adresse IP publique ou le nom de domaine de votre équilibreur de charge, haproxy-www! Vous voudrez vérifier certaines choses pour vous assurer que tout est configuré correctement.

Choses à vérifier

  • Si vous ne l’avez pas déjà fait, mettez à jour vos serveurs de noms pour qu’il pointe votre domaine vers l’adresse IP publique de votre serveur haproxy-www

  • Si vous souhaitez que vos serveurs utilisent uniquement le protocole HTTPS, vous devez vous assurer que vos serveurs Web (par exemple, www-1, www-2, etc.) n’écoutent que sur leurs adresses IP privées sur le port 80. Sinon, les utilisateurs pourront accéder à vos serveurs Web via HTTP (non chiffré) sur leurs adresses IP publiques.

  • Visitez haproxy-www via HTTPS et assurez-vous que cela fonctionne

  • Visitez haproxy-www via HTTP et assurez-vous qu’il redirige vers HTTPS (sauf si vous l’avez configuré pour autoriser HTTP et HTTPS).

  • Remarque: * Si vous utilisez une application qui a besoin de connaître sa propre URL, telle que WordPress, vous devez modifier le paramètre de votre URL de «http» à «https». Pour suivre l’exemple de WordPress, accédez à vos paramètres généraux WordPress, puis modifiez l’adresse WordPress (URL) et l’adresse du site (URL) de «http» à «https».

Conclusion

Vous disposez maintenant d’une solution d’équilibrage de charge qui gère vos connexions SSL et peut être utilisée pour étendre horizontalement votre environnement de serveur. N’hésitez pas à combiner ce que vous avez appris dans ce guide avec d’autres guides HAProxy pour améliorer encore votre environnement!

Related