Comment chiffrer les connexions Tomcat 8 avec Apache ou Nginx sur CentOS 7

introduction

Apache Tomcat est un serveur Web et un conteneur de servlets conçus pour servir les applications Java. Fréquemment utilisé dans les déploiements d'entreprise de production et pour les besoins d'applications plus petites, Tomcat est à la fois flexible et puissant.

Dans ce guide, nous verrons comment sécuriser votre installation de CentOS 7 Tomcat avec SSL. Par défaut, lors de l'installation, toutes les communications entre le serveur Tomcat et les clients ne sont pas cryptées, y compris les mots de passe saisis ou les données sensibles. Nous pouvons intégrer le protocole SSL à notre installation Tomcat de plusieurs manières. Ce guide explique comment configurer un serveur proxy compatible SSL pour négocier en toute sécurité avec les clients, puis transmettre les demandes à Tomcat.

Nous verrons comment configurer cela à la fois avecApache etNginx.

Pourquoi un proxy inverse?

Vous pouvez configurer SSL pour une installation Tomcat de plusieurs façons, chacune avec son ensemble de compromis. Après avoir appris que Tomcat est capable de chiffrer des connexions de manière native, il peut sembler étrange que nous discutions d’une solution de proxy inverse.

SSL avec Tomcat présente un certain nombre d'inconvénients qui rendent sa gestion difficile:

  • Tomcat, when run as recommended with an unprivileged user, cannot bind to restricted ports like the conventional SSL port 443: Il existe des solutions de contournement à cela, comme utiliser le programmeauthbind pour mapper un programme non privilégié avec un port restreint, configurer la redirection de port avec un pare-feu, etc., mais elles introduisent chacune une complexité supplémentaire.

  • SSL with Tomcat is not as widely supported by other software: des projets comme Let’s Encrypt ne fournissent aucun moyen natif d’interagir avec Tomcat. De plus, le format de fichier de clés Java nécessite la conversion des certificats classiques avant utilisation, ce qui complique l'automatisation.

  • Conventional web servers release more frequently than Tomcat: cela peut avoir des implications de sécurité importantes pour vos applications. Par exemple, la suite de chiffrement SSL Tomcat prise en charge peut devenir rapidement obsolète, laissant ainsi à vos applications une protection sous-optimale. Si des mises à jour de sécurité sont nécessaires, il est probablement plus facile de mettre à jour un serveur Web que votre installation Tomcat.

Une solution de proxy inverse contourne bon nombre de ces problèmes en mettant simplement un serveur Web puissant devant l'installation de Tomcat. Le serveur Web peut gérer les demandes des clients avec SSL, fonctionnalité qu'il est spécialement conçu pour gérer. Il peut ensuite envoyer des requêtes proxy à Tomcat s’exécutant dans sa configuration normale sans privilèges.

Cette séparation des préoccupations simplifie la configuration, même si cela implique l’exécution d’un logiciel supplémentaire.

Conditions préalables

Afin de compléter ce guide, Tomcat doit déjà être configuré sur votre serveur. Ce guide supposera que vous avez utilisé les instructions de nosTomcat 8 on CentOS 7 installation guide pour vous installer.

Lorsque vous avez un Tomcat en service, continuez ci-dessous avec la section relative à votre serveur Web préféré. Apache démarre directement en dessous, tandis que la configuration deNginx peut être trouvée en sautant un peu.

(Option 1) Proxying avec lesmod_jk du serveur Web Apache

Le serveur Web Apache possède un module appelémod_jk qui peut communiquer directement avec Tomcat en utilisant le protocole Apache «JServ». Un connecteur pour ce protocole est activé par défaut dans Tomcat. Tomcat est donc prêt à gérer ces demandes.

Section Prérequis

Avant de pouvoir discuter de la procédure de proxy pour les connexions de serveur Web Apache à Tomcat, vous devez installer et sécuriser un serveur Web Apache.

Vous pouvez installer le serveur Web Apache en suivant l'étape 1 dethe CentOS 7 LAMP installation guide. N'installez pas MySQL ou PHP.

Ensuite, vous devrez configurer SSL sur le serveur. Cela dépend si vous avez ou non un nom de domaine.

  • If you have a domain name… le moyen le plus simple de sécuriser votre serveur consiste à utiliser Let’s Encrypt, qui fournit des certificats fiables et gratuits. Suivez nosLet’s Encrypt guide for Apache pour configurer cela.

  • If you do not have a domain… et que vous n'utilisez cette configuration qu'à des fins de test ou d'utilisation personnelle, vous pouvez utiliser un certificat auto-signé à la place. Ceci fournit le même type de cryptage, mais sans validation de domaine. Suivez nosself-signed SSL guide for Apache pour vous installer.

