Activer l'en-tête HSTS sur Apache pour protéger son site web
Il y a quelques jours, j'ai découvert, un peu par hasard, securityheaders, un site permettant de tester un peu le sécurité de son site internet, du moins en ce qui concerne les mécanismes contenus dans les en-têtes de trame HTTP. Cela fait maintenant un moment que JusteGeek tourne en HTTPS puisque j'ai effectué la migration en juin 2015 et confiant en moi même, je me suis dis que j'allais le tester pour voir un peu ce que cela donne. J'ai donc soumis Justegeek.fr à l'examen du site securityheaders et j'ai eu une drôle de surprise, puisque j'ai obtenu la note de... F soit la pire note du site il me semble... En même temps, je ne suis pas un professionnel de la sécurité et j'apprends au fur et à mesure donc cela ne me choque pas tant que ça (mais c'est vexant quand même 😆 ). J'ai donc analysé tout cela et procédé à quelques modifications côté serveur. Ce billet va porter sur l'un des changements effectués concernant le mécanisme HSTS sur Apache. D'autres billets paraîtront dans les prochains jours sur d'autres aspects, le but étant de transformer cette note F en une bien meilleure note (le A si possible^^).
HTTP Strict Transport Security
HTTP Strict Transport Security, plus connu sous le sigle HSTS est un mécanisme qui demande au client (le navigateur) de remplacer tous les liens non sécurisés par des liens sécurisés. Ce mécanisme permet donc de s'assurer que seules des requêtes HTTPS seront utilisées au cours de la navigation sur le site, quels que soient les liens contenus dans la page Web. Ce mécanisme peut également s'appliquer aux sous-domaines si l'on précise la directive includeSubDomains dans la configuration. Ainsi, les sous domaines seront eux aussi affichés en HTTPS.
Configurer HSTS sur Apache
Pour activer le protocole HSTS sur Apache dans les en-têtes de trames, le plus simple est de modifier la configuration du serveur Apache. Ainsi, si le serveur héberge plusieurs sites, tous bénéficieront de cette directive. Pour cela, il convient d'éditer le fichier /etc/apache2/conf-available/security.conf pour ajouter la ligne ci-dessous :
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Une fois que c'est fait, rechargez simplement la configuration d'Apache :
service apache2 reload
Si vous n'avez pas le main sur la configuration Apache (si par exemple vous utilisez un hébergement mutualisé), vous pouvez activer HSTS grâce au fichier .htaccess à la racine de votre site. Il vous suffira d'y ajouter la ligne suivante dans la section mod_headers :
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</IfModule>
HSTS Preloading
Comme expliqué plus haut dans ce billet, implémenter le protocole HSTS permet de garantir que, lors de la session, tous les liens utiliseront HTTPS. C'est très bien, mais est-ce suffisant à 100% ? Non ! Car il faut aussi protéger le début de la session. En effet, le premier échange ne sera pas effectué en HTTPS, puisque le client ne sait pas encore que le site web utilise HSTS. C'est là qu'intervient la notion de HSTS preloading. L'idée ici est de faire inscrire son domaine sur un liste internationale utilisée par les navigateurs internet. Ainsi, les navigateurs savent qu'ils devront utiliser HTTPS dès le début de la session.
Pour activer le HSTS preloading, il est important de bien préciser la directive preload lorsque l'on met en place HSTS. Ensuite, il convient de s'inscrire sur la liste officielle pour que cela soit effectif. Pour tester son éligibilité et demande son enregistrement sur la liste HSTS preloading, cela se passe ici.
Bon, en toute transparence, je ne l'ai pas encore fait puisque je dois d'abord retravailler sur les mécanisme de redirection afin d'être éligible au préchargement HSTS.
Conclusion
Et bien voilà. C'est terminé. L'effort pour la mise en oeuvre du mécanisme HSTS sur Apache est donc relativement faible et cela permet d'améliorer un peu la sécurité de son site internet. Pour ma part, cela m'a permis de passer JusteGeek.fr au grade D sur le site SecurityHeaders !
Bien sûr, je ne me suis pas arrêté là. Je vous présenterai dans les prochains jours les autres mécanismes que j'ai mis en place et contribuant à l'amélioration de la sécurité du site.
Partager la publication "Activer l'en-tête HSTS sur Apache pour protéger son site web"
Pour passer en A , il faut encore désactiver les chaînes de chiffrement obsolète. Et activer une protection des iframes
Salut ! Merci pour ton commentaire ! Ne spoil pas ma ligne éditoriale 😀 : comme précisé à la fin du billet, on y va étape par étape. Un second tuto est paru ce matin sur l'en-tête X-FRAME-OPTIONS et les autres tutos sont à venir ! L'objectif bien sûr étant le A 🙂
Petit oubli dans le texte... "Si vous n'avez pas le main sur la configuration Apache (si par exemple vous utilisez un hébergement mutualisé), vous pouvez activer HSTS grâce au fichier .htaccess à la racine de votre site. Il vous suffira d'y ajouter la ligne ci-dessus."... et il manque la ligne pour le fichier .htaccess !
Merci de compléter votre article et bonne continuation sur la voie de la sécurité 😉
Bonjour Eric,
Merci pour le commentaire.
Euh non, il ne manque pas la ligne puisque je renvoie à la ligne "CI-DESSUS"...
Mais effectivement, j'aurais pu la remettre en précisant que cela doit être dans la section " < IfModule mod_headers.c > ". Je vais donc éditer mon article en ce sens 😉
++
Bonjours , j'ai rajouter la meme ligne que toi mais lorsque je recharge la page il m'indique qu'il y a une erreur dans le header .
J'ai rajouter mot a mot la meme ligne que toi .
Salut Joel,
Tu l'as fais via htaccess ?
tu as activé le mod header
a2enmod header
(avec un s peut être)
SInon il ne reconnait pas la ligne
Oui, il faut activer le mod headers puisqu'on utilise ici des en-têtes HTTPS
Salut !
C'est la première fois que je commente sur ton site (félicitation il est vraiment bon).
J'ai peut-être lu trop rapidement mais pourquoi ces paramètres (max-age) ?
Tu saurais faire un article sur les Content-Security-Policy et autres Feature-Policy s'il te plaît ?
À la prochaine 😀
Salut 🙂
Merci pour tes encouragements. Pour le CSP, c'etait prévu initialement mais je n'ai toujours pas pris le temps de la faire... Ça viendra il faut juste que je me motive...
Pour le max age il s'agit de la durée durant laquelle le client (navigateur) doit retenir que le site n'est accessible que par le protocole HTTPS. On le met généralement à 15552000 ce qui en secondes correspond à 2 ans. Mais cette valeur peut être ajustée au besoin, selon les nécessités de l'applicatif web...
++
Merci pour ta réponse ! Cela confirme tout l'intérêt que tu portes à ton site 😀
Si je te demandais c'est qu'avant de tomber sur ta page je suis tomber là-dessus, https://fr.wikipedia.org/wiki/HTTP_Strict_Transport_Security#Impl%C3%A9mentation_Apache. L'écart est tellement important (500), que je me suis vraiment interrogé… quel intérêt dans l'un et l'autre cas ? Eh bien apparemment au-delà, il sera possible au navigateur d’appeler le protocole HTTP ou d’accepter des certificats auto-signés… d'où l'intérêt de le fixer arbitrairement élevé (2 ans étant la valeur que préconise Chromium apparemment)
J'en profite pour te demander quelques secondes de ton temps, c'est vraiment rien mais je galère :
- je cherche à faire en sorte que mes adresse http:// redirige vers https://
- que mes adresses non-www. redirige vers www.
Voilà ce que j'ai mais rien n'y change https://share.getcloudapp.com/wbu0vErg
Pour rediriger ton trafic vers https, tu peux indiquer dans le vhost HTTP une directive 301 comme :
Redirect 301 / https://www.justegeek.fr/
Pour la question du www, je te conseille de jeter un oeil ici, tu devrais trouver ce qu'il te faut en fonction de ton serveur web : https://www.webrankinfo.com/dossiers/techniques/redirection-301-www
++
Bonjour,
Question de béotien !
J'ai fait un essai d'intégration du code pour HSTS dans htaccess mais probablement pas au bon endroit car j'ai plusieurs sections ""
et dont certains sont en section "" ?
Comptant sur vos lumières ! ?
@ +
Bonjour, comme expliqué dans l'article, il faut placer la directive dans la section mod_headers.c.