Apache Tomcat est un conteneur libre de servlets et JSP Java EE. Issu du projet Jakarta, Tomcat est un projet principal de la fondation Apache.
Tomcat implémente les spécifications des servlets et des JSP du Java Community Process1 . Il est paramétrable par des fichiers XML et de propriétés, et inclut des outils pour la configuration et la gestion. Il comporte également un serveur HTTP.
JAVA_HOME C:\Program Files\Java\jdk1.6.0_04 CATALINA_HOME C:\tomcat
PATH C:\tomcat\bin
JDK: Java Development Kit
JRE: Jara Runtime Environment
La configuration du serveur repose sur le fichier conf/server.xml.
<Server port="8005" shutdown="ETEINDRE_TOMCAT_NOW">
A personnaliser (par défaut: “SHUTDOWN”)
<Service name="Tomcat5">
Le connecteur HTTP port 8080
<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" />
Le connecteur HTTPS port 8443
<Connector port="8443" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" />
"%JAVA_HOME%"\bin\keytool -genkey -alias tomcat -keyalg RSA
<Connector port="8009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />
On peut dire que c'est l'équivalent des VirtualHost d'Apache :
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
Représente une application Web déployée dans tomcat.
2 contextes possibles:
<Context docBase="/TDCoursDeploiement" path="/TP1" reloadable="false" swallowOutput="true"> </Context>
Composant sous forme de classe Java qui est inséré dans le processus de traitement des requêtes. C'est plus simplement : un filtre de requête.
org.apache.catalina.valves.AccessLogValve
Génère un log des accès au serveur
org.apache.catalina.valves.JDBCAccessLogValve
Ecrire les logs des accès dans une base de données
org.apache.catalina.valves.RemoteAddrValve
Applique une restriction d'accès en fonction de l'IP
org.apache.catalina.valves.RemoteHostValve
Applique une restriction en fonction des noms d'hôtes
org.apache.catalina.valves.RequestDumperValve
Journalise le contenu des requêtes associés à l'objet filtré
org.apache.catalina.valves.authenticator.SingleSignOn
Permet l'authentification unique entre plusieurs applications
org.apache.catalina.valves.FastCommonAccessLogValve
Remplace AccesLogValve, + performant en production
Exemple:
<Host name="www.test.fr" appBase="MyApps" unpackWARs="false" autoDeploy="false" xmlValidation="false" xmlNamespaceAware="false"> <Context docBase="/TestAppli" path="/" reloadable="false" swallowOutput="true"> <!-- Journalisation de requêtes --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="test_acces_log" suffix=".txt" rotable="true" resolveHosts="false" pattern="%a - %U %t %{USER-AGENT}i "%r" %s %b" /> </Context> </Host>
- Dans le fichier web.xml de l'application (le dev définit partie publique/privée)
- Le serveur renvoie un code 401 (Unauthorized) + mode d'authentification (BASIC encodage64 / DIGEST md5 / FORM formulaire)
- fichier xml
- base de donnée
- active directory
- In-Memory Realm (fichier XML chargé en mémoire)
- JDBC Realm (utilisateurs stockés en BDD)
- DataSource Realm (utilisateur stockés en BDD par POOL de connexion JDBC)
- JNDI Realm (gestionnaire d'authentification annuaire LDAP)
- JAAS Realm (module authentification spécifique)
Exemple:
<!-- Définition de la partie privée du site - Accès authentifié --> <security-constraint> <display-name>Contraintes de sécurité</display-name> <web-resource-collection> <web-resource-name>Accès sécurisé</web-resource-name> <url-pattern>/FormulaireServlet</url-pattern> <url-pattern>/FormulaireHttps.jsp</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>admins</role-name> </auth-constraint> </security-constraint> <!-- Définition de la méthode d'authentification --> <login-config> <auth-method>BASIC</auth-method> <realm-name>Authentification BASIC</realm-name> </login-config> <security-role> <role-name>admins</role-name> </security-role>
<Resource name="MyDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/test-users.xml" />
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="MyDatabase"/> </file xml> * Création de l'utilisateur dans le fichier test-users.xml : <file xml> <role rolename="admins" description="Rôle des users authentifiés pour l'application"/> <user username="user1" password="password" fullName="Compte utilisateur membre du rôle admins" roles="admins"/>
Il est possible d'utiliser le cryptage MD5 ou SHA1.
Quoiqu'il arrive, un sniffer comme Wireshark sera en mesure de capter les passwords en clair sur le réseau.
Exemple:
digest.bat -a sha password password:5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
<user username="user3" password="5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8" roles="admins"/>
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="MyDatabase" digest="sha" />
La journalisation est réalisée par la bibliothèque jakarta.commons.logging.
- le handler (définition des attributs)
- le logger (définition du fichier et du level)
org.apache.catalina.core.ContainerBase.[Engine].[Host].[/Context] Exemple:
# Définition du handler handlers = ...,6www-helloworld-fr.org.apache.juli.FileHandler # Description des attributs du Handler 6www-helloworld-fr.org.apache.juli.FileHandler.level = ALL 6www-helloworld-fr.org.apache.juli.FileHandler.directory = ${catalina.base}/logs 6www-helloworld-fr.org.apache.juli.FileHandler.formatter = java.util.logging.SimpleFormatter 6www-helloworld-fr.org.apache.juli.FileHandler.prefix = www-helloworld-fr. # Définition de notre logger sur le host helloworld org.apache.catalina.core.ContainerBase.[Catalina].[www.helloworld.fr].[/].level = ALL org.apache.catalina.core.ContainerBase.[Catalina].[www.helloworld.fr].[/].handlers = 6www-helloworld-fr.org.apache.juli.FileHandler
- level : definit le niveau de journalisation (SEVERE,CONFIG,INFO,WARN,FINE,FINEST,ALL)
- directory : définit le dossier de stockage du log
- formatter : définit la classe Java utilisée pour formater le contenu du fichier
- prefix: définit le préfix du log
- level : definit le niveau de journalisation
- handlers : lie le logger à un handler
Pour logger toutes les requêtes en détails, on utilise la valve RequestDumperValve. Elle permet d'écrire le contenu des requêtes clients dans le journal associé à l'élément sur lequel le filtre est positionnée:
<Valve className="org.apache.catalina.valves.RequestDumperValve" />
apache-tomcat-5.5.27-admin.zip
copy C:\tomcat\apache-tomcat-5.5.27\conf\Catalina\localhost\admin.xml C:\tomcat\conf\Catalina\localhost\admin.xml
copy C:\tomcat\apache-tomcat-5.5.27\server\webapps\admin C:\tomcat\server\webapps\admin
<?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="manager"/> <role rolename="tomcat"/> <role rolename="admin"/> <role rolename="role1"/> <user username="both" password="tomcat" roles="tomcat,role1"/> <user username="role1" password="tomcat" roles="role1"/> <user username="tomcat" password="P@ssw0rd" roles="admin,manager"/> </tomcat-users>
cd C:\tomcat\bin shutdown.bat startup.bat
Dans la plupart des architectures actuelles et à des fins de sécurité, le serveur d'applications est couvert par un serveur Web frontal.
<Connector port="8009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />
Il faudra installer le module JK pour linker la partie dynamique sur Tomcat.
Tutoriel approuvé : ici
Il faudra installer la DDL pour rediriger les requêtes au moyen d'un filtre ISAPI vers le moteur d'application.
Il faut également créer les clés de registre adéquates.
Tutoriel approuvé : ici