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^^).

La note initiale de JusteGeek.fr sur Security Headers : F

La note initiale de JusteGeek.fr sur Security Headers : F

 

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 !

JusteGeek.fr passé de F à D grâce à la mise en place de HSTS sur Apache

JusteGeek.fr passé de F à D grâce à la mise en place de HSTS

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.

 

Sandstorm

Ingénieur Systèmes passionné d'informatique et de High-Tech, Sandstorm a créé JusteGeek.fr en 2013. Il aime les geekeries en tout genre. "Si un produit s'allume c'est un bon point. S'il est connecté, c'est encore mieux !"

Vous aimerez aussi...

15 réponses

  1. Mad dit :

    Pour passer en A , il faut encore désactiver les chaînes de chiffrement obsolète. Et activer une protection des iframes

    • Sandstorm dit :

      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 🙂

  2. Eric Le Floch dit :

    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é 😉

    • Sandstorm dit :

      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 😉
      ++

  3. Joel Pereira dit :

    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 .

  4. Nicolas Richard dit :

    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 😀

    • Sandstorm dit :

      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)

  5. Nicolas Richard dit :

    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

  6. Yves dit :

    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 ! ?
    @ +

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.