Implementieren der SSL-Beendigung mit HAProxy unter Ubuntu 14.04

Einführung

HAProxy, was für High Availability Proxy steht, ist eine beliebte Open Source-Software für TCP / HTTP Load Balancer und Proxying, die unter Linux, Solaris und FreeBSD ausgeführt werden kann. Die häufigste Verwendung besteht darin, die Leistung und Zuverlässigkeit einer Serverumgebung zu verbessern, indem die Arbeitslast auf mehrere Server verteilt wird (z. Web, Anwendung, Datenbank). Es wird in vielen hochkarätigen Umgebungen verwendet, darunter GitHub, Imgur, Instagram und Twitter.

In diesem Lernprogramm erfahren Sie, wie Sie HAProxy für die SSL-Terminierung, für die Verkehrsverschlüsselung und für den Lastenausgleich Ihrer Webserver verwenden. Wir zeigen Ihnen auch, wie Sie mit HAProxy den HTTP-Verkehr zu HTTPS umleiten.

Die native SSL-Unterstützung wurde in HAProxy 1.5.x implementiert, das im Juni 2014 als stabile Version veröffentlicht wurde.

Voraussetzungen

Um dieses Lernprogramm abzuschließen, müssen Sie Folgendes haben oder erhalten:

  • Mindestens ein Webserver mit privatem Netzwerk lauscht auf HTTP (Port 80)

  • Root-Zugriff auf einen zusätzlichen VPS, auf dem HAProxy installiert wird. Anweisungen zum Einrichten des Root-Zugriffs finden Sie hier (Schritte 3 und 4): Initial Server Setup with Ubuntu 14.04.

  • Ein Paar aus SSL-Zertifikat und privatem Schlüssel mit einem „allgemeinen Namen“, der Ihrem Domainnamen oder Ihrer IP-Adresse entspricht

Wenn Sie noch kein SSL-Zertifikat und kein privates Schlüsselpaar haben, besorgen Sie sich bitte eines, bevor Sie fortfahren. Im Folgenden finden Sie einige Lernprogramme, die Schritte zum Erstellen von SSL-Zertifikaten enthalten:

Erstellen einer kombinierten PEM-SSL-Zertifikat- / Schlüsseldatei

Um die SSL-Beendigung mit HAProxy zu implementieren, müssen wir sicherstellen, dass Ihr SSL-Zertifikat und Ihr Schlüsselpaar das richtige Format (PEM) haben. In den meisten Fällen können Sie einfach Ihr SSL-Zertifikat (CRT- oder CER-Datei, die von einer Zertifizierungsstelle bereitgestellt wird) und den entsprechenden privaten Schlüssel (von Ihnen erstellte Schlüsseldatei) kombinieren. Angenommen, Ihre Zertifikatsdatei heißt "+ example.com.crt " und Ihre private Schlüsseldatei heißt " example.com.key +". Hier ist ein Beispiel für das Kombinieren der Dateien:

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

Dadurch wird die kombinierte PEM-Datei mit dem Namen "+ example.com.pem " erstellt und in " / etc / ssl / private +" kopiert. Stellen Sie wie immer sicher, dass Sie alle Kopien Ihrer privaten Schlüsseldatei sichern, einschließlich der PEM-Datei (die den privaten Schlüssel enthält).

In einigen Fällen müssen Sie möglicherweise Ihr CA-Stammzertifikat und Ihre CA-Zwischenzertifikate in Ihre PEM-Datei kopieren.

Unsere Startumgebung

Hier ist die Umgebung, mit der wir beginnen:

image: https: //assets.digitalocean.com/articles/HAProxy/ssl/web_server_http.png [Webserver auf HTTP]

Wenn sich Ihre Umgebung von dem Beispiel unterscheidet, z. B. wenn Sie bereits SSL auf dem Webserver verwenden oder einen separaten Datenbankserver haben, sollten Sie dieses Lernprogramm an Ihre Umgebung anpassen können.

Wenn Sie mit grundlegenden Konzepten oder Begriffen für den Lastenausgleich nicht vertraut sind, z. B. mit dem Lastenausgleich auf Ebene 7 oder mit Backends oder ACLs, finden Sie hier einen Artikel, in dem die Grundlagen erläutert werden: https://www.digitalocean.com/community/articles/an-introduction- to-haproxy-and-load-balancing-konzepte [Eine Einführung in die HAProxy- und Load-Balancing-Konzepte].

