So richten Sie Nginx Load Balancing mit SSL-Terminierung ein

Einführung

Dieser Artikel beschreibt, wie Sie den Nginx-Lastenausgleich mit SSL-Terminierung mit nur einem SSL-Zertifikat auf dem Load Balancer einrichten. Dies reduziert den Verwaltungsaufwand für SSL, da die OpenSSL-Aktualisierungen sowie die Schlüssel und Zertifikate jetzt über den Lastenausgleich selbst verwaltet werden können.

Informationen zur SSL-Beendigung

Nginx kann als Load Balancer konfiguriert werden, um eingehenden Datenverkehr auf mehrere Back-End-Server zu verteilen. Die SSL-Beendigung ist der Prozess, der auf dem Load Balancer stattfindet, der die SSL-Verschlüsselung / -Entschlüsselung durchführt, sodass der Datenverkehr zwischen dem Load Balancer und den Back-End-Servern über HTTP erfolgt. Die Backends müssen durch Einschränken des Zugriffs auf die IP des Load Balancers gesichert werden. Dies wird weiter unten in diesem Artikel erläutert.

SSL Termination Diagram

Voraussetzungen

In diesem Lernprogramm müssen die Befehle als Root-Benutzer oder als Benutzer mit Sudo-Berechtigungen ausgeführt werden. Sie können sehen, wie Sie dies inUsers Tutorial einrichten.

Die folgenden Anleitungen können als Referenz verwendet werden:

Ein LAMP-Server ist nicht erforderlich, wird jedoch in diesem Lernprogramm als Beispiel verwendet.

Konfiguration

In diesem Tutorial werden die folgenden 3 Tröpfchen verwendet:

Tröpfchen 1 (Frontend)

  • Bild: Ubuntu 14,04

  • Hostname: Loadbalancer

  • Private IP: 10.130.227.33

Tröpfchen 2 (Backend)

  • Bild: Ubuntu 14,04

  • Hostname: web1

  • Private IP: 10.130.227.11

Tröpfchen 3 (Backend)

  • Bild: Ubuntu 14,04

  • Hostname: web2

  • Private IP: 10.130.227.22

Domain name - example.com

Für alle diese Tröpfchen mussprivate networking aktiviert sein.

Aktualisieren und aktualisieren Sie die Software auf allen drei Servern:

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

Reboot each server to apply the upgrades. Dies ist wichtig, da OpenSSL auf der neuesten Version sein muss, um sicher zu sein.

Wir werden einen neuen virtuellen Nginx-Host für den Domain-Namen einrichten, wobei das Upstream-Modul den Lastausgleich für die Backends vornimmt.

Vor dem Einrichten von Nginx Loadbalancing sollte Nginx auf Ihrem VPS installiert sein. Sie können es schnell mitapt-get installieren:

apt-get install nginx

Aktualisieren Sie auf den beiden Backend-Servern Ihre Repositorys und installieren Sie Apache:

apt-get install apache2

Installieren Sie PHP auf beiden Backend-Servern:

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

Weitere Informationen finden Sie unterthis article.

Generieren Sie Schlüssel und erstellen Sie ein SSL-Zertifikat

In diesem Abschnitt führen Sie die Schritte aus, die zum Erstellen eines SSL-Zertifikats erforderlich sind. This article erklärt ausführlich die SSL-Zertifikate unter Nginx.

Erstellen Sie das SSL-Zertifikatverzeichnis und wechseln Sie dorthin.

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

Erstellen Sie einen privaten Schlüssel:

openssl genrsa -des3 -out server.key 2048

Entfernen Sie die Passphrase:

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

Erstellen Sie eine CSR (Certificate Signing Request):

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

Verwenden Sie diese CSR, um ein gültiges Zertifikat vona certificate authority zu erhalten oder ein selbstsigniertes Zertifikat mit dem folgenden Befehl zu generieren.

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

Sobald dies erledigt ist, enthält dieses Verzeichnis die folgenden Dateien:

  • server.key - The private key

  • ca-certs.pem - A collection of your CA’s root and intermediate certificates. Nur vorhanden, wenn Sie ein gültiges Zertifikat von einer Zertifizierungsstelle erhalten haben.

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

Virtuelle Hostdatei und Upstream-Modul

Erstellen Sie eine virtuelle Hosts-Datei im Nginx-Verzeichnis

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

Fügen Sie das Upstream-Modul hinzu, das die privaten IP-Adressen der Back-End-Server enthält

upstream mywebapp1 {
    server 10.130.227.11;
    server 10.130.227.22;
}

Beginnen Sie den Serverblockafterin dieser Zeile. Dieser Block enthält den Domainnamen, Verweise auf die Upstream-Server und Header, die an das Backend übergeben werden sollen.

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;
    }
}

Die Direktiveproxy_set_headerwird verwendet, um wichtige Informationen über die Anforderung an die Upstream-Server weiterzuleiten.

