Outils pour utilisateurs

Outils du site


tutoriels:tomcat

TOMCAT : Serveur d'applications Java

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.

Apache Tomcat

Les prérequis de Tomcat

  • Java JDK (qui inclue le JRE)
  • Définir les variables d'environnement :

JAVA_HOME                     C:\Program Files\Java\jdk1.6.0_04
CATALINA_HOME                 C:\tomcat

  • Ajouter au PATH, les exécutable de Tomcat :

PATH                          C:\tomcat\bin

JDK: Java Development Kit
JRE: Jara Runtime Environment

Arborescence de tomcat

Arborescence Tomcat

  • logs : rassemble les logs du serveur applicatif (catalina%date%.log)
  • conf : configuration du serveur (server.xml tomcat-users.xml)

Configuration du serveur tomcat

La configuration du serveur repose sur le fichier conf/server.xml.

Tomcat Java

Détails des paramètres du server.xml

Directive Server

<Server port="8005" shutdown="ETEINDRE_TOMCAT_NOW">

  • L'instance globale de tomcat écoute sur le port 8005 uniquement en local.
  • La directive shutdown renseigne une chaine de caractères qui commande l'arrêt de l'instance

:!: A personnaliser (par défaut: “SHUTDOWN”)

Directive Service

  <Service name="Tomcat5">

  • Définit le nom du service.
  • Plusieurs services sont possibles dans un élément Server avec des noms distincts.
Directive Connector

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" />

  • maxHttpHeaderSize: taille maximale de la taille du header HTTP
  • maxThreads: nombre maximum de threads que le connecteur accepte
  • minSpareThreads: nombre de threads créés dans le pool au démarrage du serveur tomcat
  • maxSpareThreads: nombre maximum de threads inactifs dans le pool de threads
  • enableLookups: demande à tomcat de remplacer l'P par le nom d'hôte du client (FALSE en prod)
  • redirectPort: difinit le port du connector SSL pour les requêtes clients HTTPS
  • acceptCount: definit le nombre de requêtes clients possibles en file d'attente
  • connectionTimeout: définit le timeout pour le traitement d'une requête en file d'attente
  • disableUploadTimeout: definit le timeout d'un upload de fichier

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" />

  • Générez un certificat SSL pour le connecteur HTTPS:

"%JAVA_HOME%"\bin\keytool -genkey -alias tomcat -keyalg RSA

TOMCAT certificat

Le connecteur AJP port 8009

    <Connector port="8009" 
               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

Directive Host

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">

  • appBase: définit le dossier physique du host
  • unpackWARs: décompresse automatiquement les applications compressées (.war)
  • autoDeploy: déploiement automatique à chaud de l'application (FALSE en prod)
Directive context

Représente une application Web déployée dans tomcat.
2 contextes possibles:

  • explicitement déclarés par la directive context
  • créé en mémoire au démarrage de tomcat pour toutes les applications présentes dans le “appBase” du <st>

	<Context docBase="/TDCoursDeploiement" path="/TP1"
	 reloadable="false" swallowOutput="true">
	</Context>

  • docBase: référence au répertoire ou war de l'application
  • path: indique le chemin de contexte d'une application Web (URL unique qui commence par /)
  • reloadable: active une suveillance de /WEB-INF/lib /WEB-INF/classes (modif à chaud) (FALSE en prod)
  • swallowOutput: permet de rediriger les fluxs dans le journal lié à cette application
Directive Valve

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.

  • Une Valve peut-être appliqué sur les balises <Engine>,<Host> et <Context>

Filtre Tomcat

  • Liste des classNames dispo:

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 &quot;%r&quot; %s %b" />		
		</Context>
</Host>

Gestion de l'authentification sous Tomcat

Authentification utilisateurs Tomcat

Introduction

Définition de l'authentification

- Dans le fichier web.xml de l'application (le dev définit partie publique/privée)

Comment le serveur retourne l'authentification

- Le serveur renvoie un code 401 (Unauthorized) + mode d'authentification (BASIC encodage64 / DIGEST md5 / FORM formulaire)

Base de comptes utilisateurs possibles

- fichier xml
- base de donnée
- active directory

Type de Realms possible dans Tomcat

- 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)

  • Les bases utilisateurs sont renseignés dans le server.xml au moyen de la balise <Realm>
  • Un Realm de définit sur les balises <Engine>,<Host> et <Context>

Exemple:

  • Définition de l'authentification BASIC dans le web.xml de l'application :

<!-- 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>

  • Définition de l'authentification par fichier XML dans les ressources globales du server.xml :

<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" />

  • Lien de l'authentification sur l'objet dans le server.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"/>

Cryptage des passwords sur le serveur

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:

  • Pour crypter les password en SHA ou MD5, utilisation du script digest.bat :

digest.bat -a sha password
	password:5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

  • Renseigner le user et son password cryté dans la base utilisteur:

<user username="user3" password="5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8" roles="admins"/>

  • Modifier le Realm au niveau du Context pour utiliser le mode digest

<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
            resourceName="MyDatabase" 
	digest="sha" />

Tomcat digest.bat

Journalisation avancée de Tomcat

Tomcat analyse

La journalisation est réalisée par la bibliothèque jakarta.commons.logging.

Le fichier de configuration de la journalisation: conf/logging-properties
  • Un journal est définit par 2 parties :

- le handler (définition des attributs)
- le logger (définition du fichier et du level)

  • Le logger se place en respectant la hiérarchie de l'élément à journaliser :

org.apache.catalina.core.ContainerBase.[Engine].[Host].[/Context] Exemple:

  • Définition du handler:

# 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

RequestDumperValve

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" />

Ajouter le tomcat admin et le tomcat manager:

Admin & Manager Tomcat

  • Récupérer le tomcat-admin correspondant à votre version:

apache-tomcat-5.5.27-admin.zip

  • Dézipper l'archive et Copier le fichier admin.xml dans la configuration de Tomcat:

copy C:\tomcat\apache-tomcat-5.5.27\conf\Catalina\localhost\admin.xml C:\tomcat\conf\Catalina\localhost\admin.xml

  • Copier l'application dans le répertoire du connecteur:

copy C:\tomcat\apache-tomcat-5.5.27\server\webapps\admin C:\tomcat\server\webapps\admin

  • Renseigner un manager dans le fichier des utilisateurs tomcat:

<?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>

  • Redémarrer le serveur:

cd C:\tomcat\bin
shutdown.bat
startup.bat

  • Voici une extrait de l'interface du tomcat manager:

Tomcat manager

  • Voici un extrait de l'interface du tomcat admin:

Tomcat admin

Serveur Web frontal devant le gestionnaire d'application Tomcat

Tomcat architecture

Dans la plupart des architectures actuelles et à des fins de sécurité, le serveur d'applications est couvert par un serveur Web frontal.

  • On utilise dasn cette configuration le connecteur AJP port 8009 par défaut

    <Connector port="8009" 
               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

Frontal Web Apache

Il faudra installer le module JK pour linker la partie dynamique sur Tomcat.
Tutoriel approuvé : ici

Frontal Web IIS

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

Tomcat

tutoriels/tomcat.txt · Dernière modification: 15/04/2016 à 21:15 (modification externe)

Outils de la page