Unser Ziel

Am Ende dieses Tutorials möchten wir eine Umgebung haben, die so aussieht:

Das heißt, Ihre Benutzer greifen auf Ihre Website zu, indem sie über HTTPS eine Verbindung zu Ihrem HAProxy-Server herstellen, wodurch die SSL-Sitzung entschlüsselt und die unverschlüsselten Anforderungen an Ihre Webserver weitergeleitet werden (d. H. die server im www-backend) über ihre privaten netzwerkschnittstellen an port 80. Ihre Webserver senden dann ihre Antworten an Ihren HAProxy-Server, der die Antworten verschlüsselt und sie an den Benutzer zurücksendet, der die ursprüngliche Anfrage gestellt hat.

Sie können Ihr www-backend mit so vielen Webservern einrichten, wie Sie möchten, solange diese identischen Inhalt liefern. Mit anderen Worten, Sie können dies auf einem einzelnen Server einrichten und später skalieren, indem Sie so viele Server hinzufügen, wie Sie möchten. Denken Sie daran, dass Ihr HAProxy-Server mit zunehmendem Datenverkehr zu einem Leistungsengpass werden kann, wenn er nicht über genügend Systemressourcen verfügt, um den Datenverkehr Ihrer Benutzer zu bewältigen.

  • Hinweis: * In diesem Lernprogramm wird nicht erläutert, wie Sie sicherstellen, dass Ihre Web- / Anwendungsserver denselben Inhalt bereitstellen, da dieser häufig von Anwendungen oder Webservern abhängig ist.

Installieren Sie HAProxy 1.6.x

Erstellen Sie ein neues VPS mit privatem Netzwerk. In diesem Tutorial nennen wir es haproxy-www, aber Sie können es so nennen, wie Sie möchten.

Fügen Sie in unserem * haproxy-www * -VPS die dedizierte PPA zu apt-get hinzu:

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

Dann aktualisiere deinen apt Cache:

sudo apt-get update

Dann installieren Sie HAProxy 1.6 mit apt-get mit dem folgenden Befehl:

sudo apt-get install haproxy

Nachdem HAProxy 1.6 installiert ist, konfigurieren wir es!

HAProxy-Konfiguration

Die Konfigurationsdatei von HAProxy befindet sich unter "+ / etc / haproxy / haproxy.cfg +" und ist in zwei Hauptabschnitte unterteilt:

  • * Global *: Setzt prozessweite Parameter

  • * Proxies *: besteht aus den Abschnitten defaults, listen, frontend und backend

Wenn Sie mit HAProxy oder grundlegenden Konzepten und Begriffen für den Lastenausgleich nicht vertraut sind, finden Sie weitere Informationen unter folgendem Link: https://www.digitalocean.com/community/articles/an-einführung-zum-Haproxy-und-Lastenausgleich -concepts [Eine Einführung in die HAProxy- und Load-Balancing-Konzepte].

HAProxy-Konfiguration: Global

  • Die gesamte HAProxy-Konfiguration sollte auf Ihrem HAProxy VPS, _haproxy-www _, erfolgen. *

Öffne haproxy.cfg in einem Editor:

sudo vi /etc/haproxy/haproxy.cfg

Sie werden sehen, dass bereits zwei Abschnitte definiert sind: global und defaults.

Das erste, was Sie tun möchten, ist maxconn auf eine vernünftige Zahl zu setzen. Diese Einstellung wirkt sich darauf aus, wie viele gleichzeitige Verbindungen HAProxy zulässt. Dies kann sich auf die QoS auswirken und verhindern, dass Ihre Webserver abstürzen und versuchen, zu viele Anforderungen zu bedienen. Sie müssen damit herumspielen, um herauszufinden, was für Ihre Umgebung funktioniert. Fügen Sie die folgende Zeile (mit einem Wert, den Sie für sinnvoll halten) zum Abschnitt global der Konfiguration hinzu

  maxconn

Fügen Sie diese Zeile hinzu, um die maximale Größe der generierten temporären DHE-Schlüssel zu konfigurieren:

  tune.ssl.default-dh-param 2048

Fügen Sie als Nächstes im Abschnitt defaults die folgenden Zeilen unter der Zeile "+ mode http +" hinzu:

  option forwardfor
  option http-server-close

