Skip to content

Installation de Ewt sur une instance Tomcat sur Linux

Introduction

Il décrit comment installer Ewt sur Apache Tomcat sur une machine linux de type Debian ou Ubuntu. Ce document va plus loin que la simple mise en place d'un serveur Tomcat. Il présente également comment installer et configurer un serveur web en tant que reverse proxy et comment sécuriser le serveur au moyen de solutions de base.

Système

On commence par mettre à jour la machine linux.

$ sudo apt-get update -y && sudo apt-get upgrade -y

Java

Java est nécessaire pour faire fonctionner Ewt. Ici nous partons du principe que java n'est pas installé. Dans le cas contraire, vous pouvez sauter cette étape.

$ sudo apt install default-jdk

Tomcat

Dans cette leçon, nous allons utiliser tomcat 9.5. À l'heure où ces lignes sont écrites, la dernière version en date de tomcat est la version 9.0.90.

$ cd
$ wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.90/bin/apache-tomcat-9.0.90.tar.gz
$ sudo mkdir -p /opt/tomcat
$ sudo tar -xzvf apache-tomcat-9.0.90.tar.gz -C /opt/tomcat --strip-components=1

Pour des raisons de sécurité, nous allons limiter les droits du user qui exécutera Tomcat. Nous commençons donc pas créer un user "tomcat".

$ sudo useradd -m -d /opt/tomcat -U -s /bin/false tomcat
$ sudo chown -R tomcat:tomcat /opt/tomcat/
$ sudo chmod -R u+x /opt/tomcat/bin

Nous allons faire en sorte que Tomcat démarre en tant que service. En premier lieu, nous devons déterminer à quel emplacement est installé java. La procédure pour obtenir le path de java est donnée dans la note ci-dessous.

Obtenir le path de la jdk

Pour déterminer le path de la jdk, utilisez la commande suivante:

$ ls -al /etc/alternatives/java

Cela indique le vrai emplacement de la jdk. Faites-une copie du répertoire contenant le dossier "bin". Par exemple, si la commande vous affiche ceci:

lrwxrwxrwx 1 root root 43 Apr 22 12:26 /etc/alternatives/java -> /usr/lib/jvm/java-17-openjdk-amd64/bin/java

le path à retenir est /usr/lib/jvm/java-17-openjdk-amd64.

Si la commande ls ci-dessus génère une erreur, vous pouvez tenter d'obtenir le path de la jdk avec la commande suivante:

$ sudo update-alternatives --config java

Si cela ne donne toujours rien, tentez avec la commande which puis suivez les éventuels liens symboliques jusqu'à arriver à l'exécutable java.

$ which java
/usr/bin/java
$ ls -al /usr/bin/java
lrwxrwxrwx 1 root root 22 Apr 22 12:26 /usr/bin/java -> /etc/alternatives/java
$ ls -al /etc/alternatives/java
lrwxrwxrwx 1 root root 43 Apr 22 12:26 /etc/alternatives/java -> /usr/lib/jvm/java-17-openjdk-amd64/bin/java
$ ls -al /usr/lib/jvm/java-17-openjdk-amd64/bin/java
-rwxr-xr-x 1 root root 14392 Apr 22 12:26 /usr/lib/jvm/java-17-openjdk-amd64/bin/java

Créez le fichier de service avec la commande suivante:

$ nano /etc/systemd/system/tomcat.service

