Comment optimiser votre installation de Tomcat sur Ubuntu 14.04

introduction

Tomcat est une implémentation répandue des technologies Java Servlet et JavaServer Pages. Il est publié par Apache Software Foundation sous la licence populaire Open Source Apache. Ses fonctionnalités puissantes, sa licence avantageuse et sa grande communauté en font l’un des meilleurs servlets Java.

Tomcat nécessite presque toujours un réglage supplémentaire après son installation. Lisez cet article pour savoir comment optimiser votre installation Tomcat afin qu’elle fonctionne de manière sécurisée et efficace.

Cet article continue sur le sujet de l’exécution de Tomcat sur Ubuntu 14.04 et suppose que vous avez déjà lu https://www.digitalocean.com/community/tutorials/how-to-install-apache-tomcat-7-on-ubuntu. -14-04-via-apt-get [Comment installer Apache Tomcat 7 sur Ubuntu 14.04 via Apt-Get].

Conditions préalables

Ce guide a été testé sur Ubuntu 14.04. L’installation et la configuration décrites seraient similaires sur d’autres systèmes d’exploitation ou versions du système d’exploitation, mais les commandes et l’emplacement des fichiers de configuration peuvent varier.

Pour ce tutoriel, vous aurez besoin de:

Toutes les commandes de ce didacticiel doivent être exécutées en tant qu’utilisateur non root. Si un accès root est requis pour la commande, il sera précédé de + sudo +.

Traitement des demandes sur le port HTTP standard

Comme vous l’avez probablement déjà remarqué, Tomcat écoute par défaut le port TCP 8080. Ce port par défaut provient principalement du fait que Tomcat s’exécute sous l’utilisateur non privilégié + tomcat7 +. Sous Linux, seuls les utilisateurs privilégiés tels que + root + sont autorisés à écouter sur les ports inférieurs à 1024, sauf indication contraire. Par conséquent, vous ne pouvez pas simplement changer le port d’écoute de Tomcat en 80 (HTTP).

Ainsi, la première tâche d’optimisation de votre installation Tomcat consiste à résoudre le problème ci-dessus et à vous assurer que vos applications Web Tomcat sont disponibles sur le port HTTP standard.

Le moyen le plus simple (mais pas nécessairement le meilleur) de résoudre ce problème consiste à créer un pare-feu (iptables) - transfert du port TCP 80 au port TCP 8080. Cela peut être fait avec la commande + iptables +:

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

Pour rendre cette règle iptables permanente, consultez l’article Comment définir Un pare-feu utilisant IPTables sur Ubuntu 14.04 dans la partie * Enregistrer votre configuration Iptables *.

Pour supprimer cette règle iptables, vous pouvez simplement remplacer l’indicateur + -A + pour ajouter des règles par l’indicateur + -D + pour supprimer des règles dans la commande ci-dessus, comme suit:

sudo iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

Un tel transfert de trafic simple n’est pas optimal du point de vue de la sécurité ou des performances. Au lieu de cela, une bonne pratique consiste à ajouter un serveur Web, tel que Nginx, devant Tomcat. La raison en est que Tomcat est juste un servlet Java avec les fonctions de base d’un serveur Web, tandis que Nginx est un serveur Web typique, puissant et entièrement fonctionnel. Voici quelques avantages importants liés à l’utilisation de Nginx en tant que serveur frontal:

  • Nginx est plus sécurisé que Tomcat et pourrait le protéger efficacement contre diverses attaques. En cas de mises à jour de sécurité urgentes, il est beaucoup plus facile, rapide et sûr de mettre à jour le serveur Web frontal Nginx que de s’inquiéter des problèmes de temps mort et de compatibilité liés aux mises à niveau de Tomcat.

  • Nginx gère plus efficacement le trafic HTTP et HTTPS grâce à une meilleure prise en charge du contenu statique, de la mise en cache et de SSL.

  • Nginx est facilement configuré pour écouter sur n’importe quel port, y compris 80 et 443.

Si vous êtes convaincu des avantages ci-dessus, assurez-vous d’abord d’avoir supprimé la règle iptables précédente, puis installez Nginx à l’aide de la commande suivante:

sudo apt-get install nginx

Ensuite, éditez la configuration de bloc du serveur par défaut de Nginx (+ / etc / nginx / sites-enabled / default +) avec votre éditeur favori, comme ceci:

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

Recherchez la partie + location / +, qui spécifie comment toutes les demandes doivent être servies et assurez-vous qu’elle ressemble à ceci:

/ etc / nginx / sites-enabled / default

location / {
   proxy_pass http://127.0.0.1:8080/;
}

