So verschlüsseln Sie Tomcat 8-Verbindungen mit Apache oder Nginx unter Ubuntu 16.04

Einführung

Apache Tomcat ist ein Webserver und Servlet-Container für Java-Anwendungen. Tomcat wird häufig in produktiven Unternehmensbereitstellungen und für kleinere Anwendungsanforderungen verwendet und ist sowohl flexibel als auch leistungsstark.

In diesem Handbuch wird erläutert, wie Sie Ihre Ubuntu 16.04 Tomcat-Installation mit SSL sichern. Standardmäßig ist bei der Installation die gesamte Kommunikation zwischen dem Tomcat-Server und den Clients unverschlüsselt, einschließlich der eingegebenen Kennwörter und aller vertraulichen Daten. Es gibt eine Reihe von Möglichkeiten, wie wir SSL in unsere Tomcat-Installation integrieren können. In diesem Handbuch wird beschrieben, wie Sie einen SSL-fähigen Proxyserver einrichten, um sicher mit Clients zu verhandeln und Anforderungen an Tomcat weiterzuleiten.

Wir werden behandeln, wie dies mitApache undNginx eingerichtet wird.

Warum ein Reverse Proxy?

Es gibt eine Reihe von Möglichkeiten, wie Sie SSL für eine Tomcat-Installation einrichten können. Nachdem wir erfahren haben, dass Tomcat Verbindungen nativ verschlüsseln kann, ist es möglicherweise seltsam, dass wir über eine Reverse-Proxy-Lösung sprechen.

SSL mit Tomcat weist eine Reihe von Nachteilen auf, die die Verwaltung erschweren:

  • Tomcat, when run as recommended with an unprivileged user, cannot bind to restricted ports like the conventional SSL port 443: Es gibt Problemumgehungen, z. B. die Verwendung des Programmsauthbind, um ein nicht privilegiertes Programm mit einem eingeschränkten Port zuzuordnen, die Portweiterleitung mit einer Firewall einzurichten usw., aber sie stellen immer noch zusätzliche Komplexität dar.

  • SSL with Tomcat is not as widely supported by other software: Projekte wie Let's Encrypt bieten keine native Möglichkeit zur Interaktion mit Tomcat. Darüber hinaus erfordert das Java-Keystore-Format, dass herkömmliche Zertifikate vor der Verwendung konvertiert werden, was die Automatisierung erschwert.

  • Conventional web servers release more frequently than Tomcat: Dies kann erhebliche Auswirkungen auf die Sicherheit Ihrer Anwendungen haben. Beispielsweise kann die unterstützte Tomcat-SSL-Verschlüsselungssuite schnell veraltet sein und Ihre Anwendungen suboptimal schützen. Für den Fall, dass Sicherheitsupdates erforderlich sind, ist es wahrscheinlich einfacher, einen Webserver zu aktualisieren als Ihre Tomcat-Installation.

Eine Reverse-Proxy-Lösung umgeht viele dieser Probleme, indem einfach ein starker Webserver vor die Tomcat-Installation gestellt wird. Der Webserver kann Client-Anforderungen mit SSL verarbeiten. Diese Funktionalität wurde speziell dafür entwickelt. Es kann dann Proxy-Anforderungen an Tomcat senden, die in der normalen, nicht privilegierten Konfiguration ausgeführt werden.

Diese Trennung von Bedenken vereinfacht die Konfiguration, selbst wenn es sich um die Ausführung einer zusätzlichen Software handelt.

Voraussetzungen

Um dieses Handbuch zu vervollständigen, muss Tomcat bereits auf Ihrem Server eingerichtet sein. In diesem Handbuch wird davon ausgegangen, dass Sie die Anweisungen in unserenTomcat 8 on Ubuntu 16.04 installation guide zum Einrichten verwendet haben.

Wenn Sie einen Tomcat eingerichtet haben, fahren Sie unten mit dem Abschnitt für Ihren bevorzugten Webserver fort. Apache beginnt direkt darunter, während die Konfiguration vonNginxdurch ein wenig Überspringen gefunden werden kann.

(Option 1) Proxying mit denmod_jk des Apache-Webservers

Der Apache-Webserver verfügt über ein Modul namensmod_jk, das über das Apache JServ-Protokoll direkt mit Tomcat kommunizieren kann. Ein Connector für dieses Protokoll ist in Tomcat standardmäßig aktiviert, sodass Tomcat diese Anforderungen bereits verarbeiten kann.

