Tomcat (sécurisation)
| Fiche express | |
|---|---|
| Sujet | Durcissement d'une instance Tomcat |
| Contexte | À faire après l'installation, notamment en DMZ |
| Référence | OWASP « Securing Tomcat » |
| Voir aussi | Tomcat · Tomcat (SSL) |
Procédure de durcissement d'un service Tomcat, à appliquer après l'installation, en particulier en cas de positionnement en DMZ. Inspirée de la documentation OWASP « Securing Tomcat ».
Droits et versions
Vérifier que Java, Tomcat et les librairies sont à jour.
chmod 400 $CATALINA_HOME/conf
TOMCAT_USER="changeme"
APP_NAME="changeme"
chown -R ${TOMCAT_USER}:${TOMCAT_USER} $CATALINA_HOME/logs
chmod -R 300 $CATALINA_HOME/logs
chown -R ${TOMCAT_USER}:${TOMCAT_USER} /tmp/hsperfdata_${APP_NAME}
chmod -R 750 /tmp/hsperfdata_${APP_NAME}
Purge des applications d'exemple
Supprimer de $CATALINA_HOME/webapps : balancer, jsp-examples, servlet-examples, tomcat-docs, webdav. Ne conserver que manager et ROOT.
Si le manager n'est pas nécessaire, purger aussi host-manager et manager ainsi que leurs fichiers conf/Catalina/localhost/*.xml associés.
Page par défaut (listing désactivé)
Dans conf/web.xml, s'assurer que le listing de répertoire est désactivé :
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Retrait des bannières
Server info (fichier ServerInfo.properties dans catalina.jar) :
cd $CATALINA_HOME/lib
jar xf catalina.jar org/apache/catalina/util/ServerInfo.properties
# server.info=Apache Tomcat
jar uf catalina.jar org/apache/catalina/util/ServerInfo.properties
En-tête HTTP (attribut server du Connector) :
<Connector port="8080" server="Apache" />
Page d'erreur personnalisée
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.jsp</location>
</error-page>
Configuration minimaliste
mv $CATALINA_HOME/conf/server.xml $CATALINA_HOME/conf/server-original.xml
mv $CATALINA_HOME/conf/server-minimal.xml $CATALINA_HOME/conf/server.xml
Protection du port de shutdown
Bloquer le port de shutdown au pare-feu, changer la commande et restreindre la lecture du fichier au seul utilisateur Tomcat :
<Server port="8005" shutdown="MotDePasseComplexe">
Sécuriser la webapp manager
Ajouter un utilisateur manager dans conf/tomcat-users.xml (mot de passe robuste) :
<role rolename="manager"/>
<user username="admin" password="CHANGEME" roles="manager"/>
Le mot de passe transitant en clair, imposer le SSL :
$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA
# puis décommenter le connecteur "SSL HTTP/1.1 Connector" dans server.xml
Contraindre le transport dans webapps/manager/WEB-INF/web.xml :
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
Restreindre l'accès par IP ou par nom d'hôte (conf/Catalina/localhost/manager.xml) :
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.*" />
<!-- ou -->
<Valve className="org.apache.catalina.valves.RemoteHostValve" allow="*.exemple.tld" />
Renommer le manager :
mv $CATALINA_HOME/conf/Catalina/localhost/manager.xml $CATALINA_HOME/conf/Catalina/localhost/foobar.xml
# mettre à jour le docBase dans foobar.xml
mv $CATALINA_HOME/server/webapps/manager $CATALINA_HOME/server/webapps/foobar
Journalisation par application
Ajouter dans webapps/APP_NAME/WEB-INF/classes/logging.properties :
handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
org.apache.juli.FileHandler.level = ALL
org.apache.juli.FileHandler.directory = ${catalina.base}/logs
org.apache.juli.FileHandler.prefix = APP_NAME.
Java security manager
Il est possible d'encapsuler les applications d'une même instance Tomcat via le Security Manager de la JVM (voir la documentation Tomcat « security-manager-howto »).
Voir aussi
- Tomcat
- Tomcat (SSL)
- OWASP : https://owasp.org/