Speichern Sie diese Datei und erstellen Sie einen symbolischen Link zum Verzeichnissites-enabled.

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

Führen Sie einen Konfigurationstest durch, um nach Fehlern zu suchen.

service nginx configtest

Wenn keine Fehler angezeigt werden, laden Sie den Nginx-Dienst neu.

service nginx reload

Der Lastenausgleich wurde jetzt für HTTP konfiguriert.

SSL aktivieren

Fügen Sie der Datei für virtuelle Hosts (/etc/nginx/sites-available/example.com) im Blockserver {}die folgenden Anweisungen hinzu. Diese Zeilen werden im nächsten Beispiel im Zusammenhang gezeigt.

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;

Ignorieren Sie die Anweisungssl_trusted_certificate, wenn Sie selbstsignierte Zertifikate verwenden. Jetzt sollte der Blockserverfolgendermaßen aussehen:

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;
    }
}

Suchen Sie nach Konfigurationsfehlern und laden Sie den Nginx-Dienst neu.

service nginx configtest && service nginx reload

Absichern der Backend-Server

Derzeit kann jeder, der seine öffentliche IP-Adresse kennt, direkt auf die auf den Back-End-Servern gehostete Website zugreifen. Dies kann verhindert werden, indem die Webserver auf den Backends so konfiguriert werden, dass sie nur die private Schnittstelle überwachen. Die Schritte dazu in Apache sind wie folgt.

Bearbeiten Sie die Dateiports.conf.

nano /etc/apache2/ports.conf

Suchen Sie die folgende Zeile:

Listen 80

Ersetzen Sie es durch die private IP-Adresse vonbackend server’s:

Listen 10.130.227.22:80

Tun Sie dies auf allen Backend-Servern und starten Sie Apache neu.

service apache2 restart

Der nächste Schritt besteht darin, den HTTP-Zugriff auf die private IP vonload balancer’szu beschränken. Die folgende Firewall-Regel erreicht dies.

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

Ersetzen Sie das Beispiel durch die private IP-Adresse des Load Balancers und führen Sie diese Regel auf allen Back-End-Servern aus.

Testen des Setups

Erstellen Sie eine PHP-Datei auf allen Backend-Servern (in diesem Beispiel web1 und web2). Dies dient zu Testzwecken und kann nach Abschluss des Setups entfernt werden.

nano /var/www/html/test.php

Es sollte den Namen der Domäne, auf die zugegriffen wird, die IP-Adresse des Servers, die IP-Adresse des Benutzers und den Port anzeigen, auf den zugegriffen wird.

Greifen Sie mehrmals mit Ihrem Browser oder mitcurl auf diese Datei zu. Verwenden Siecurl -k bei selbstsignierten Zertifikat-Setups, damit Curl SSL-Fehler ignoriert.

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

Die Ausgabe ähnelt der folgenden.

   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

Beachten Sie, dass sich dieServer Address bei jeder Anforderung ändern, was darauf hinweist, dass auf jede Anforderung ein anderer Server reagiert.

Sichern der SSL-Konfiguration

In diesem Abschnitt wird die Konfiguration von SSL gemäß Best Practices erläutert, um Sicherheitsanfälligkeiten mit älteren Verschlüsselungen und Protokollen zu beseitigen. In diesem Abschnitt werden einzelne Zeilen angezeigt, und im letzten Abschnitt dieses Tutorials wird die vollständige Konfigurationsdatei angezeigt.

Das Aktivieren des SSL-Sitzungscaches verbessert die Leistung von HTTPS-Websites. Die folgenden Anweisungen müssenafterssl_trusted_certificate sein. Sie ermöglichen das gemeinsame Caching der Größe20MB mit einer Cache-Lebensdauer von10 minutes.

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

Geben Sie die Protokolle und Chiffren an, die für die SSL-Verbindung verwendet werden sollen. Hier haben wir SSLv2 weggelassen und unsichere Chiffren wie MD5 und DSS deaktiviert.

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 weist alle unterstützenden Webbrowser an, nur HTTPS zu verwenden. Aktivieren Sie es mit der Direktiveadd_header.

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

Suchen Sie nach Konfigurationsfehlern und laden Sie den Nginx-Dienst neu.

service nginx configtest && service nginx reload

Konfiguration abschließen

Nach dem Konfigurieren und Sichern der SSL-Beendigung sieht die vollständige Konfigurationsdatei folgendermaßen aus:

/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;
    }
}

Wenn SieSSL Server Test ausführen, sollte dieses Setup die Note A + erhalten. Führen Sie den Curl-Test erneut durch, um zu überprüfen, ob alles ordnungsgemäß funktioniert.

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

Weitere Lektüre

Um mehr über Lastausgleichsalgorithmen zu erfahren, lesen Siethis article.

Related