Abschnitt Voraussetzungen

Bevor wir erläutern können, wie Apache-Webserververbindungen an Tomcat weitergeleitet werden, müssen Sie einen Apache-Webserver installieren und sichern.

Sie können den Apache-Webserver installieren, indem Sie Schritt 1 vonthis guide ausführen. Installieren Sie nicht MySQL oder PHP.

Anschließend müssen Sie SSL auf dem Server einrichten. Wie Sie dies tun, hängt davon ab, ob Sie einen Domainnamen haben oder nicht.

  • If you have a domain name…Der einfachste Weg, Ihren Server zu sichern, ist Let's Encrypt, das kostenlose, vertrauenswürdige Zertifikate bereitstellt. Folgen Sie unserenLet’s Encrypt guide for Apache, um dies einzurichten.

  • If you do not have a domain… und Sie verwenden diese Konfiguration nur zum Testen oder für den persönlichen Gebrauch. Sie können stattdessen ein selbstsigniertes Zertifikat verwenden. Dies bietet die gleiche Art der Verschlüsselung, jedoch ohne Domänenüberprüfung. Folgen Sie unserenself-signed SSL guide for Apache, um sich einzurichten.

Wenn Sie mit diesen Schritten fertig sind, erfahren Sie weiter unten, wie Sie den Apache-Webserver an Ihre Tomcat-Installation anschließen.

Schritt 1:mod_jk installieren und konfigurieren

Zuerst müssen wir das Modulmod_jk installieren. Der Apache-Webserver verwendet dies, um über das Apache JServ-Protokoll mit Tomcat zu kommunizieren.

Wir könnenmod_jk aus den Standard-Repositorys von Ubuntu installieren. Aktualisieren Sie den lokalen Paketindex und installieren Sie ihn, indem Sie Folgendes eingeben:

sudo apt-get update
sudo apt-get install libapache2-mod-jk

Das Modul wird bei der Installation automatisch aktiviert.

Als nächstes müssen wir das Modul konfigurieren. Die Hauptkonfigurationsdatei befindet sich bei/etc/libapache2-mod-jk/workers.properties. Öffnen Sie diese Datei jetzt in Ihrem Texteditor:

sudo nano /etc/libapache2-mod-jk/workers.properties

Im Inneren finden Sie die Direktiveworkers.tomcat_home. Stellen Sie dies auf Ihr Tomcat-Installations-Ausgangsverzeichnis ein. Für unsere Tomcat-Installation wäre das/opt/tomcat:

/etc/libapache2-mod-jk/workers.properties

workers.tomcat_home=/opt/tomcat

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Schritt 2: Passen Sie den virtuellen Apache-Host mitmod_jk an den Proxy an

Als Nächstes müssen wir unseren virtuellen Apache-Host an Proxy-Anforderungen für unsere Tomcat-Installation anpassen.

Die richtige zu öffnende Virtual Host-Datei hängt von der Methode ab, die Sie zum Einrichten von SSL verwendet haben.

Wenn Sie mithilfe des oben verlinkten Handbuchs ein selbstsigniertes SSL-Zertifikat einrichten, öffnen Sie die Dateidefault-ssl.conf:

sudo nano /etc/apache2/sites-available/default-ssl.conf

Wenn Sie SSL mit Let's Encrypt einrichten, hängt der Speicherort der Datei von den Optionen ab, die Sie während des Zertifikatprozesses ausgewählt haben. Sie können herausfinden, welche virtuellen Hosts an der Zustellung von SSL-Anforderungen beteiligt sind, indem Sie Folgendes eingeben:

sudo apache2ctl -S

Ihre Ausgabe beginnt wahrscheinlich mit so etwas:

OutputVirtualHost configuration:
*:80                   example.com (/etc/apache2/sites-enabled/000-default.conf:1)
*:443                  is a NameVirtualHost
         default server example.com (/etc/apache2/sites-enabled/000-default-le-ssl.conf:2)
         port 443 namevhost example.com (/etc/apache2/sites-enabled/000-default-le-ssl.conf:2)
         port 443 namevhost www.example.com (/etc/apache2/sites-enabled/default-ssl.conf:2)

. . .

