Problématique :
En fonction des modules chargés et de sa configuration, un serveur apache retourne des en-têtes HTTP ("HTTP headers") lorsqu’il répond à une requête.
Voir https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Response_message pour plus de précisions
Un certain nombre de ces réponses sont utiles voire indispensables pour un échange optimal des données entre le serveur et le navigateur : voir les outils de "mesure" de l’optimisation des sites tels que Google page speed ou Dareboost par exemple.
Quelques amélioration des en-têtes HTTP d’un serveur apache 2.4 ayant la configuration "de base" Debian sont donc possibles.
La consultation de ces en-têtes de réponse est possible avec les outils de développement intégrés dans Firefox, onglet "Réseau"
1. Configuration des modules d’apache :
A priori ici on essaye au maximum de faire des configurations pour l’ensemble du serveur : on utilisera donc les fichiers chargés par apache et ses modules.
Pour une distrib Debian 9 "de base", ces fichiers sont donc situés :
- pour apache le fichier de configuration par défaut est : /etc/apache2/apache2.conf
- pour les modules ce sont les fichiers nom-du-module.conf dans /etc/apache2/mods-available/.
Pour mémoire, un module présent dans /etc/apache2/mods-available/ n’est activé pour apache que si il y a un lien symbolique qui pointe sur lui dans /etc/apache2/mods-enable/.
En ligne de commande pour activer un module :
- sudo a2enmod nom-du-module
et pour le désactiver :
- sudo a2dismod nom-du-module
Pour configurer un module, en général il suffit d’éditer le fichier nom-du-module.conf :
- sudo nano /etc/apache2/mods-avalaible/nom-du-module.conf
2. Optimisations possibles :
- Ajouter le mime-type des polices usuelles en @font-face ainsi que celui des fichiers SVG :
Module concerné : mod_mime et son fichier de configuration mime.conf
on va ajouter les lignes suivantes pour activer le mime-type de fichiers de police woff, woff2... [1] ainsi que ceux des dessins vectoriels SVG qui font une entrée en force dans les éléments graphiques du web moderne :- # ajout du mime-type pour les SVG
- AddType image/svg+xml svg
- AddType image/svg+xml svgz
- # ajout du mime-type pour les polices font-face
- AddType font/ttf .ttf
- AddType font/eot .eot
- AddType font/otf .otf
- AddType font/woff .woff
- AddType font/woff2 .woff2
- Ajouter la compression des SVG :
Module concerné : mod_deflate et son fichier de configuration deflate.conf
ajout de la ligne :- # ajout de svg
- AddOutputFilterByType DEFLATE image/svg+xml
- Optimiser la mise en cache des fichiers compressés : ajout de l’en-tête Vary : Accept-Encoding :
(cf https://blog.stackpath.com/accept-encoding-vary-important)
Module concerné : mod_headers : ce module n’ayant pas de fichier de configuration par défaut, on peut le créer :- sudo nano /etc/apache2/mods-avalaible/headers.conf
et ajouter le contenu suivant dedans :
- <IfModule mod_headers.c>
- <FilesMatch ".(js|css|xml|gz|html|svg)$">
- Header append Vary: Accept-Encoding
- </FilesMatch>
- </IfModule>
Il suffit ensuite d’activer ce nouveau fichier avec :
- sudo a2enmod headers
- tant qu’on y est on d’enrichir la configuration du module mod_headers, on peut en profiter pour ajouter une série d’en-têtes de sécurité :
- le blocage du chargement des pages web de ce serveur dans des frames ou iframe d’un autre site ("clickjacking") :
- imposer le HTTPS (HSTS)
- le blocage en cas de problème XSS
Ce qui donne dans headers.conf l’ajout du contenu suivant :
- <IfModule mod_headers.c>
- Header always set X-FRAME-OPTIONS "DENY"
- Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
- Header always set X-Content-Type-Options "nosniff"
- Header always set X-XSS-Protection "1; mode=block"
- </IfModule>
Pour rendre opérationnelles ces modifications de configuration il ne reste plus qu’à tester et recharger la configuration du serveur apache :
- sudo apachectl configtest # doit retourner: Syntax OK
- sudo systemctl restart apache2.service
3. Complément pour chaque vitualhost : l’en-tête "Content-Security-Policy" (CSP) :
Si l’on veut être complet dans l’optimisation des en-têtes HTTP, il est nécessaire d’ajouter pour chaque virtualhost (soit dans son fichier de définition dans /etc/apache2/sites-avalaible/nom-du-site.tld.conf soit dans un fichier .htaccess à la racine du document-root) un en-tête de type "Content-Security-Policy" (CSP) permettant la mise en place d’une politique de sécurité qui va expliciter au navigateur web les serveurs qui sont autorisés à délivrer des ressources pour former la page :
Dans les 2 cas le fichier devra contenir quelque chose du genre :
- # en-tête HTTP "Content-Security-Policy" (CSP)
- <IfModule mod_headers.c>
- Header set Content-Security-Policy "base-uri 'self'; object-src 'none'; script-src 'self' https://mon-serveur-annexe.tld"
- </IfModule>
ici on n’autorise que le serveur du site web et mon-serveur-annexe.tld comme sources de script.
4. Références pour les en-têtes CSP :
- Site de référence : https://content-security-policy.com/
- des explications plus complètes : https://www.html5rocks.com/en/tutorials/security/content-security-policy/
- un outil de test : https://observatory.mozilla.org/
- un autre outil de test (permet de choisir la version de CSP) : https://csp-evaluator.withgoogle.com/
- deux exemples commentés :
- Sur seenthis :