Comment configurer l’équilibrage de charge Nginx avec terminaison SSL

introduction

Cet article explique comment configurer l'équilibrage de charge Nginx avec terminaison SSL avec un seul certificat SSL sur l'équilibreur de charge. Cela réduira votre temps de gestion SSL, car les mises à jour OpenSSL, les clés et les certificats peuvent désormais être gérés à partir de l'équilibreur de charge lui-même.

A propos de la résiliation SSL

Nginx peut être configuré comme un équilibreur de charge pour répartir le trafic entrant sur plusieurs serveurs principaux. La terminaison SSL est le processus qui se produit sur l’équilibreur de charge et qui traite le cryptage / décryptage SSL de sorte que le trafic entre l’équilibreur de charge et les serveurs principaux soit en HTTP. Les moteurs doivent être sécurisés en limitant l’accès à l’IP de l’équilibreur de charge, comme expliqué plus loin dans cet article.

SSL Termination Diagram

Conditions préalables

Dans ce tutoriel, les commandes doivent être exécutées en tant qu'utilisateur root ou en tant qu'utilisateur disposant de privilèges sudo. Vous pouvez voir comment configurer cela dans lesUsers Tutorial.

Les guides suivants peuvent être utilisés comme référence:

Un serveur LAMP n’est pas requis, mais nous l’utiliserons comme exemple dans ce tutoriel.

Installer

Ce tutoriel utilise les 3 gouttelettes suivantes:

Droplet 1 (frontal)

  • Image: Ubuntu 14.04

  • Nom d'hôte: loadbalancer

  • Adresse IP privée: 10.130.227.33

Droplet 2 (backend)

  • Image: Ubuntu 14.04

  • Nom d'hôte: web1

  • Adresse IP privée: 10.130.227.11

Droplet 3 (backend)

  • Image: Ubuntu 14.04

  • Nom d'hôte: web2

  • Adresse IP privée: 10.130.227.22

Domain name - exemple.com

Toutes ces gouttelettes doivent avoirprivate networking activées.

Mettez à jour et mettez à niveau le logiciel sur les trois serveurs:

apt-get update && apt-get upgrade -y

Reboot each server to apply the upgrades. Ceci est important, car OpenSSL doit être sur sa dernière version pour être sécurisé.

Nous allons configurer un nouvel hôte virtuel Nginx pour le nom de domaine avec le module en amont équilibrant la charge des backends.

Avant de configurer Nginx Loadbalancing, Nginx doit être installé sur votre VPS. Vous pouvez l'installer rapidement avecapt-get:

apt-get install nginx

Sur les deux serveurs principaux, mettez à jour vos référentiels et installez Apache:

apt-get install apache2

Installez PHP sur les deux serveurs principaux:

apt-get install php5 libapache2-mod-php5 php5-mcrypt

Pour plus d'informations, consultezthis article.

Générer des clés et créer un certificat SSL

Dans cette section, vous allez suivre les étapes nécessaires à la création d'un certificat SSL. This article explique en détail les certificats SSL sur Nginx.

Créez le répertoire de certificat SSL et basculez-y.

mkdir -p /etc/nginx/ssl/example.com
cd /etc/nginx/ssl/example.com

Créer une clé privée:

openssl genrsa -des3 -out server.key 2048

Supprimer sa phrase secrète:

openssl rsa -in server.key -out server.key

Créer un CSR (demande de signature de certificat):

openssl req -new -key server.key -out server.csr

Utilisez ce CSR pour obtenir un certificat valide auprès dea certificate authority ou générer un certificat auto-signé avec la commande suivante.

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Une fois cela fait, ce répertoire contiendra les fichiers suivants:

  • server.key - The private key

  • ca-certs.pem - A collection of your CA’s root and intermediate certificates. Présent uniquement si vous avez obtenu un certificat valide auprès d'une autorité de certification.

  • server.crt - The SSL certificate for your domain name

Fichier hôte virtuel et module amont

Créer un fichier d'hôtes virtuels dans le répertoire Nginx

nano /etc/nginx/sites-available/example.com

Ajoutez le module en amont contenant les adresses IP privées des serveurs principaux

upstream mywebapp1 {
    server 10.130.227.11;
    server 10.130.227.22;
}

Commencez le bloc serveurafterur cette ligne. Ce bloc contient le nom de domaine, les références aux serveurs en amont et les en-têtes à transmettre au backend.

