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-moduleet pour le désactiver :
sudo a2dismod nom-du-modulePour 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.conf2. 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.confet 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.service3. 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 :