Une fois ces étapes terminées, continuez ci-dessous pour savoir comment connecter le serveur Web Apache à votre installation Tomcat.

Étape 1: Compilez et installezmod_jk

Alors que Tomcat lui-même est livré avec un connecteur JServ, les référentiels de packages CentOS 7 n'incluent pas le modulemod_jk dont le serveur Web Apache a besoin pour communiquer en utilisant ce protocole. Pour ajouter cette fonctionnalité, nous devrons télécharger et compiler le connecteur à partir du site du projet Tomcat.

Avant de télécharger le code source du connecteur, nous devons installer les dépendances de construction et d'exécution nécessaires à partir des référentiels CentOS. Nous allons installer GCC pour compiler le connecteur et les fichiers de développement du serveur Web Apache afin que la bibliothèque Apache requise soit disponible.

sudo yum install gcc httpd-devel

Une fois les dépendances installées, accédez au répertoire accessible en écriture et téléchargez le code source du connecteur. Vous pouvez trouver la dernière version sur lesTomcat connector download page. Copiez le lien associé à la dernière sourcetar.gz pour les connecteurs Tomcat JK et utilisez la commandecurl pour le télécharger sur votre serveur:

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

Ensuite, extrayez l'archive tar dans le répertoire courant et déplacez-vous dans le sous-répertoirenative où se trouvent le code source et les scripts de construction dans la hiérarchie des fichiers extraits:

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

Nous sommes maintenant prêts à configurer le logiciel. Nous devons définir l'emplacement du binaire de l'outil d'extension Apacheapxs pour configurer avec succès la source de notre serveur. Ensuite, nous pouvons utilisermake pour construire le logiciel et installer le module compilé:

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

Cela installera le modulemod_jk dans le répertoire des modules Apache.

Étape 2: Configurez le module mod_jk

Maintenant que le module est installé, nous pouvons configurer le serveur Web Apache pour qu’il l’utilise pour communiquer avec notre instance Tomcat. Cela peut être fait en configurant quelques fichiers de configuration.

Commencez par ouvrir un fichier appeléjk.conf dans le répertoire/etc/httpd/conf.d:

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

À l'intérieur, nous devons commencer par charger le modulemod_jk. Ensuite, nous allons configurer un journal dédié et un fichier de mémoire partagée. Enfin, nous utiliserons la directiveJkWorkersFile pour pointer vers le fichier que nous allons créer pour spécifier notre configuration de travail.

Collez la configuration suivante dans le fichier pour relier ces éléments. Vous ne devriez rien modifier:

/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

Enregistrez et fermez le fichier lorsque vous avez terminé.

Ensuite, nous allons créer le fichier de propriétés du travailleur. Nous allons utiliser cela pour définir un travailleur à connecter à notre backend Tomcat:

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

Dans ce fichier, nous allons définir un seul opérateur, qui se connectera à notre instance Tomcat sur le port 8009 à l'aide de la version 13 du protocole Apache JServ:

/etc/httpd/conf/workers.properties

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

Lorsque vous avez terminé, enregistrez et fermez le fichier.

Étape 3: Ajustez l'hôte virtuel Apache au proxy avecmod_jk

Enfin, nous devons ajuster le fichier d’hôte virtuel Apache sur lequel SSL est activé. Si vous avez suivi les conditions préalables, cela devrait actuellement être configuré pour protéger votre contenu à l'aide d'un certificat SSL approuvé ou auto-signé.

Ouvrez le fichier maintenant en tapant:

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

À l'intérieur, dans le bloc de configurationVirtualHost, ajoutez une directiveJkMount pour transmettre tout le trafic que cet hôte virtuel reçoit à l'instance de travail que nous venons de définir. LesJkMount peuvent être placés n'importe où dans la sectionVirtualHost:

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

. . .