Coller les lignes suivantes dans le fichier et adaptez les chemins ainsi que les quantités de mémoire que vous souhaitez allouer à la JVM et éventuellement la timezone (retirer la propriété si vous souhaitez que l'application fonctionne en heures UTC).

[Unit]
Description="Tomcat Service"
After=network.target

[Service]
Type=forking

Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
Environment="CATALINA_BASE=/opt/tomcat"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
Environment="JAVA_OPTS=-Djava.awt.headless=true \
                       -Djava.security.egd=file:///dev/urandom \
                       -Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8 \
                       -Dorg.apache.catalina.connector.URI_ENCODING=UTF-8 \
                       -Duser.timezone=Europe/Zurich \
                       -Dlog4j2.configurationFile=/opt/tomcat/conf/log4j2.xml \
                       -Djava.locale.providers=COMPAT"
Environment="EWT_APPLICATION_ROOT_PATH=/opt/ewt/"
#Environment="EWT_ENCRYPT_PASSWORD=<enter-valid-encryption-key"
#Environment="EWT_FOP_CONFIGFILE=/opt/tomcat/conf/fop/fop.xconf"

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

Sauvegardez et fermez le fichier puis démarrez le service tomcat avec la commande suivante:

$ sudo systemctl daemon-reload
$ sudo systemctl start tomcat

Vérifiez que le service a bien démarré.

$ systemctl status tomcat

Vérifiez que la commande mentionne que le service est "active (running)" et qu'il n'y a pas d'erreur. Le serveur Tomcat est donc accessible depuis un navigateur via l'adresse http://localhost:8080.

Vous pouvez activer le démarrage automatique du service au moyen de la commande suivante:

$ sudo systemctl enable tomcat

Installation Ewt

Nous allons à présent installer l'application Ewt sur Apache Tomcat.

À TERMINER

Apache

La suite de cette installation est optionnelle. Elle permet d'utiliser Apache Httpd en tant que reverse proxy pour accéder à l'application Ewt. Cela permet de limiter le nombre de ports à ouvrir sur le firewall et simplifie la mise en place d'une couche SSL. Il existe plusieurs façons de réaliser ce pont entre le serveur web et Tomcat. Nous en proposons deux dans la suite de ce document.

On commence par installer et démarrer le serveur web Apache.

$ sudo apt install apache2 -y
$ sudo systemctl start apache2 && sudo systemctl enable apache2 

On vérifie que le serveur fonctionne correctement. De la même façon que pour Tomcat plus haut, vérifier que le résultat de la commande indique que le serveur est "active (running)".

sudo systemctl status apache2

Mise en place du reverse proxy

$ cd /etc/apache2/sites-available/
$ sudo nano tomcat.conf

Coller le contenu suivant dans le fichier:

<VirtualHost *:80>
    ServerName my.domain.com
    DocumentRoot /opt/tomcat

    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
    <Location />
        Order allow,deny
        Allow from all
    </Location>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Sauvegardez et fermez le fichier.

Nous allons à présent activer le reverse proxy.

$ a2dissite 000-default.conf
$ sudo a2enmod rewrite
$ sudo a2ensite tomcat.conf
$ sudo a2enmod proxy
$ sudo a2enmod proxy_http

Vérifiez la syntaxe avec

$ apachectl -t

Le message Syntax OK devrait s'afficher. Redémarrez enfin le serveur apache avec la commande suivante:

$ sudo systemctl restart apache2

Nous commençons par configurer un connecteur AJP du côté Tomcat.

$ sudo nano /opt/tomcat/conf/server.xml

Repérez le bloc <Service name="Catalina"> et ajoutez la ligne suivante à l'intérieur de ce bloc (p.ex à la ligne juste au-dessous).

<Connector port="9081" protocol="AJP/1.3" secretRequired="false" redirectPort="8081"/>

Du moment que le serveur tomcat ne sera pas accessible en direct, vous pouvez en profiter pour désactiver le connecteur ouvert sur le port 8080. Pour ce faire, mettez en commentaire le bloc <Connector> qui est déclaré pour le port 8080.

Sauvegardez les modifications et fermez le fichier. Nous passons à présent à la configuration côté Apache:

$ sudo nano /etc/apache2/sites-enabled/000-default.conf

Ajoutez la ligne suivante juste avant la dernière ligne </VirtualHost> du fichier:

ProxyPass    /ewt   ajp://localhost:9081/ewt/

Ici le port doit correspondre au port déclaré dans le connecteur AJP. Sauvegarder les modifications et fermez le fichier.

$ sudo a2enmod proxy
$ sudo systemctl restart apache2

L'application Ewt devrait à présent être disponible au travers de l'url http://localhost/ewt/

Certificat

Il est recommandé d'installer un certificat SSL si vous installez un serveur ouvert sur l'extérieur. Cela implique que vous possédiez un nom de domaine pour le serveur.

Dans cet exemple, nous allons configurer notre serveur Apache pour qu'il s'appuie sur un certificat gratuit fourni par Let's Encrypt.

À TERMINER

SSH

Par défaut, le service ssh est ouvert sur le port 22. Une bonne pratique consiste à remplacer le port par défaut par un autre. Procédez ainsi:

$ sudo nano /etc/ssh/sshd_config

Repérez la ligne #Port 22. Retirez le # du début de ligne et modifiez la valeur du port. Vous pouvez utiliser n'importe quelle valeur comprise entre 1 et 65535, à l'exception des ports standards. Par exemple:

Port 34567

Sauvegardez la modification et fermez le fichier.

Il reste à redémarrer le service ssh (parfois le service peut être nommé sshd).

$ sudo systemctl restart ssh

Attention, ne fermez pas la console sur laquelle vous êtes connecté avant de faire un test de connexion avec une nouvelle console. Pensez à adapter spécifier le nouveau numéro de port dans votre commande ssh à l'aide du paramètre -p:

$ ssh -p 34567 mylogin@my.domain.com

Firewall

Il est recommandé d'activer un firewall et de limiter l'exposition du serveur. Pour ce faire, nous utilisons ufw. Dans les lignes ci-dessous, adaptez le port 22 si vous avez suivi les recommandations du chapitre précédent.

$ sudo apt install ufw -y
$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp
$ sudo ufw allow 22/tcp
$ sudo ufw enable

Faites un test de connexion ssh avant de fermer la console actuelle.