La directive + proxy_pass + ci-dessus signifie que toute demande doit être transmise à l’adresse IP locale 127.0.0.1 sur le port TCP 8080 où Tomcat est à l’écoute. Fermez le fichier et redémarrez Nginx avec la commande:

sudo service nginx restart

Après cela, essayez d’accéder à Tomcat en vous connectant à l’IP de votre Droplet au port HTTP standard de votre navigateur. L’URL devrait ressembler à + ​​http: // +. Si tout fonctionne correctement, la page par défaut de Tomcat doit être ouverte. Sinon, assurez-vous que vous avez supprimé la règle iptables et que Tomcat a été correctement installé conformément aux conditions préalables de cet article.

Sécuriser Tomcat

Sécuriser Tomcat est probablement la tâche la plus importante et souvent négligée. Heureusement, en quelques étapes seulement, vous pouvez avoir une configuration Tomcat assez sécurisée. Pour suivre cette partie de l’article, vous devez installer et configurer Nginx devant Tomcat, comme décrit précédemment.

Suppression des applications Web administratives

Le compromis habituel entre fonctionnalité et sécurité est également valable pour Tomcat. Pour augmenter la sécurité, vous pouvez supprimer les applications de gestionnaire Web et de gestionnaire d’hôte par défaut. Cela ne sera pas pratique car vous devrez effectuer toute l’administration, y compris le déploiement d’applications Web, à partir de la ligne de commande.

Supprimer les outils d’administration Web de Tomcat est une bonne chose pour la sécurité, car vous n’aurez pas à craindre que quelqu’un en abuse. Cette bonne pratique de sécurité est couramment appliquée aux sites de production.

Les applications Web d’administration sont contenues dans le paquet Ubuntu + tomcat7-admin +. Ainsi, pour les supprimer, exécutez la commande:

sudo apt-get remove tomcat7-admin

Restreindre l’accès aux applications Web administratives

Si vous n’avez pas supprimé les applications Web administratives, comme recommandé dans la partie précédente, nous pouvons au moins en restreindre l’accès. Leurs URL doivent être + http: /// manager / + et + http: /// host-manager / +. Si vous voyez une erreur 404 Not Found à ces URL, cela signifie qu’elles ont déjà été supprimées et que vous ne devez rien faire. Néanmoins, vous pouvez lire les instructions suivantes pour savoir comment utiliser d’autres ressources sensibles que vous souhaitez peut-être protéger.

À ce stade, Nginx accepte les connexions sur le port 80 afin que vous puissiez accéder à toutes les applications Web à partir de «+ http: // ». De même, Tomcat écoute le port 8080 dans le monde entier, c.-à-d. ` http: //: 8080 +`, où vous pouvez trouver les mêmes applications. Pour améliorer la sécurité, nous limiterons les ressources disponibles sur le port 80 via Nginx. Nous allons également rendre Tomcat et son port exposé 8080 disponibles uniquement localement sur le serveur et Nginx.

Ouvrez le fichier de configuration du bloc de serveur par défaut + / etc / nginx / sites-enabled / default +:

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

Après la directive + nom_serveur + mais au-dessus de l’emplacement racine par défaut (+ emplacement / +), ajoutez ce qui suit et remplacez ++ par l’adresse IP de votre ordinateur local:

/ etc / nginx / sites-enabled / default

...
location /manager/ {
   allow ;
   deny all;
   proxy_pass http://127.0.0.1:8080/manager/;
}
...

Vous devriez appliquer la même restriction pour l’application host-manager en ajoutant un autre bloc de configuration dans lequel + manager + est remplacé par + host-manager + comme ceci (remplacez à nouveau ++ par votre adresse IP locale):

/ etc / nginx / sites-enabled / default

...
location /host-manager/ {
   allow ;
   deny all;
   proxy_pass http://127.0.0.1:8080/host-manager/;
}
...

Une fois que vous aurez redémarré Nginx, l’accès aux contextes Web + manager et` + host-manager` sera limité à votre adresse IP locale:

sudo service nginx restart

Vous pouvez le tester en ouvrant dans votre navigateur + http: /// manager / + et + http: /// host-manager / +. Les applications doivent être disponibles, mais si vous essayez d’accéder aux mêmes URL à l’aide d’un proxy public ou d’un autre ordinateur, vous devriez alors voir une erreur 403 Forbidden.

De plus, vous pouvez également supprimer la documentation et les exemples de Tomcat à l’aide de la commande suivante:

sudo apt-get remove tomcat7-docs tomcat7-examples

