HSTS et en-têtes de sécurité pour votre site web
Pour chaque page, votre serveur web envoie des en-têtes : 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 autres en-têtes de sécurité existent 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 ces informations dans Activer, renouveler un certificat SSL et résoudre les problèmes 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 de manière non chiffrée. 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 alors 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 tape plus tard http://, le navigateur le convertit lui-même en https, avant même qu'une quelconque communication ne transite par le réseau. Le navigateur ignore un en-tête HSTS reçu via http ordinaire.
| É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 aussi à tous les sous-domaines, comme boutique.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 du temps. |
max-age=0 | Efface l'instruction mémorisée, dès la prochaine visite via https. |
includeSubDomains, cela s'applique aussi à chaque sous-domaine, comme une ancienne page de caméra ou d'imprimante sans certificat. Procédez donc par étapes : commencez avec un max-age court, par exemple un jour (86400), vérifiez que tout fonctionne, puis augmentez progressivement jusqu'à un an.Le commutateur HSTS dans DirectAdmin
Dans DirectAdmin, accédez à Domaines et cliquez sur votre nom de domaine. Si Connexion SSL sécurisée est activée, vous verrez au niveau de HSTS le commutateur Activer HTTP Strict Transport Security. Cliquez ensuite sur Modifier pour enregistrer. Vous trouverez les étapes détaillées dans Toujours rediriger les visiteurs vers https.
Pour savoir quel max-age votre site envoie, consultez les outils de développement de votre navigateur ou le test d'internet.nl (voir ci-dessous). 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 devine lui-même la nature d'un fichier, ce qui peut faire exécuter une « image » téléchargée en tant que 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, afin que les visiteurs cliquent sans s'en rendre compte 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 transmet l'adresse de la page précédente, parfois avec un terme de recherche ou un numéro de commande inclus. | 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 fonctions. Si votre site utilise l'une d'entre elles, omettez-la. |
Content-Security-Policy (complet) | Limite les emplacements depuis lesquels les scripts, styles et images peuvent se charger. Cela rend bien plus difficile l'injection de scripts malveillants (XSS). | Sur mesure selon le site. Évitez unsafe-inline, unsafe-eval et les caractères génériques. |
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 le commutateur HSTS est désactivé dans DirectAdmin : # 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 connue 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 créateur de site web, ou commencez uniquement avec 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), 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. Voir 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)
