Techniques essentielles pour optimiser et sécuriser votre serveur Apache Tomcat.
Tomcat, un des conteneurs de servlets et JSP les plus répandus, est utilisé par des sites web majeurs tels que :
- LinkedIn.com
- Dailymail.co.uk
- Comcast.net
- Walmart.com
- Reuters.com
- Meetup.com
- Webs.com
Le graphique ci-après illustre la position de Tomcat sur le marché des serveurs d’applications Java.
Source : Plumbr
Bien que Tomcat puisse techniquement servir directement les requêtes, il est préférable, dans un environnement de production, d’utiliser un serveur web comme Apache ou Nginx en tant que front-end pour rediriger les requêtes vers Tomcat.
L’utilisation d’un serveur web pour gérer les requêtes améliore les performances et la sécurité. Si vous optez pour Apache HTTP comme serveur web frontal, sa sécurisation est également cruciale.
La configuration par défaut de Tomcat peut révéler des informations sensibles, facilitant ainsi les préparatifs d’une attaque contre l’application.
Les recommandations suivantes ont été testées avec Tomcat 7.x sous environnement UNIX.
Public ciblé
Ce guide est destiné aux administrateurs middleware, au support d’applications, aux analystes systèmes et à toute personne souhaitant apprendre à renforcer et sécuriser Tomcat.
Une connaissance solide des commandes Tomcat et UNIX est indispensable.
Remarques préliminaires
Un outil d’examen des en-têtes HTTP est nécessaire pour les vérifications. Deux méthodes s’offrent à vous :
Pour une application accessible via Internet, utilisez des outils d’analyse d’en-têtes HTTP.
Pour une application intranet, employez les outils de développement intégrés de Google Chrome ou Firefox.
Avant toute modification de fichier, une sauvegarde est vivement recommandée.
Nous désignerons le répertoire d’installation de Tomcat par $tomcat dans ce guide.
Explorons à présent les étapes de renforcement et de sécurisation.
Suppression de la bannière du serveur
La suppression de la bannière du serveur dans l’en-tête HTTP est une mesure de sécurité primordiale.
Afficher la bannière du serveur expose la version et le produit utilisé, ce qui constitue une vulnérabilité de divulgation d’informations.
Par défaut, une page servie par Tomcat se présente comme suit :
Il est crucial de masquer les informations concernant le produit et la version dans l’en-tête du serveur. Voici comment procéder :
- Accédez au dossier $tomcat/conf
- Ouvrez server.xml avec l’éditeur vi
- Ajoutez la ligne suivante au port du connecteur
Server =” “
Exemple :
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" Server =" " redirectPort="8443" />
- Enregistrez le fichier et redémarrez Tomcat. L’en-tête du serveur doit maintenant apparaître avec une valeur vide.
Démarrage de Tomcat avec un gestionnaire de sécurité
Un gestionnaire de sécurité vous protège des applets non approuvées exécutées dans votre navigateur.
Il est préférable d’exécuter Tomcat avec un gestionnaire de sécurité. Tomcat propose une documentation détaillée sur le gestionnaire de sécurité Tomcat.
L’avantage est que vous n’avez pas besoin de modifier de fichier de configuration. Il suffit d’exécuter le fichier startup.sh avec l’argument -security.
[[email protected] bin]# ./startup.sh -security Using CATALINA_BASE: /opt/tomcat Using CATALINA_HOME: /opt/tomcat Using CATALINA_TMPDIR: /opt/tomcat/temp Using JRE_HOME: /usr Using CLASSPATH: /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar Using Security Manager Tomcat started. [[email protected] bin]#
Activation de SSL/TLS
Il est impératif de traiter les requêtes web via HTTPS pour sécuriser les échanges de données entre le client et Tomcat. L’implémentation d’un certificat SSL est nécessaire pour rendre votre application web accessible via HTTPS.
Si vous disposez déjà d’un magasin de clés avec le certificat, ajoutez la ligne ci-dessous dans la section du port du connecteur du fichier server.xml.
SSLEnabled="true" scheme="https" keystoreFile="ssl/bloggerflare.jks" keystorePass="chandan" clientAuth="false" sslProtocol="TLS"
Adaptez le nom du fichier Keystore et le mot de passe à votre situation.
Si vous avez besoin d’aide pour le processus keystore et CSR, consultez ce guide.
Application du protocole HTTPS
Cette étape n’est applicable que si SSL est activé, sinon l’application sera compromise.
Une fois SSL activé, il est recommandé de forcer la redirection de toutes les requêtes HTTP vers HTTPS, garantissant ainsi une communication sécurisée entre l’utilisateur et le serveur d’application Tomcat.
- Accédez au dossier $tomcat/conf.
- Ouvrez web.xml avec l’éditeur vi.
- Ajoutez la syntaxe suivante avant /web-app>
<security-constraint> <web-resource-collection> <web-resource-name>Protected Context</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
- Enregistrez le fichier et redémarrez Tomcat.
Ajout des attributs Secure et HttpOnly aux cookies
Sans un cookie sécurisé, la session de l’application web et les cookies peuvent être manipulés ou volés. Ces attributs sont injectés dans l’en-tête de la réponse.
Ajoutez les lignes suivantes dans la section session-config du fichier web.xml :
<cookie-config> <http-only>true</http-only> <secure>true</secure> </cookie-config>
Voici une capture d’écran de la configuration :
Enregistrez le fichier et redémarrez Tomcat pour inspecter l’en-tête de la réponse HTTP.
Exécution de Tomcat avec un compte non privilégié
Il est recommandé d’utiliser un utilisateur dédié et non privilégié pour Tomcat afin de protéger les autres services en cas de compromission d’un compte.
- Créez un utilisateur UNIX, par exemple tomcat :
useradd tomcat
- Arrêtez Tomcat s’il est en cours d’exécution.
- Modifiez le propriétaire du dossier $tomcat et mettez tomcat comme utilisateur :
chown -R tomcat:tomcat tomcat/
Démarrez Tomcat et assurez-vous qu’il fonctionne avec l’utilisateur tomcat.
Suppression des applications par défaut ou inutiles
Tomcat est livré avec des applications web par défaut, qui peuvent ne pas être nécessaires dans un environnement de production.
Vous pouvez les supprimer afin de réduire les risques de sécurité liés aux applications par défaut.
- ROOT – Page d’accueil par défaut
- Documents – Documentation Tomcat
- Examples – Exemples de JSP et de servlets
- Manager, host-manager – Administration Tomcat
Ces applications se trouvent dans le dossier $tomcat/webapps.
[[email protected] webapps]# ls -lt drwxr-xr-x 14 tomcat tomcat 4096 Sep 29 15:26 docs drwxr-xr-x 7 tomcat tomcat 4096 Sep 29 15:26 examples drwxr-xr-x 5 tomcat tomcat 4096 Sep 29 15:26 host-manager drwxr-xr-x 5 tomcat tomcat 4096 Sep 29 15:26 manager drwxr-xr-x 3 tomcat tomcat 4096 Sep 29 15:26 ROOT [[email protected] webapps]#
Modification du port et de la commande SHUTDOWN
Par défaut, Tomcat est configuré pour s’arrêter sur le port 8005.
Il est possible d’arrêter une instance de Tomcat en utilisant telnet vers IP:port et en saisissant la commande SHUTDOWN.
Chandans # telnet localhost 8005 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. SHUTDOWN Connection closed by foreign host. Chandans #
C’est dangereux !
Une configuration par défaut entraîne un risque de sécurité élevé.
Il est donc vivement recommandé de modifier le port et la commande d’arrêt par défaut en quelque chose d’imprévisible.
- Modifiez les éléments suivants dans server.xml :
<Server port="8005" shutdown="SHUTDOWN">
8005 – Remplacez par un autre port inutilisé.
SHUTDOWN – Remplacez par une commande plus complexe.
Exemple :
<Server port="8867" shutdown="NOTGONNAGUESS">
Remplacement des pages par défaut 404, 403 et 500
Utiliser une page par défaut pour les erreurs 404, 403, ou 500 expose des détails sur la version du serveur.
Voici la page d’erreur 404 par défaut :
Pour limiter les risques, créez une page d’erreur générique et configurez web.xml pour rediriger vers cette page.
- Accédez à $tomcat/webapps/$application.
- Créez un fichier error.jsp avec l’éditeur vi.
<html> <head> <title>Error Page</title> </head> <body> That's an error! </body> </html>
- Accédez au dossier $tomcat/conf.
- Ajoutez ce qui suit dans le fichier web.xml, avant la balise /web-app>
<error-page> <error-code>404</error-code> <location>/error.jsp</location> </error-page> <error-page> <error-code>403</error-code> <location>/error.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/error.jsp</location> </error-page>
- Redémarrez le serveur Tomcat pour tester les changements.
Bien mieux !
Vous pouvez également appliquer cette méthode pour java.lang.Exception, évitant ainsi de révéler des informations sur la version de Tomcat en cas d’exception Java.
Il suffit d’ajouter ce qui suit dans web.xml et de redémarrer le serveur Tomcat.
<error-page> <exception-type>java.lang.Exception</exception-type> <location>/error.jsp</location> </error-page>
Ce guide vous donne une idée des mesures à prendre pour sécuriser Tomcat. Si vous souhaitez approfondir vos connaissances en administration de Tomcat, ce cours en ligne pourrait vous intéresser.
Découvrez également comment configurer WAS pour éviter de demander un mot de passe lors de l’arrêt ici.