Veuillez noter que Tomcat écoute toujours les connexions externes sur le port TCP 8080. Ainsi, Nginx et ses mesures de sécurité peuvent être facilement contournés. Pour résoudre ce problème, configurez Tomcat pour qu’il écoute uniquement sur l’interface locale 127.0.0.1. Pour cela, ouvrez le fichier + / etc / tomcat7 / server.xml avec votre éditeur favori:

sudo nano /etc/tomcat7/server.xml

Ajoutez + address =" 127.0.0.1 "+ dans la partie de configuration + Connector + comme ceci:

/etc/tomcat7/server.xml

...
<Connector  port="8080" protocol="HTTP/1.1"
   connectionTimeout="20000"
   URIEncoding="UTF-8"
   redirectPort="8443" />
...

Après cela, redémarrez Tomcat pour que le nouveau paramètre prenne effet:

sudo service tomcat7 restart

Suivez les étapes ci-dessus pour vous assurer que vous disposez d’un bon niveau de sécurité de base pour Tomcat.

Réglage précis des paramètres de la machine virtuelle Java

Naturellement, les principes de réglage précis de la machine virtuelle Java (JVM) sont également applicables à Tomcat. Bien que le réglage de la JVM soit une science à part entière, il existe certaines bonnes pratiques de base que tout le monde peut facilement appliquer:

  • La taille de segment maximale, + Xmx +, est la mémoire maximale que Tomcat peut utiliser. Il doit être défini sur une valeur laissant suffisamment de mémoire libre au Droplet pour s’exécuter et à tous les autres services que vous pourriez avoir sur le Droplet. Par exemple, si votre Droplet dispose de 2 Go de RAM, il peut être prudent d’allouer 1 Go de RAM à xmx. Cependant, gardez à l’esprit que la mémoire utilisée par Tomcat sera légèrement supérieure à la taille de + Xmx +.

  • La taille de segment minimale, + Xms +, est la quantité de mémoire allouée au démarrage. Il devrait être égal à la valeur xmx dans la plupart des cas. Ainsi, vous éviterez le processus d’allocation de mémoire coûteux en cours d’exécution car la taille de la mémoire allouée sera constante tout le temps.

  • La mémoire dans laquelle les classes sont stockées de manière permanente, + MaxPermSize +, devrait permettre à Tomcat de charger les classes de vos applications et de laisser de la mémoire disponible de la valeur + Xmx + pour l’instanciation de ces classes. Si vous n’êtes pas sûr de la quantité de mémoire dont ont besoin vos classes d’applications, vous pouvez définir le «+ MaxPermSize » de manière à réduire de moitié la taille de « Xmx +» au début, soit 512 Mo dans notre exemple.

Sous Ubuntu 14.04, vous pouvez personnaliser les options de la machine virtuelle Java de Tomcat en modifiant le fichier + / etc / default / tomcat7 +. Donc, pour appliquer les conseils ci-dessus, veuillez ouvrir ce fichier avec votre éditeur préféré:

sudo nano /etc/default/tomcat7

Si vous avez suivi les instructions d’installation de Tomcat à partir des conditions préalables, recherchez la ligne suivante:

/ etc / default / tomcat7

...
JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Xmx512m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC"
...

Si votre Droplet dispose de 2 Go de RAM et que vous souhaitez attribuer environ 1 Go à Tomcat, cette ligne doit être remplacée par:

/ etc / default / tomcat7

...
JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true  -Xmx -XX:MaxPermSize= -XX:+UseConcMarkSweepGC"
...

Pour que ce paramètre prenne effet, vous devez redémarrer Tomcat:

sudo service tomcat7 restart

La configuration JVM ci-dessus est un bon début, mais vous devez surveiller le journal de Tomcat (+ / var / log / tomcat7 / catalina.out +) pour détecter les problèmes, notamment après le redémarrage de Tomcat ou la réalisation de déploiements. Pour surveiller le journal, utilisez la commande + tail + comme ceci:

sudo tail -f /var/log/tomcat7/catalina.out

Si vous êtes nouveau sur + tail +, vous devez appuyer sur la combinaison de touches + Ctrl-C + de votre clavier pour arrêter de mettre fin au journal.

Recherchez des erreurs comme + OutOfMemoryError +. Une telle erreur indiquerait que vous devez adapter les paramètres de la machine virtuelle Java et plus précisément augmenter la taille + Xmx +.

Conclusion

C’est ça! Vous avez maintenant sécurisé et optimisé Tomcat en seulement quelques étapes faciles à suivre. Ces optimisations de base sont recommandées, non seulement pour la production, mais même pour les environnements de test et de développement exposés à Internet.