HSTS et en-têtes de sécurité pour votre site web
À chaque page, votre serveur web envoie des en-têtes (headers) : de courtes lignes contenant des instructions pour le navigateur. Elles déterminent en partie le niveau de sécurité avec lequel le navigateur traite votre site. Vous découvrirez ici ce qu'est HSTS, quels sont les autres en-têtes de sécurité et comment les configurer et les tester.
Votre site doit d'abord disposer d'un certificat fonctionnel et rediriger les visiteurs vers https. Pour cela, consultez Activer et renouveler un certificat SSL et résoudre les problèmes et Rediriger obligatoirement les visiteurs vers https.
À quoi sert HSTS ?
La redirection vers https présente un point faible : la première requête via http n'est pas encore chiffrée. Une personne connectée au même réseau, par exemple sur un wifi public, peut intercepter cette requête. HSTS (HTTP Strict Transport Security) résout ce problème. Votre site envoie via https l'en-tête suivant :
Strict-Transport-Security: max-age=31536000
Le navigateur retient alors qu'il ne peut ouvrir votre site que via https. Si un visiteur saisit plus tard http://, le navigateur le transforme lui-même en https, avant même que quoi que ce soit ne transite sur le réseau. Le navigateur ignore un en-tête HSTS reçu via une simple connexion http.
| Élément | Signification |
|---|---|
max-age | Durée pendant laquelle le navigateur retient l'instruction, en secondes. Le test d'internet.nl considère qu'au moins un an (31536000) est suffisant. |
includeSubDomains | S'applique également à tous les sous-domaines, comme shop.votredomaine.nl et mail.votredomaine.nl. |
preload | Vous demandez l'inscription sur la liste intégrée aux navigateurs (hstspreload.org). Même la toute première visite est alors protégée. Cela nécessite notamment une durée d'un an, includeSubDomains et https sur tous les sous-domaines. En sortir prend beaucoup de temps. |
max-age=0 | Efface l'instruction mémorisée, lors de la prochaine visite via https. |
includeSubDomains, cela vaut aussi pour chaque sous-domaine, comme une ancienne page de caméra ou d'imprimante sans certificat. Procédez donc progressivement : commencez avec un max-age court, par exemple un jour (86400), vérifiez que tout fonctionne, puis augmentez par étapes jusqu'à un an.HSTS chez WebOké
Sur la plupart de nos serveurs, le serveur web envoie HSTS par défaut pour chaque site web ouvert via https : Strict-Transport-Security: max-age=31536000. Cela correspond à un an, sans includeSubDomains et sans preload. Vous n'avez rien à faire pour cela. Sur quelques serveurs, cette option n'est pas activée par défaut ; vous devez alors l'activer vous-même. Pour savoir si votre site envoie déjà HSTS et avec quel max-age, consultez les outils de développement de votre navigateur ou le test d'internet.nl (voir ci-dessous).
L'interrupteur HSTS dans DirectAdmin
Dans DirectAdmin, accédez à Domain Setup et cliquez sur votre nom de domaine. Si Secure SSL est activé, vous verrez à côté de HSTS l'interrupteur Enable HTTP Strict Transport Security. Cliquez ensuite sur Save pour enregistrer. La procédure détaillée est décrite dans Toujours rediriger les visiteurs vers https.
Si votre site envoie déjà HSTS, vous n'avez pas besoin de cet interrupteur. Activez-le uniquement si votre site n'envoie pas encore HSTS. Configurez HSTS à un seul endroit : dans DirectAdmin ou dans .htaccess, pas les deux. Si le navigateur reçoit deux en-têtes HSTS, il n'utilise que le premier.
Les autres en-têtes de sécurité
| En-tête | Protège contre | Valeur de départ |
|---|---|---|
X-Content-Type-Options | Le navigateur devine lui-même la nature d'un fichier, si bien qu'une « image » téléversée peut être exécutée comme un script. | nosniff (la seule valeur valide) |
Content-Security-Policy: frame-ancestors ou X-Frame-Options | Le clickjacking : un autre site charge votre page de manière invisible dans un cadre, de sorte que les visiteurs cliquent sur vos boutons à leur insu. | frame-ancestors 'self', ou l'ancien en-tête X-Frame-Options: SAMEORIGIN |
Referrer-Policy | Lors d'un clic vers un autre site, le navigateur transmet l'adresse de la page précédente, contenant parfois un terme de recherche ou un numéro de commande. | strict-origin-when-cross-origin, ou plus strict same-origin ou no-referrer. Internet.nl ne considère comme bonnes que les valeurs strictes. |
Permissions-Policy | Détermine quelles fonctions du navigateur votre page et les cadres intégrés peuvent utiliser, comme la caméra, le microphone et la localisation. | camera=(), microphone=(), geolocation=() désactive ces trois fonctions. Si votre site utilise l'une d'elles, retirez-la. |
Content-Security-Policy (complet) | Limite les emplacements depuis lesquels les scripts, styles et images peuvent être chargés. Cela rend l'injection de scripts malveillants (XSS) beaucoup plus difficile. | Sur mesure pour chaque site. Évitez unsafe-inline, unsafe-eval et les caractères génériques (wildcards). |
Configuration dans .htaccess
Placez ces lignes en haut du fichier .htaccess dans le dossier public_html de votre domaine. Faites d'abord une copie du fichier.
<IfModule mod_headers.c> Header always set X-Content-Type-Options "nosniff" Header always set Content-Security-Policy "frame-ancestors 'self'" Header always set Referrer-Policy "strict-origin-when-cross-origin" Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()" # Uniquement si votre site n'envoie pas encore HSTS (voir ci-dessus) : # Header always set Strict-Transport-Security "max-age=31536000" </IfModule>
N'ajoutez includeSubDomains que si vous êtes certain que chaque sous-domaine dispose de https. Si vous utilisez WordPress, vous pouvez également configurer les en-têtes à l'aide d'une extension. Choisissez une extension reconnue et toujours mise à jour, et configurez chaque en-tête à un seul endroit : dans l'extension ou dans .htaccess.
Content-Security-Policy-Report-Only. Celui-ci ne bloque rien, mais affiche dans la console du navigateur ce qui serait bloqué. En cas de doute, confiez cette tâche à votre développeur web, ou commencez uniquement par frame-ancestors.Sur un VPS avec nginx ou Caddy
Sur un VPS, vous n'utilisez pas DirectAdmin et souvent pas non plus de .htaccess. Vous configurez alors les en-têtes dans les paramètres de votre serveur web. Aucun des deux n'envoie HSTS ni ces en-têtes automatiquement.
nginx : dans le bloc server pour le port 443 :
add_header Strict-Transport-Security "max-age=31536000" always; add_header X-Content-Type-Options "nosniff" always; add_header Content-Security-Policy "frame-ancestors 'self'" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always;
Avec always, les en-têtes sont également envoyés avec les pages d'erreur. Attention : si un bloc location contient lui-même un add_header, les règles du bloc server ne s'appliquent plus à cette location. Répétez-les alors à cet endroit, ou placez-les dans un fichier distinct que vous insérez partout avec include. Testez la configuration avec nginx -t et chargez-la avec systemctl reload nginx.
Caddy : dans le bloc de votre site dans le Caddyfile :
header {
Strict-Transport-Security "max-age=31536000"
X-Content-Type-Options "nosniff"
Content-Security-Policy "frame-ancestors 'self'"
Referrer-Policy "strict-origin-when-cross-origin"
}
Chargez la modification avec systemctl reload caddy. Pour la mise en place d'un site avec nginx ou Caddy, consultez nginx avec un certificat Let's Encrypt et Caddy : un site web avec https automatique dans le guide VPS.
Tester
- Internet.nl : saisissez votre domaine dans le test de site web sur internet.nl.
- Votre navigateur : ouvrez votre site, appuyez sur F12 (ou choisissez Inspecter), accédez à l'onglet Réseau, rechargez la page et cliquez sur la première requête. Sous En-têtes de réponse (Response Headers), vous voyez tout ce que votre serveur envoie.
- La ligne de commande :
curl -sI https://votredomaine.nl/affiche les en-têtes.
Après chaque modification, vérifiez que votre site, vos formulaires et votre page de paiement fonctionnent toujours. Veillez également à maintenir à jour votre CMS, vos extensions et vos thèmes. Consultez Sécuriser wp-login.php de WordPress.
Pour aller plus loin
- MDN : Strict-Transport-Security (anglais)
- MDN : Content-Security-Policy (anglais)
- MDN : Permissions-Policy (anglais)
- Liste de préchargement HSTS (anglais)
Envie d'en savoir plus ? Suivez le cours gratuit Sécurité en ligne pour les entrepreneurs, leçon 4.2 Votre site web : https, HSTS et en-têtes de sécurité, ou le cours gratuit WordPress, leçon 7.4 Renforcer la sécurité du site : droits, en-têtes et extensions de sécurité.
