Lavagna sous Apache : Différence entre versions
m |
(Aucune différence)
|
Version actuelle en date du 4 mai 2018 à 11:41
Cet article présente la configuration mise en place sur un serveur Apache
pour une instance de Lavagna
.
Sommaire
Votre avis
Nobody voted on this yet
|
|
Etude
Avant de mettre en place la configuration Apache
, il est nécessaire de bien comprendre le fonctionnement de Lavagna
. C'est une application J2EE qui est déployée sous un serveur d'application, par défaut Jetty
. Dans le cadre de cette installation, le war est déployé sous un serveur Tomcat
.
De plus, Lavagna
utilise la technologie des Websockets
afin de mettre à jour l'interface en temps réel. Ce qui veut dire que la configuration Apache
n'est pas une simple redirection avec le mode Proxy. Et pour cette installation, le serveur Apache
sert plusieurs applications qui ne sont pas nécessairement sous le serveur Tomcat
où est hébergé Lavagna
.
Déploiement site sécurisé
La procédure décrite ci dessous permet de mettre à disposition l'application avec un accès sécurisé HTTPS
avec utilisation d'un certificat fourni par Let's Encrypt et un tutoriel très bien réalisé.
L'application sera rendue disponible depuis un sous domaine du domaine principal.
Pour rappel, l'application est exécutée sous Tomcat
avec la racine lavagna
.
Préparation environnement
Certbot sera utilisé pour demander et renouveler le certificat du site. Dans son fonctionnement, le process essaye d'accéder à un .well-known
à la racine du site. De plus, une bonne pratique consiste à fournir un répertoire racine pour les sites déployés sous Apache
. Le répertoire /var/www/lavagna
est alors créé, ainsi que le sous répertoire .well-known
.
#sudo mkdir -p /var/www/lavagna/.well-known
Pour cette application, il n'est pas nécessaire de placer un fichier index.html
, avec un contenu vide, dans le répertoire racine, soit /var/www/lavagna
, car la racine sera sur l'instance qui possède déjà un fichier index.html
.
Un fichier robots.txt
y est placé avec les directives indiquant aux moteurs de recherche de ne rien indexer.
User-agent: *
Disallow: /
Les permissions mises en place donnent un accès uniquement aux compte du serveur, soit www-data
.
#sudo find /var/www/lavagna -type f -exec chmod 0600 {} \; #sudo find /var/www/lavagna -type d -exec chmod 0700 {} \; #sudo chown -R www-data:www-data /var/www/lavagna
Configuration HTTP
Dans un premier temps, une configuration temporaire est mise en place pour accéder de façon non sécurisé.
Un fichier lavagna
est créé dans le répertoire /etc/apache2/sites-available
avec le contenu suivant.
<VirtualHost *:80>
ServerAdmin contact-email@dummy.net
ServerName www.lavagna.dummy.net
DocumentRoot /var/www/lavagna
DirectoryIndex index.html
LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/lavagna_error.log
CustomLog ${APACHE_LOG_DIR}/lavagna_access.log combined
Header edit Location login\?reqUrl=%2Flavagna%2F login?reqUrl=%2F
Header edit Location ^/lavagna/ /
AllowEncodedSlashes NoDecode
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://localhost:8080/lavagna/$1 [P,L]
ProxyPreserveHost On
ProxyPass /.well-known !
ProxyPassReverse /.well-known !
ProxyPass /robots.txt !
ProxyPassReverse /robots.txt !
ProxyPass / http://localhost:8080/lavagna/
ProxyPassReverse / http://localhost:8080/lavagna/
ProxyPassReverseCookiePath /lavagna /
AddOutputFilterByType INFLATE;SUBSTITUTE;DEFLATE text/html
Substitute "s|<base href=\"/lavagna/\">|<base href=\"/\">|n"
</VirtualHost>
Les directives sur l'accès à /.well-known
et robots.txt
permettent de servir les éléments depuis la racine /var/www/lavagna
.
Toutes les directives Rewrite
permettent de rediriger les requêtes du type websocket
vers l'instance avec le protocole ws
.
Une première directive est mise en place pour modifier la valeur de Location
dans le Header
lors de l'accès à la page d'identification afin de supprimer la racine dans la redirection, paramètre reqUrl
. De plus, une deuxième directive est mise en place sur la valeur Location
pour remplacer /lavagna/
, correspondant à la racine de déploiement sous Tomcat
, par /
.
Une substitution est mise en place sur les fichiers au format text/html
afin de changer le code HTML
pour spécifier le base des liens. A noter, il est nécessaire de décompresser afin de remplacer le contenu, pour ensuite compresser le résultat, d'où l'instruction AddOutputFilterByType INFLATE;SUBSTITUTE;DEFLATE text/html
.
La directive AllowEncodedSlashes NoDecode
est nécessaire car l'application utilise des paramètres encodés dans les URLs.
Cette configuration doit être mise à disposition en plaçant un lien dans /etc/apache2/sites-enabled
.
#sudo ln -s /etc/apache2/sites-available/lavagna /etc/apache2/sites-enabled/008-lavagna.conf
Le nom du lien, à savoir 008-lavagna.conf
, respecte une incrémentation sur la machine utilisée, il peut être remplacé pour tout autre nom valide pour Apache
.
Il suffit de relancer la configuration d'Apache
pour qu'elle soit prise en compte.
#sudo apache2ctl graceful
Certificat
L'application est à présent disponible avec l'URL http://www.lavagna.dummy.net. Un certificat va être demandé à l'aide de Certbot.
#sudo certbot certonly --webroot -w /var/www/lavagna -d www.lavagna.dummy.net --email contact-email@dummy.net Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator webroot, Installer None Obtaining a new certificate Performing the following challenges: http-01 challenge for www.lavagna.dummy.net Using the webroot path /var/www/lavagna for all unmatched domains. Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/www.lavagna.dummy.net/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/www.lavagna.dummy.net/privkey.pem Your cert will expire on 2018-05-17. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
Le certificat est stocké dans le répertoire /etc/letsencrypt/live/www.lavagna.dummy.net/
.
Configuration HTTPS
Le certificat étant disponible, la configuration HTTPS
peut être mise en place.
Un fichier lavagna-dummy-ssl
est créé dans le répertoire /etc/apache2/sites-available
avec le contenu suivant.
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin contact-email@dummy.net
ServerName www.lavagna.dummy.net
DocumentRoot /var/www/lavagna
DirectoryIndex index.html
LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/lavagna_ssl_error.log
CustomLog ${APACHE_LOG_DIR}/lavagna_ssl_access.log combined
Header edit Location login\?reqUrl=%2Flavagna%2F login?reqUrl=%%2F
Header edit Location ^/lavagna/ /
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/www.lavagna.dummy.net/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.lavagna.dummy.net/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.lavagna.dummy.net/chain.pem
SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
<Directory /var/www/lavagna>
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>
AllowEncodedSlashes NoDecode
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://localhost:8080/lavagna/$1 [P,L]
ProxyPreserveHost On
ProxyPass /.well-known !
ProxyPassReverse /.well-known !
ProxyPass /robots.txt !
ProxyPassReverse /robots.txt !
ProxyPass / http://localhost:8080/lavagna/
ProxyPassReverse / http://localhost:8080/lavagna/
ProxyPassReverseCookiePath /lavagna /
AddOutputFilterByType INFLATE;SUBSTITUTE;DEFLATE text/html
Substitute "s|<base href=\"/lavagna/\">|<base href=\"/\">|n"
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
</VirtualHost>
</IfModule>
A noter les deux directives RequestHeader
pour X-Forwarded-Proto
et X-Forwarded-Port
. Ceci fait suite à la recommandation pour d'autres applications.
La modification de la valeur Location
dans le Header
est complétée pour forcer le protocole http
en https
lors des redirections, essentiellement lors de l'authentification.
Attention, les directives Rewrite
continuent de rediriger les demandes vers ws://localhost
et ne sont pas passées en wss
.
Cette configuration doit être mise à disposition en plaçant un lien dans /etc/apache2/sites-enabled
.
#sudo ln -s /etc/apache2/sites-available/lavagna-dummy-ssl /etc/apache2/sites-enabled/009-lavagna-ssl.conf
Le nom du lien, à savoir 009-lavagna-ssl.conf
, respecte une incrémentation sur la machine utilisée, il peut être remplacé pour tout autre nom valide pour Apache
.
Enfin la configuration HTTP
, sur le port 80
, est modifiée pour forcer la redirection sur l'accès en HTTPS
. Le précédent fichier lavagna
est modifié avec lu contenu suivant.
<VirtualHost *:80>
ServerAdmin contact-email@dummy.net
ServerName www.lavagna.dummy.net
DocumentRoot /var/www/lavagna
DirectoryIndex index.html
LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/lavagna_error.log
CustomLog ${APACHE_LOG_DIR}/lavagna_access.log combined
RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>
Il suffit de relancer la configuration d'Apache
pour que les modifications soient prises en compte.
#sudo apache2ctl graceful
Configuration simple
Ce mode de configuration permet de mettre à disposition l'application dans une configuration de site existant, en s'inspirant de celle de Mediawiki par exemple.
Par contre, les modes présentés ne mettent pas en évidence l'utilisation de certificat et sont effectué sur des accès HTTP
simple.
La configuration mise en place est la suivante.
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/default
DirectoryIndex index.php index.htm index.html
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://localhost:8080/$1 [P,L]
ProxyPass /lavagna http://localhost:8080/lavagna
ProxyPassReverse /lavagna http://localhost:8080/lavagna
<Proxy http://localhost:8080/lavagna>
Order allow,deny
Allow from all
</Proxy>
</VirtualHost>
Les premières instructions permettent de mettre en place la redirection des appels Websockets
. Dans le cas d'une demande en mode Upgrade
avec le protocole websocket
, l'argument NC
permet de faire la comparaison insensible à la casse, l'appel est redirigé vers ws://localhost:8080/$1
.
Les deuxième instructions ont été mises en commentaire pour éviter que tous les appels doit dirigés vers le serveur Tomcat
. Les redirections vers l'instance Lavagna
sont mises en place à l'aide des instructions ProxyPass
et ProxyPassReverse
.
Attention ceci ne fonctionne que si il n'y a que l'application Lavagna
, utilisant les Websockets
, qui est exposée sur ce serveur.
Voir Aussi
Discussion ayant permis de trouver la solution : http://stackoverflow.com/questions/27526281/websockets-and-apache-proxy-how-to-configure-mod-proxy-wstunnel La configuration ayant été utile est la suivante.
<VirtualHost *:80>
ServerName www.domain2.com
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://localhost:3001/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) http://localhost:3001/$1 [P,L]
ProxyPassReverse / http://localhost:3001/
</VirtualHost>
Documentation Apache : https://httpd.apache.org/docs/current/fr/rewrite/flags.html
Ticket GitHub : https://github.com/digitalfondue/lavagna/issues/46