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 Programms
authbind
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 vonapxs
festlegen, 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 KonfigurationsblockVirtualHost
eine DirektiveJkMount
hinzu, 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.