Six en-têtes HTTP de sécurité à activer sur votre site
Quelques lignes de configuration serveur suffisent à bloquer une grande partie des attaques courantes. Voici lesquelles, et comment les ajouter sans rien casser.
L'équipe Codanalyst
3 min de lecture
Sommaire
Chaque fois qu'un navigateur charge une page, le serveur lui envoie, avant le contenu, une série d'en-têtes HTTP. Certains d'entre eux ne servent qu'à une chose : dire au navigateur comment se protéger. Ils ne coûtent rien, ne ralentissent pas le site, et pourtant une grande partie des sites que nous analysons n'en active aucun.
Voici les six qui comptent, avec la configuration à copier pour Nginx. Les équivalents Apache suivent le même principe avec la directive Header always set.
Strict-Transport-Security (HSTS)
Votre site est en HTTPS, très bien. Mais lors d'une toute première visite, ou si quelqu'un tape l'adresse sans https://, la connexion commence parfois en HTTP, en clair. HSTS indique au navigateur de ne plus jamais utiliser autre chose que HTTPS pour votre domaine.
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Content-Security-Policy (CSP)
C'est le plus puissant, et le plus délicat. La CSP liste les sources autorisées pour les scripts, les styles, les images ou les polices. Si un attaquant parvient à injecter un script dans votre page (une faille XSS), le navigateur refusera de l'exécuter parce qu'il ne vient pas d'une source autorisée.
Une politique de départ raisonnable :
add_header Content-Security-Policy "default-src 'self'; img-src 'self' data: https:; script-src 'self'; style-src 'self' 'unsafe-inline'; frame-ancestors 'self'" always;
La bonne méthode consiste à commencer en mode observation avec l'en-tête Content-Security-Policy-Report-Only. Le navigateur signale alors ce qu'il aurait bloqué, sans rien bloquer. Vous ajustez la liste, puis vous passez en mode strict.
X-Content-Type-Options
Certains navigateurs essaient de deviner le type d'un fichier à partir de son contenu, même quand le serveur annonce autre chose. Un fichier texte envoyé par un utilisateur peut alors être interprété comme un script. Une seule valeur existe, et elle règle le problème :
add_header X-Content-Type-Options "nosniff" always;
Protection contre l'intégration en iframe
Sans protection, n'importe quel site peut afficher le vôtre dans un cadre invisible et pousser vos visiteurs à cliquer sans le savoir (le « clickjacking »). La directive frame-ancestors de la CSP, vue plus haut, s'en charge. Pour les navigateurs anciens, on la double avec :
add_header X-Frame-Options "SAMEORIGIN" always;
Referrer-Policy
Quand un visiteur clique sur un lien sortant, son navigateur transmet par défaut l'adresse de la page d'où il vient. Si cette adresse contient un identifiant, un jeton ou des paramètres de recherche, ils partent avec. Cette valeur ne transmet que le nom de domaine aux sites externes :
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
Permissions-Policy
Caméra, micro, géolocalisation : la plupart des sites n'en ont aucun besoin. Les désactiver empêche qu'un script tiers compromis y accède.
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
Comment vérifier que tout est en place
Ouvrez les outils de développement de votre navigateur, onglet Réseau, rechargez la page et cliquez sur la première requête : les en-têtes de réponse s'affichent. Pensez au mot-clé always dans Nginx, sans lequel les en-têtes disparaissent sur les pages d'erreur.
Codanalyst contrôle ces six en-têtes sur chaque page analysée et signale ceux qui manquent, avec la ligne de configuration à ajouter pour votre serveur. Faites le test sur votre site, le résultat tombe en moins d'une minute.