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 la manière dont le navigateur gère la sécurité de 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. Vous trouverez plus d'informations à ce sujet dans Activer, renouveler et résoudre les problèmes de certificat SSL et Rediriger obligatoirement les visiteurs vers https.
Que fait HSTS ?
La redirection vers https comporte un moment de faiblesse : la première requête via http transite encore sans chiffrement. Une personne présente sur le 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 cet en-tête via https :
Strict-Transport-Security: max-age=31536000
Le navigateur retient alors qu'il ne doit ouvrir votre site que via https. Si un visiteur saisit ensuite http://, le navigateur le convertit 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 du http simple.
| Élément | Signification |
|---|---|
max-age | Durée pendant laquelle le navigateur s'en souvient, 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 dans 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 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 par 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, ce n'est pas activé par défaut ; dans ce cas, vous l'activez 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).
Le commutateur HSTS dans DirectAdmin
Dans DirectAdmin, allez dans Domaines et cliquez sur votre nom de domaine. Si Connexion SSL sécurisée est activée, vous voyez le commutateur Activer HTTP Strict Transport Security au niveau de HSTS. Cliquez ensuite sur Modifier pour enregistrer. Vous trouverez la procédure détaillée étape par étape dans Toujours rediriger les visiteurs vers https.
Si votre site envoie déjà HSTS, vous n'avez pas besoin de ce commutateur. N'activez-le que 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 | Contre quoi | Valeur de départ |
|---|---|---|
X-Content-Type-Options | Le navigateur se met à deviner lui-même ce qu'est un fichier, ce qui peut faire exécuter une « image » téléchargée comme un script. | nosniff (la seule valeur valable) |
Content-Security-Policy: frame-ancestors ou X-Frame-Options | Le clickjacking : un autre site charge votre page de manière invisible dans un cadre (frame), afin que les visiteurs cliquent sans le savoir sur vos boutons. | frame-ancestors 'self', ou l'en-tête plus ancien X-Frame-Options: SAMEORIGIN |
Referrer-Policy | Lors d'un clic vers un autre site, le navigateur envoie l'adresse de la page précédente, parfois avec 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 que les valeurs strictes comme correctes. |
Permissions-Policy | Détermine quelles fonctionnalités 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 éléments. Si votre site utilise l'une de ces fonctions, omettez-la. |
Content-Security-Policy (complet) | Limite les emplacements depuis lesquels les scripts, styles et images peuvent se charger. Cela rend les scripts malveillants injectés (XSS) beaucoup plus difficiles. | Sur mesure, par 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 situé 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 lorsque vous êtes certain que chaque sous-domaine dispose de https. Si vous utilisez WordPress, vous pouvez aussi configurer les en-têtes via une extension. Choisissez une extension reconnue qui reçoit encore des mises à 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, laissez cela à votre créateur de site web, ou commencez uniquement par frame-ancestors.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), allez dans 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 (en anglais)
- MDN : Content-Security-Policy (en anglais)
- MDN : Permissions-Policy (en anglais)
- Liste de préchargement HSTS (en anglais)
