Comment chiffrer les connexions Tomcat 8 avec Apache ou Nginx sur Ubuntu 16.04

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 Ubuntu 16.04 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 l'utilisation du programmeauthbind pour mapper un programme non privilégié avec un port restreint, la configuration de la redirection de port avec un pare-feu, etc., mais elles représentent toujours 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 Ubuntu 16.04 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 dethis 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: installer et configurermod_jk

Tout d'abord, nous devons installer le modulemod_jk. Le serveur Web Apache l'utilise pour communiquer avec Tomcat à l'aide du protocole Apache JServ.

Nous pouvons installermod_jk à partir des référentiels par défaut d'Ubuntu. Mettez à jour l'index de package local et installez-le en tapant:

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

Le module sera activé automatiquement lors de l'installation.

Ensuite, nous devons configurer le module. Le fichier de configuration principal se trouve à/etc/libapache2-mod-jk/workers.properties. Ouvrez ce fichier maintenant dans votre éditeur de texte:

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

À l'intérieur, recherchez la directiveworkers.tomcat_home. Définissez ceci dans votre répertoire de base d'installation Tomcat. Pour notre installation Tomcat, ce serait/opt/tomcat:

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

workers.tomcat_home=/opt/tomcat

Enregistrez et fermez le fichier lorsque vous avez terminé.

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

Ensuite, nous devons adapter notre hôte virtuel Apache aux demandes de proxy adressées à notre installation Tomcat.

Le fichier d’hôte virtuel à ouvrir dépend de la méthode utilisée pour configurer SSL.

Si vous configurez un certificat SSL auto-signé à l'aide du guide lié à ci-dessus, ouvrez le fichierdefault-ssl.conf:

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

Si vous configurez SSL avec Let’s Encrypt, l’emplacement du fichier dépend des options que vous avez sélectionnées lors du processus de certification. Vous pouvez trouver les hôtes virtuels impliqués dans le traitement des demandes SSL en tapant:

sudo apache2ctl -S

Votre sortie commencera probablement par quelque chose comme ceci:

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)

. . .

En examinant les lignes associées au port SSL 443 (lignes 3 à 6 dans cet exemple), nous pouvons déterminer quels fichiers d’hôtes virtuels sont impliqués dans la fourniture de services à ces domaines. Ici, nous voyons que le fichier000-default-le-ssl.conf et le fichierdefault-ssl.conf sont impliqués, vous devez donc les éditer tous les deux. Vos résultats seront probablement différents:

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

Quels que soient les fichiers que vous devez ouvrir, la procédure sera la même. Quelque part dans les balisesVirtualHost, vous devez entrer ce qui suit:



    . . .

    JKMount /* ajp13_worker

    . . .

Enregistrez et fermez le fichier. Répétez la procédure ci-dessus pour tout autre fichier que vous avez identifié et qui doit être modifié.

Lorsque vous avez terminé, vérifiez votre configuration en tapant:

sudo apache2ctl configtest

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

sudo systemctl restart apache2

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 de parler le protocole Apache JServ, il peut utiliser ses puissantes fonctions 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.

Vous pouvez installer Nginx en suivantour guide on installing Nginx on Ubuntu 16.04.

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 Nginx 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 Nginx pour vous installer.

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. Nous supposerons que vous utilisez le fichier de blocage de serveur par défaut dans ce guide:

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

À 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 le contenu actuel et utilisez la directiveproxy_pass pour passer au «tomcat» en amont que nous venons de définir.

Nous devrons également inclure la configuration deproxy_params dans ce bloc. Ce fichier définit la plupart des détails de la manière dont Nginx utilisera la connexion par proxy:

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

    . . .
}

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 nano /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

Si vous avez suivi notre guide d'installation Tomcat, vous avez un pare-feuufw activé sur votre installation. Maintenant que toutes nos demandes à Tomcat sont limitées à l'interface de bouclage local, nous pouvons supprimer de notre pare-feu la règle autorisant les demandes externes à Tomcat.

sudo ufw delete allow 8080

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.