So verschlüsseln Sie Tomcat 8-Verbindungen mit Apache oder Nginx unter CentOS 7

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 CentOS 7 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 zum Zuordnen eines nicht privilegierten Programms mit einem eingeschränkten Port, zum Einrichten der Portweiterleitung mit einer Firewall usw., die jedoch jeweils zusätzliche Komplexität mit sich bringen.

  • 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 CentOS 7 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 vonthe CentOS 7 LAMP installation 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: Kompilieren und installieren Siemod_jk

Während Tomcat selbst mit einem JServ-Connector geliefert wird, enthalten die CentOS 7-Paketrepositorys nicht dasmod_jk-Modul, das der Apache-Webserver für die Kommunikation mit diesem Protokoll benötigt. Um diese Funktionalität hinzuzufügen, müssen wir den Connector von der Website des Tomcat-Projekts herunterladen und kompilieren.

Bevor wir den Quellcode für den Connector herunterladen, müssen wir die erforderlichen Build- und Laufzeitabhängigkeiten aus den CentOS-Repositorys installieren. Wir werden GCC installieren, um den Connector und die Apache-Webserver-Entwicklungsdateien so zu kompilieren, dass die erforderliche Apache-Bibliothek verfügbar ist.

sudo yum install gcc httpd-devel

Wechseln Sie nach der Installation der Abhängigkeiten in ein beschreibbares Verzeichnis und laden Sie den Connector-Quellcode herunter. Die neueste Version finden Sie unterTomcat connector download page. Kopieren Sie den Link, der der neuestentar.gz-Quelle für die Tomcat JK-Konnektoren zugeordnet ist, und laden Sie ihn mit dem Befehlcurl auf Ihren Server herunter:

cd /tmp
curl -LO http://mirrors.ibiblio.org/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.42-src.tar.gz

Extrahieren Sie als Nächstes den Tarball in das aktuelle Verzeichnis und wechseln Sie in das Unterverzeichnisnative, in dem sich der Quellcode und die Build-Skripte in der extrahierten Dateihierarchie befinden:

tar xzvf tomcat-connectors*
cd tomcat-connectors*/native

Jetzt können wir die Software konfigurieren. Wir müssen den Speicherort der Apache-Erweiterungstool-Binärdatei vonapxsfestlegen, um die Quelle für unseren Server erfolgreich zu konfigurieren. Anschließend können wirmake verwenden, um die Software zu erstellen und das kompilierte Modul zu installieren:

./configure --with-apxs=/usr/bin/apxs
make
sudo make install

Dadurch wird dasmod_jk-Modul im Apache-Modulverzeichnis installiert.

Schritt 2: Konfigurieren Sie das Modul mod_jk

Nachdem das Modul installiert ist, können wir den Apache-Webserver für die Kommunikation mit unserer Tomcat-Instanz konfigurieren. Dies kann durch Einrichten einiger Konfigurationsdateien erfolgen.

Öffnen Sie zunächst eine Datei mit dem Namenjk.conf im Verzeichnis/etc/httpd/conf.d:

sudo vi /etc/httpd/conf.d/jk.conf

Im Inneren müssen wir zunächst dasmod_jk-Modul laden. Anschließend konfigurieren wir ein dediziertes Protokoll und eine gemeinsam genutzte Speicherdatei. Schließlich verwenden wir die DirektiveJkWorkersFile, um auf die Datei zu verweisen, die wir erstellen, um unsere Worker-Konfiguration anzugeben.

Fügen Sie die folgende Konfiguration in die Datei ein, um diese Teile miteinander zu verknüpfen. Sie sollten nichts ändern müssen:

/etc/httpd/conf.d/jk.conf

LoadModule jk_module modules/mod_jk.so

JkLogFile logs/mod_jk.log
JkLogLevel info
JkShmFile logs/mod_jk.shm

JkWorkersFile conf/workers.properties

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

Als Nächstes erstellen wir die Arbeitseigenschaftendatei. Wir werden dies verwenden, um einen Worker zu definieren, der eine Verbindung zu unserem Tomcat-Backend herstellt:

sudo vi /etc/httpd/conf/workers.properties

In dieser Datei definieren wir einen einzelnen Worker, der über Port 8009 mit Version 13 des Apache JServ-Protokolls eine Verbindung zu unserer Tomcat-Instanz herstellt:

/etc/httpd/conf/workers.properties

worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=127.0.0.1
worker.worker1.port=8009

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

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

Schließlich müssen wir die Apache Virtual Host-Datei anpassen, für die SSL aktiviert ist. Wenn Sie die Voraussetzungen erfüllt haben, sollte dies derzeit so konfiguriert sein, dass Ihre Inhalte mit einem vertrauenswürdigen oder selbstsignierten SSL-Zertifikat geschützt werden.

Öffnen Sie die Datei jetzt, indem Sie Folgendes eingeben:

sudo vi /etc/httpd/conf.d/ssl.conf

Fügen Sie im KonfigurationsblockVirtualHosteine DirektiveJkMounthinzu, um den gesamten Datenverkehr, den dieser virtuelle Host empfängt, an die gerade definierte Worker-Instanz weiterzuleiten. DieJkMount können an einer beliebigen Stelle im AbschnittVirtualHost platziert werden:

/etc/httpd/conf.d/ssl.conf

. . .



. . .
JkMount /* worker1
. . .

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

Überprüfen Sie anschließend Ihre Konfiguration, indem Sie Folgendes eingeben:

sudo apachectl configtest

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

sudo systemctl restart httpd

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 verwendet 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.

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. Befolgen Sie unsereLet’s Encrypt guide for Nginx, um Nginx einzurichten und mit Let's Encrypt zu sichern.

  • 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. Befolgen Sie unsereself-signed SSL guide for Nginx, um Nginx zu installieren und mit einem selbstsignierten Zertifikat zu konfigurieren.

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. Sowohl die selbstsignierten als auch die Let's Encrypt SSL-Handbücher konfigurieren den verschlüsselten Serverblock in der/etc/httpd/conf.d/ssl.conf-Datei. Daher verwenden wir Folgendes:

sudo vi /etc/nginx/conf.d/ssl.conf

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 vorhandene Inhalte aus und verwenden Sie die Direktiveproxy_pass, um sie an den soeben definierten „Tomcat“ -Upstream zu übergeben.

Wir werden auch einige Header setzen, mit denen Nginx Tomcat-Informationen über die Anfrage weitergeben kann:

/etc/nginx/sites-available/default

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

server {
    . . .

    location / {
        #try_files $uri $uri/ =404;
        proxy_pass http://tomcat/;
        proxy_set_header Host $http_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 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 vi /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

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.