server {
    listen 80;
    server_name example.com www.example.com;

    location / {
        proxy_pass http://mywebapp1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

La directiveproxy_set_header est utilisée pour transmettre des informations vitales sur la demande aux serveurs en amont.

Enregistrez ce fichier et créez un lien symbolique vers le répertoiresites-enabled.

ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com

Effectuez un test de configuration pour vérifier les erreurs.

service nginx configtest

Si aucune erreur ne s'affiche, rechargez le service nginx.

service nginx reload

L'équilibrage de charge est maintenant configuré pour HTTP.

Activer SSL

Ajoutez les directives suivantes au fichier d'hôtes virtuels (/etc/nginx/sites-available/example.com) dans le blocserver {}. Ces lignes seront montrées en contexte dans l'exemple suivant.

listen 443 ssl;
ssl on;
ssl_certificate         /etc/nginx/ssl/example.com/server.crt;
ssl_certificate_key     /etc/nginx/ssl/example.com/server.key;
ssl_trusted_certificate /etc/nginx/ssl/example.com/ca-certs.pem;

Ignorez la directivessl_trusted_certificate si vous utilisez des certificats auto-signés. Maintenant, le blocserver devrait ressembler à ceci:

server {
    listen 80;
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl on;
    ssl_certificate         /etc/nginx/ssl/example.com/server.crt;
    ssl_certificate_key     /etc/nginx/ssl/example.com/server.key;
    ssl_trusted_certificate /etc/nginx/ssl/example.com/ca-certs.pem;

    location / {
        proxy_pass http://mywebapp1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Recherchez les erreurs de configuration et rechargez le service Nginx.

service nginx configtest && service nginx reload

Sécuriser les serveurs principaux

Actuellement, le site Web hébergé sur les serveurs principaux est directement accessible à quiconque connaît son adresse IP publique. Cela peut être évité en configurant les serveurs Web sur les serveurs pour n'écouter que sur l'interface privée. Les étapes à suivre dans Apache sont les suivantes.

Modifiez le fichierports.conf.

nano /etc/apache2/ports.conf

Trouvez la ligne suivante:

Listen 80

Remplacez-le par la propre adresse IP privée debackend server’s:

Listen 10.130.227.22:80

Faites cela sur tous les serveurs principaux et redémarrez Apache.

service apache2 restart

L'étape suivante consiste à restreindre l'accès HTTP à l'adresse IP privée deload balancer’s. La règle de pare-feu suivante y parvient.

iptables -I INPUT -m state --state NEW -p tcp --dport 80 ! -s 10.130.227.33 -j DROP

Remplacez l’exemple par l’adresse IP privée de l’équilibreur de charge et exécutez cette règle sur tous les serveurs principaux.

Tester la configuration

Créez un fichier PHP sur tous les serveurs dorsaux (web1 et web2 dans cet exemple). Ceci est pour les tests et peut être supprimé une fois la configuration terminée.

nano /var/www/html/test.php

Il doit imprimer le nom de domaine auquel vous avez accédé, l’adresse IP du serveur, l’adresse IP de l’utilisateur et le port auquel vous avez accédé.

Accédez à ce fichier plusieurs fois avec votre navigateur ou en utilisantcurl. Utilisezcurl -k sur les configurations de certificats auto-signés pour que curl ignore les erreurs SSL.

curl https://example.com/test.php https://example.com/test.php https://example.com/test.php

La sortie sera semblable à la suivante.

   Host: example.com
   Remote Address: 10.130.245.116
   X-Forwarded-For: 117.193.105.174
   X-Forwarded-Proto: https
   Server Address: 10.130.227.11
   Server Port: 80

   Host: example.com
   Remote Address: 10.130.245.116
   X-Forwarded-For: 117.193.105.174
   X-Forwarded-Proto: https
   Server Address: 10.130.227.22
   Server Port: 80

   Host: example.com
   Remote Address: 10.130.245.116
   X-Forwarded-For: 117.193.105.174
   X-Forwarded-Proto: https
   Server Address: 10.130.227.11
   Server Port: 80

Notez que leServer Address change à chaque demande, indiquant qu'un serveur différent répond à chaque demande.

Renforcement de la configuration SSL

Cette section explique comment configurer SSL selon les meilleures pratiques pour éliminer les vulnérabilités avec des algorithmes de chiffrement et des protocoles plus anciens. Des lignes individuelles sont présentées dans cette section et le fichier de configuration complet est présenté dans la dernière section de ce didacticiel.

L'activation du cache de session SSL améliore les performances des sites Web HTTPS. Les directives suivantes doivent être placéesafterssl_trusted_certificate. Ils permettent la mise en cache partagée de taille20MB avec une durée de vie du cache de10 minutes.

ssl_session_cache shared:SSL:20m;
ssl_session_timeout 10m;

Spécifiez les protocoles et les chiffrements à utiliser dans la connexion SSL. Ici, nous avons omis SSLv2 et désactivé les chiffrements non sécurisés tels que MD5 et DSS.

ssl_prefer_server_ciphers       on;
ssl_protocols                   TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers                     ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;

Strict Transport Security indique à tous les navigateurs Web pris en charge de n'utiliser que HTTPS. Activez-le avec la directiveadd_header.

add_header Strict-Transport-Security "max-age=31536000";

Recherchez les erreurs de configuration et rechargez le service Nginx.

service nginx configtest && service nginx reload

Configuration complète

Après configuration et durcissement de la terminaison SSL, le fichier de configuration complet se présentera comme suit:

/etc/nginx/sites-available/example.com

upstream mywebapp1 {
    server 10.130.227.11;
    server 10.130.227.22;
}

server {
    listen 80;
    listen 443 ssl;
    server_name example.com www.emxaple.com;

    ssl on;
    ssl_certificate         /etc/nginx/ssl/example.com/server.crt;
    ssl_certificate_key     /etc/nginx/ssl/example.com/server.key;
    ssl_trusted_certificate /etc/nginx/ssl/example.com/ca-certs.pem;

    ssl_session_cache shared:SSL:20m;
    ssl_session_timeout 10m;

    ssl_prefer_server_ciphers       on;
    ssl_protocols                   TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers                     ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;

    add_header Strict-Transport-Security "max-age=31536000";

    location / {
        proxy_pass http://mywebapp1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Faites unSSL Server Test et cette configuration devrait obtenir une note A +. Exécutez le test curl à nouveau pour vérifier si tout fonctionne correctement.

curl https://example.com/test.php https://example.com/test.php https://example.com/test.php

Lectures complémentaires

Pour en savoir plus sur les algorithmes d'équilibrage de charge, lisezthis article.