Optimisation des en-têtes HTTP pour apache 2.4

Configuration : avec l’arrivée des polices téléchargeables (@font-face) et du SVG pour remplacer les images bitmaps, la configuration de base du serveur apache livrée par Debian 9 n’est plus suffisante. Quelques optimisations possibles pour améliorer cette configuration.

, par clem

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

Examen des en-tête HTTP à l'aide des outils de développement de (...)

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 :

  1. sudo a2enmod nom-du-module

et pour le désactiver :

  1. sudo a2dismod nom-du-module

Pour configurer un module, en général il suffit d’éditer le fichier nom-du-module.conf :

  1. 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 :
    1.         # ajout du mime-type pour les SVG
    2.         AddType image/svg+xml svg
    3.         AddType image/svg+xml svgz
    4.  
    5.         # ajout du mime-type pour les polices font-face
    6.         AddType font/ttf .ttf
    7.         AddType font/eot .eot
    8.         AddType font/otf .otf
    9.         AddType font/woff .woff
    10.         AddType font/woff2 .woff2

    Télécharger

  • Ajouter la compression des SVG :
    Module concerné : mod_deflate et son fichier de configuration deflate.conf
    ajout de la ligne :
    1.         # ajout de svg
    2.         AddOutputFilterByType DEFLATE image/svg+xml

    Télécharger

  • 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 :
    1. sudo nano /etc/apache2/mods-avalaible/headers.conf

    et ajouter le contenu suivant dedans :

    1. <IfModule mod_headers.c>
    2.         <FilesMatch ".(js|css|xml|gz|html|svg)$">
    3.                 Header append Vary: Accept-Encoding
    4.         </FilesMatch>
    5. </IfModule>

    Télécharger

    Il suffit ensuite d’activer ce nouveau fichier avec :

    1. 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 :

  1. <IfModule mod_headers.c>
  2.         Header always set X-FRAME-OPTIONS "DENY"
  3.         Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
  4.         Header always set X-Content-Type-Options "nosniff"
  5.         Header always set X-XSS-Protection "1; mode=block"
  6. </IfModule>

Télécharger

Pour rendre opérationnelles ces modifications de configuration il ne reste plus qu’à tester et recharger la configuration du serveur apache :

  1. sudo apachectl configtest # doit retourner: Syntax OK
  2. sudo systemctl restart apache2.service

Télécharger

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 :

  1. # en-tête HTTP "Content-Security-Policy" (CSP)
  2. <IfModule mod_headers.c>
  3. Header set Content-Security-Policy "base-uri 'self'; object-src 'none';  script-src 'self' https://mon-serveur-annexe.tld"
  4. </IfModule>

Télécharger

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 :

Notes

[1nb : les types font/woff, font/woff2... ont étés officialisés en février 2017 par la RFCF8081