. . .
JkMount /* worker1
. . .

Enregistrez et fermez le fichier lorsque vous avez terminé.

Ensuite, vérifiez votre configuration en tapant:

sudo apachectl configtest

Si la sortie contientSyntax OK, redémarrez le processus du serveur Web Apache:

sudo systemctl restart httpd

Vous devriez maintenant pouvoir accéder à votre installation Tomcat en visitant la version SSL de votre site dans votre navigateur Web:

https://example.com

Ensuite, passez la configuration Nginx ci-dessous et passez à la section expliquant comment restreindre l'accès à Tomcat afin de compléter votre configuration.

(Option 2) HTTP Proxying avec Nginx

La procuration est également facile avec Nginx, si vous le préférez au serveur Web Apache. Bien que Nginx ne dispose pas d'un module lui permettant d'utiliser le protocole Apache JServ, il peut utiliser ses puissantes fonctionnalités de proxy HTTP pour communiquer avec Tomcat.

Section Prérequis

Avant de pouvoir discuter de la procédure de proxy pour les connexions Nginx à Tomcat, vous devez installer et sécuriser Nginx.

Cela dépend si vous avez ou non un nom de domaine.

  • If you have a domain name… le moyen le plus simple de sécuriser votre serveur consiste à utiliser Let’s Encrypt, qui fournit des certificats fiables et gratuits. Suivez nosLet’s Encrypt guide for Nginx pour configurer Nginx et le sécuriser avec Let’s Encrypt.

  • If you do not have a domain… et que vous n'utilisez cette configuration qu'à des fins de test ou d'utilisation personnelle, vous pouvez utiliser un certificat auto-signé à la place. Ceci fournit le même type de cryptage, mais sans validation de domaine. Suivez nosself-signed SSL guide for Nginx pour installer Nginx et le configurer avec un certificat auto-signé.

Une fois ces étapes terminées, continuez ci-dessous pour savoir comment connecter le serveur Web Nginx à votre installation Tomcat.

Étape 1: Réglage de la configuration de bloc du serveur Nginx

Configurer Nginx sur un proxy vers Tomcat est très simple.

Commencez par ouvrir le fichier de blocage du serveur associé à votre site. Les guides SSL auto-signé et Let’s Encrypt configurent le bloc serveur crypté dans le fichier/etc/httpd/conf.d/ssl.conf, nous allons donc utiliser cela:

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

À l'intérieur, vers le haut du fichier, nous devons ajouter un blocupstream. Ceci détaillera les détails de la connexion afin que Nginx sache où notre serveur Tomcat écoute. Placez-le en dehors de l'un des blocsserver définis dans le fichier:

/etc/nginx/sites-available/default

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

server {

    . . .

Ensuite, dans le blocserver défini pour le port 443, modifiez le bloclocation /. Nous voulons transmettre toutes les requêtes directement au blocupstream que nous venons de définir. Commentez tout contenu existant et utilisez la directiveproxy_pass pour passer au «tomcat» en amont que nous venons de définir.

Nous allons également définir des en-têtes permettant à Nginx de transmettre des informations à Tomcat concernant la requête:

/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;
    }

    . . .
}

Lorsque vous avez terminé, enregistrez et fermez le fichier.

Étape 2: tester et redémarrer Nginx

Ensuite, testez pour vous assurer que vos modifications de configuration n'introduisent aucune erreur de syntaxe:

sudo nginx -t

Si aucune erreur n'est signalée, redémarrez Nginx pour appliquer vos modifications:

sudo systemctl restart nginx

Vous devriez maintenant pouvoir accéder à votre installation Tomcat en visitant la version SSL de votre site dans votre navigateur Web:

https://example.com

Restreindre l'accès à l'installation de Tomcat

Maintenant que vous avez un accès crypté SSL à votre installation Tomcat, nous pouvons verrouiller un peu plus l'installation de Tomcat.

Puisque nous voulons que toutes nos demandes adressées à Tomcat passent par notre proxy, nous pouvons configurer Tomcat pour qu'il écoute uniquement les connexions sur l'interface de bouclage local. Cela garantit que les parties extérieures ne peuvent pas tenter de faire des demandes directement de Tomcat.

Ouvrez le fichierserver.xml dans votre répertoire de configuration Tomcat pour modifier ces paramètres:

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

Dans ce fichier, nous devons modifier les définitions deConnector. Actuellement, deux connecteurs sont activés dans la configuration. L'un traite les requêtes HTTP normales sur le port 8080, tandis que l'autre traite les requêtes du protocole Apache JServ sur le port 8009. La configuration ressemblera à ceci:

/opt/tomcat/conf/server.xml

. . .

    
. . .

    
    

Afin de restreindre l'accès à l'interface de bouclage locale, nous devons simplement ajouter un attribut «adresse» défini sur127.0.0.1 dans chacune de ces définitions de connecteur. Le résultat final ressemblera à ceci:

/opt/tomcat/conf/server.xml

. . .

    
. . .

    
    

Après avoir apporté ces deux modifications, enregistrez et fermez le fichier.

Nous devons redémarrer notre processus Tomcat pour implémenter ces modifications:

sudo systemctl restart tomcat

Votre installation Tomcat ne devrait maintenant être accessible que via le proxy de votre serveur Web.

Conclusion

À ce stade, les connexions à votre instance Tomcat doivent être chiffrées avec SSL à l'aide d'un proxy de serveur Web. Bien que la configuration d'un processus de serveur Web distinct puisse augmenter le logiciel nécessaire au service de vos applications, cela simplifie considérablement le processus de sécurisation du trafic.