Tomcat (sécurisation)

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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