Anhand der mit SSL-Port 443 verknüpften Zeilen (Zeilen 3-6 in diesem Beispiel) können wir ermitteln, welche virtuellen Hosts-Dateien an der Bereitstellung dieser Domänen beteiligt sind. Hier sehen wir, dass sowohl die000-default-le-ssl.conf-Datei als auch diedefault-ssl.conf-Datei betroffen sind, daher sollten Sie beide bearbeiten. Ihre Ergebnisse werden wahrscheinlich abweichen:

sudo nano /etc/apache2/sites-enabled/000-default-le-ssl.conf
sudo nano /etc/apache2/sites-enabled/default-ssl.conf

Unabhängig davon, welche Dateien Sie öffnen müssen, ist die Vorgehensweise dieselbe. Irgendwo innerhalb derVirtualHost-Tags sollten Sie Folgendes eingeben:



    . . .

    JKMount /* ajp13_worker

    . . .

Speichern und schließen Sie die Datei. Wiederholen Sie den obigen Vorgang für alle anderen Dateien, die Sie identifiziert haben und die bearbeitet werden müssen.

Wenn Sie fertig sind, überprüfen Sie Ihre Konfiguration, indem Sie Folgendes eingeben:

sudo apache2ctl configtest

Wenn die AusgabeSyntax OK enthält, starten Sie den Apache-Webserverprozess neu:

sudo systemctl restart apache2

Sie sollten nun in der Lage sein, zu Ihrer Tomcat-Installation zu gelangen, indem Sie die SSL-Version Ihrer Site in Ihrem Webbrowser aufrufen:

https://example.com

Überspringen Sie als Nächstes die folgende Nginx-Konfiguration und fahren Sie mit dem Abschnitt fort, in dem erläutert wird, wie Sie den Zugriff auf Tomcat beschränken, um Ihre Konfiguration abzuschließen.

(Option 2) HTTP-Proxy mit Nginx

Mit Nginx ist das Proxying auch ganz einfach, wenn Sie es dem Apache-Webserver vorziehen. Nginx verfügt zwar nicht über ein Modul, mit dem das Apache JServ-Protokoll gesprochen werden kann, es kann jedoch seine robusten HTTP-Proxy-Funktionen für die Kommunikation mit Tomcat verwenden.

Abschnitt Voraussetzungen

Bevor wir uns mit dem Proxy von Nginx-Verbindungen zu Tomcat befassen können, müssen Sie Nginx installieren und sichern.

Sie können Nginx installieren, indem Sieour guide on installing Nginx on Ubuntu 16.04 folgen.

Anschließend müssen Sie SSL auf dem Server einrichten. Wie Sie dies tun, hängt davon ab, ob Sie einen Domainnamen haben oder nicht.

  • If you have a domain name…Der einfachste Weg, Ihren Server zu sichern, ist Let's Encrypt, das kostenlose, vertrauenswürdige Zertifikate bereitstellt. Folgen Sie unserenLet’s Encrypt guide for Nginx, um dies einzurichten.

  • If you do not have a domain… und Sie verwenden diese Konfiguration nur zum Testen oder für den persönlichen Gebrauch. Sie können stattdessen ein selbstsigniertes Zertifikat verwenden. Dies bietet die gleiche Art der Verschlüsselung, jedoch ohne Domänenüberprüfung. Folgen Sie unserenself-signed SSL guide for Nginx, um sich einzurichten.

Wenn Sie mit diesen Schritten fertig sind, erfahren Sie weiter unten, wie Sie den Nginx-Webserver an Ihre Tomcat-Installation anschließen.

Schritt 1: Anpassen der Nginx Server Block-Konfiguration

Das Einrichten von Nginx als Proxy für Tomcat ist sehr einfach.

Öffnen Sie zunächst die mit Ihrer Site verknüpfte Serverblockdatei. Wir gehen davon aus, dass Sie die Standard-Serverblockdatei in diesem Handbuch verwenden:

sudo nano /etc/nginx/sites-available/default

Im oberen Bereich der Datei müssen wir einenupstream-Block hinzufügen. Dadurch werden die Verbindungsdetails dargestellt, sodass Nginx weiß, wo unser Tomcat-Server empfangsbereit ist. Platzieren Sie dies außerhalb eines der in der Datei definiertenserver-Blöcke:

/etc/nginx/sites-available/default

upstream tomcat {
    server 127.0.0.1:8080 fail_timeout=0;
}

server {

    . . .

Ändern Sie als Nächstes innerhalb des für Port 443 definiertenserver-Blocks denlocation /-Block. Wir möchten alle Anforderungen direkt an den soeben definiertenupstream-Block übergeben. Kommentieren Sie den aktuellen Inhalt aus und verwenden Sie die Direktiveproxy_pass, um an den soeben definierten „Tomcat“ -Upstream zu übergeben.

Wir müssen auch die Konfiguration vonproxy_paramsin diesen Block aufnehmen. Diese Datei definiert viele Details darüber, wie Nginx die Verbindung per Proxy weiterleitet:

/etc/nginx/sites-available/default

upstream tomcat {
    server 127.0.0.1:8080 fail_timeout=0;
}

server {
    . . .

    location / {
        #try_files $uri $uri/ =404;
        include proxy_params;
        proxy_pass http://tomcat/;
    }

    . . .
}

Wenn Sie fertig sind, speichern und schließen Sie die Datei.

Schritt 2: Nginx testen und neu starten

Testen Sie als Nächstes, ob Ihre Konfigurationsänderungen Syntaxfehler verursacht haben:

sudo nginx -t

Wenn keine Fehler gemeldet werden, starten Sie Nginx neu, um Ihre Änderungen zu implementieren:

sudo systemctl restart nginx

Sie sollten nun in der Lage sein, zu Ihrer Tomcat-Installation zu gelangen, indem Sie die SSL-Version Ihrer Site in Ihrem Webbrowser aufrufen:

https://example.com

Einschränken des Zugriffs auf die Tomcat-Installation

Nachdem Sie nun über einen SSL-verschlüsselten Zugriff auf Ihre Tomcat-Installation verfügen, können wir die Tomcat-Installation ein bisschen mehr sperren.

Da wir möchten, dass alle unsere Anfragen an Tomcat über unseren Proxy eingehen, können wir Tomcat so konfigurieren, dass nur auf Verbindungen auf der lokalen Loopback-Schnittstelle gewartet wird. Dies stellt sicher, dass externe Parteien nicht versuchen können, Anfragen von Tomcat direkt zu stellen.

Öffnen Sie die Dateiserver.xml in Ihrem Tomcat-Konfigurationsverzeichnis, um die folgenden Einstellungen zu ändern:

sudo nano /opt/tomcat/conf/server.xml

In dieser Datei müssen wir die Definitionen vonConnectorändern. Derzeit sind zwei Connectors in der Konfiguration aktiviert. Einer verarbeitet normale HTTP-Anforderungen an Port 8080, während der andere Apache JServ Protocol-Anforderungen an Port 8009 verarbeitet. Die Konfiguration sieht ungefähr so ​​aus:

/opt/tomcat/conf/server.xml

. . .

    
. . .

    

Um den Zugriff auf die lokale Loopback-Schnittstelle einzuschränken, müssen wir in jeder dieser Connector-Definitionen lediglich ein Attribut "address" hinzufügen, das auf127.0.0.1 festgelegt ist. Das Endergebnis wird so aussehen:

/opt/tomcat/conf/server.xml

. . .

    
. . .

    

Speichern und schließen Sie die Datei, nachdem Sie diese beiden Änderungen vorgenommen haben.

Wir müssen unseren Tomcat-Prozess neu starten, um diese Änderungen zu implementieren:

sudo systemctl restart tomcat

Wenn Sie unserem Tomcat-Installationshandbuch gefolgt sind, ist bei Ihrer Installation eineufw-Firewall aktiviert. Da alle unsere Anforderungen an Tomcat auf die lokale Loopback-Schnittstelle beschränkt sind, können wir die Regel aus unserer Firewall entfernen, die externe Anforderungen an Tomcat zuließ.

sudo ufw delete allow 8080

Auf Ihre Tomcat-Installation sollte jetzt nur über Ihren Webserver-Proxy zugegriffen werden können.

Fazit

Zu diesem Zeitpunkt sollten Verbindungen zu Ihrer Tomcat-Instanz mithilfe eines Webserver-Proxys mit SSL verschlüsselt werden. Durch die Konfiguration eines separaten Webserverprozesses wird zwar möglicherweise mehr Software für die Bereitstellung Ihrer Anwendungen benötigt, die Sicherung Ihres Datenverkehrs wird jedoch erheblich vereinfacht.