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.