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.
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_header
wird 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 Blockserver
folgendermaß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.