Die Option forwardfor legt fest, dass HAProxy jeder Anforderung X-Forwarded-For-Header hinzufügt, und die Option http-server-close verringert die Latenz zwischen HAProxy und Ihren Benutzern, indem Verbindungen geschlossen, aber Keep-Alives beibehalten werden.

HAProxy-Konfiguration: Statistik

Die Verwendung von HAProxy-Statistiken kann hilfreich sein, um zu bestimmen, wie HAProxy mit eingehendem Datenverkehr umgeht. Wenn Sie die HAProxy-Statistikseite aktivieren möchten, fügen Sie die folgenden Zeilen im Abschnitt defaults hinzu (ersetzen Sie Benutzer und Kennwort durch sichere Werte):

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

Auf diese Weise können Sie die HAProxy-Statistikseite aufrufen, indem Sie zu Ihrer Domain auf "+ / stats +" wechseln (z. B. https://example.com/stats).

Schließen Sie die Konfigurationsdatei noch nicht! Als nächstes werden wir die Proxy-Konfiguration hinzufügen.

HAProxy-Konfiguration: Proxies

Frontend-Konfiguration

Das erste, was wir hinzufügen möchten, ist ein Frontend für die Verarbeitung eingehender HTTP-Verbindungen. Fügen Sie am Ende der Datei ein Frontend mit dem Namen www-http hinzu. Achten Sie darauf, "+ haproxy_www_public_IP +" durch die * öffentliche IP * Ihres haproxy-www-VPS zu ersetzen:

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

Hier ist eine Erklärung, was jede Zeile im obigen Frontend-Konfigurationsausschnitt bedeutet:

  • * frontend www-http *: spezifiziert ein Frontend mit dem Namen "www-http"

  • * bind haproxy_www_public_IP: 80 *: Ersetzen Sie + haproxy_www_public_IP + durch die öffentliche IP-Adresse von haproxy-www. Dies teilt HAProxy mit, dass dieses Frontend den eingehenden Netzwerkverkehr auf dieser IP-Adresse und Port 80 (HTTP) behandelt.

  • * reqadd X-Forwarded-Proto: \ http *: Fügt dem Ende der HTTP-Anforderung einen HTTP-Header hinzu

  • * default_backend www-backend *: Dies gibt an, dass jeglicher Datenverkehr, den dieses Frontend empfängt, an www-backend weitergeleitet wird, was wir in einem folgenden Schritt definieren werden

Als nächstes werden wir ein Frontend hinzufügen, um eingehende HTTPS-Verbindungen zu behandeln. Fügen Sie am Ende der Datei ein Frontend mit dem Namen www-https hinzu. Achten Sie darauf, "+ haproxy_www_public_IP +" durch die * öffentliche IP * Ihres haproxy-www-VPS zu ersetzen:

frontend www-https
  bind :443 ssl crt /etc/ssl/private/
  reqadd X-Forwarded-Proto:\ https
  default_backend www-backend
  • * frontend www-https *: spezifiziert ein Frontend mit dem Namen "www-https"

  • * Bind haproxy_www_public_IP: 443 ssl crt… *: Ersetzen Sie + haproxy_www_public_IP + durch die öffentliche IP-Adresse von haproxy-www und + example.com.pem + durch Ihr SSL-Zertifikat und Schlüsselpaar im kombinierten pem-Format. Dies teilt HAProxy mit, dass dieses Frontend den eingehenden Netzwerkverkehr auf dieser IP-Adresse und Port 443 (HTTPS) behandelt.

  • * reqadd X-Forwarded-Proto: \ https *: Fügt dem Ende der HTTPS-Anforderung einen https-Header hinzu

  • * default_backend www-backend *: Dies gibt an, dass jeglicher Datenverkehr, den dieses Frontend empfängt, an www-backend weitergeleitet wird, was wir in einem folgenden Schritt definieren werden

Backend-Konfiguration

Wenn Sie mit der Konfiguration der Frontends fertig sind, fügen Sie Ihr Backend mit den folgenden Zeilen hinzu. Achten Sie darauf, die hervorgehobenen Wörter durch die jeweiligen privaten IP-Adressen Ihrer Webserver zu ersetzen:

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

Hier ist eine Erklärung, was jede Zeile im obigen Backend-Konfigurationsausschnitt bedeutet:

  • * backend www-backend *: spezifiziert ein Backend namens www-backend

  • * Weiterleitungsschema https if! \ {ssl_fc} *: Diese Zeile leitet HTTP-Anforderungen an HTTPS weiter, sodass Ihre Site nur HTTPS-fähig ist. Wenn Sie sowohl HTTP als auch HTTPS zulassen möchten, entfernen Sie diese Zeile

  • * server www-1… *: Gibt einen Back-End-Server mit dem Namen www-1, die private IP (die Sie ersetzen müssen) und den Port an, den er überwacht, 80. Mit der Option check führt der Load Balancer regelmäßig eine Integritätsprüfung auf diesem Server durch

  • * server www-2… *: ähnlich wie in der vorherigen Zeile. Fügen Sie solche zusätzlichen Zeilen mit entsprechenden Namen und IP-Adressen hinzu, um dem Load Balancer weitere Server hinzuzufügen

Speichern und beenden Sie nun + haproxy.cfg +. HAProxy kann jetzt gestartet werden. Aktivieren Sie jedoch zuerst die Protokollierung.

Aktivieren Sie die HAProxy-Protokollierung

Das Aktivieren der Protokollierung in HAProxy ist sehr einfach. Bearbeiten Sie zuerst die Datei rsyslog.conf:

sudo vi /etc/rsyslog.conf

Suchen Sie dann die folgenden beiden Zeilen und kommentieren Sie sie aus, um den UDP-Syslog-Empfang zu aktivieren. Es sollte wie folgt aussehen, wenn Sie fertig sind:

$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1

Starten Sie nun rsyslog neu, um die neue Konfiguration zu aktivieren:

sudo service rsyslog restart

Die HAProxy-Protokollierung ist jetzt aktiviert! Die Protokolldatei wird nach dem Start von HAProxy unter + / var / log / haproxy.log + erstellt.

Starten Sie HAProxy

  • Starten Sie auf haproxy-www * HAProxy, damit Ihre Konfigurationsänderungen wirksam werden:

sudo service haproxy restart

HAProxy führt jetzt eine SSL-Kündigung und einen Lastenausgleich für Ihre Webserver durch! Ihr Server mit Lastenausgleich ist jetzt für Ihren Benutzer über die öffentliche IP-Adresse oder den Domänennamen Ihres Lastenausgleichers, haproxy-www, zugänglich. Es gibt ein paar Dinge, die Sie überprüfen möchten, um sicherzustellen, dass alles richtig eingerichtet ist.

Dinge zu überprüfen

  • Falls noch nicht geschehen, aktualisieren Sie Ihre Nameserver so, dass Ihre Domain auf die öffentliche IP-Adresse Ihres haproxy-www-Servers verweist

  • Wenn Sie möchten, dass Ihre Server nur HTTPS verwenden, müssen Sie sicherstellen, dass Ihre Webserver (z. www-1, www-2 usw.) lauschen nur auf ihren privaten IP-Adressen an Port 80. Anderenfalls können Benutzer über HTTP (unverschlüsselt) auf ihre öffentlichen IP-Adressen zugreifen.

  • Besuchen Sie haproxy-www über HTTPS und stellen Sie sicher, dass es funktioniert

  • Besuchen Sie haproxy-www über HTTP und stellen Sie sicher, dass die Weiterleitung zu HTTPS erfolgt (es sei denn, Sie haben HTTP und HTTPS zugelassen).

  • Hinweis: * Wenn Sie eine Anwendung verwenden, für die eine eigene URL erforderlich ist, z. B. WordPress, müssen Sie die URL-Einstellung von "http" in "https" ändern. Um dem WordPress-Beispiel zu folgen, gehen Sie zu Ihren allgemeinen WordPress-Einstellungen und ändern Sie die WordPress-Adresse (URL) und die Site-Adresse (URL) von "http" in "https".

Fazit

Jetzt verfügen Sie über eine Load Balancer-Lösung, die Ihre SSL-Verbindungen verwaltet und zum horizontalen Skalieren Ihrer Serverumgebung verwendet werden kann. Kombinieren Sie das, was Sie in diesem Handbuch gelernt haben, mit anderen HAProxy-Handbüchern, um Ihre Umgebung noch weiter zu verbessern!