J'avais commencé à tester et utiliser Let's Encrypt sur ce blog. Depuis quelques jours les sites suivants sont en https par défaut :
- https://www.nikrou.net/ : le blog courant
- https://static.nikrou.net/ : le serveur qui délivre les médias (images, vidéos) de ce blog.
- https://photos.nikrou.net/ : ma galerie photos personnelle (non publique) qui utilise encore Piwigo mais qui devrait bientôt passer sur Phyxo.
- https://www.phyxo.net/ : la page du projet Phyxo
- https://demo.phyxo.net/ : le site de démonstration de Phyxo
- https://blog.phyxo.net/ : le blog du projet Phyxo
- https://ext.phyxo.net/ : le site des extensions (plugins, thèmes, langues) du projet Phyxo.
Quand je dis que ces sites sont en https par défaut ce n'est pas tout à fait assez précis : en fait ils ne sont plus accessible en http. Si on y accède en http, une redirection permanente est faite côté serveur.
J'ai essayé de faire les choses le mieux possible en m'appyuant sur différents outils. Mes certificats pour mes deux noms de domaines ont le niveau A+ :
Vous pouvez vérifier sur le site Qualys SSL Labs et contrôler votre site.
Avec la même idée de sécurisé le mieux possible j'ai ajouté de nombreux entêtes https à mes pages de manières automatique.
Informations du serveur
Je donne le minimum d'information, c'est-à-dire juste le serveur que j'utilise, à savoir apache. Je ne donne ni sa version, si la version de PHP.
L'entête http correspondante est :
Server: Apache
La configuration correspondante d'apache est :
ServerTokens Prod
ServerSignature Off
Mécanisme HSTS - HTTP Strict Transport Security
L'idée est de dire aux navigateurs de n'utiliser que le protocole https. Le navigateur remplace alors tous les URL non sécurisé (en http - sans le s) par leur équivalent sécurisé.
L'entête http correspondante est :
Strict-Transport-Security: max-age=16000000; includeSubDomains; preload
La configuration correspondante d'apache est :
Header always set Strict-Transport-Security "max-age=16000000; includeSubDomains; preload"
Le paramètre max-age correspond à environ 60 jours ce qui correspond aussi au moment où mes certificats se renouvellent automatiquement.
Referrer Policy
Quand on navigue sur un site et que l'on suit un lien externe, le site cible à des informations d'où l'on vient. Cela peut-être utile pour savoir par exemple par quelle recherche un visiteur est venu. L'idée de cette entête http est de contrôler ce que l'on transfère.
L'entête http correspondante est :
Referrer-Policy: strict-origin-when-cross-origin
La configuration correspondante d'apache est :
Header always set Referrer-Policy: "strict-origin-when-cross-origin"
Il y a de nombreuses configurations possibles. J'ai choisi de ne transmettre l'URL complet que lorsque la requête à la même origine et qu'elle est toujours en https. Dans le cas contraire rien ne sera envoyé.
X-Content-Type-Options
De nombreux navigateurs essaient de "sniffer" des fichiers qui n'ont pas de type mime correct pour essayer de les exécuter. Cela peut-être source de faille et du coup je bloque.
L'entête http correspondante est :
X-Content-Type-Options: nosniff
La configuration correspondante d'apache est :
Header always set X-Content-Type-Options: "nosniff"
X-Xss-Protection
L'idée est de protéger les utilisateurs (via leur navigateur) contre les attaques XSS
De nombreux navigateurs essaient de "sniffer" des fichiers qui n'ont pas de type mime correct pour essayer de les exécuter. Cela peut-être source de faille et du coup je bloque.
L'entête http correspondante est :
X-Xss-Protection: 1; mode=block
La configuration correspondante d'apache est :
Header always set X-Xss-Protection "1; mode=block"
X-Frame-Options
L'idée est d'autoriser ou non un site à embarquer notre site dans le sien au moyen de frames. On se protège ainsi du clickjacking en empêchant un site d'embarquer mon site et ainsi tromper les visiteurs légitimes.
L'entête http correspondante est :
X-Frame-Options: deny
La configuration correspondante d'apache est :
Header set X-Frame-Options: "deny"
CSP
CSP est un entête qui envoie des directives de sécurité au navigateur concernant les ressources à utiliser que ce soit des images, des scripts ou des feuilles de styles css. J'ai défini des règles minimales qui fonctionnent au moins pour les parties publiques de mes sites. Pour les parties administrations j'ai encore des choses à corriger mais ce n'est pas très complexe.
L'entête http correspondante est :
Content-Security-Policy: default-src 'none'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' static.nikrou.net photos.nikrou.net; upgrade-insecure-requests; form-action 'self'; frame-ancestors 'none'; connect-src 'self' www.nikrou.net ; report-uri https://nikrou.report-uri.io/r/default/csp/reportOnly
La configuration correspondante d'apache est :
Header always set Content-Security-Policy: "default-src 'none'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' photos.nikrou.net; upgrade-insecure-requests; form-action 'self'; frame-ancestors 'none'; connect-src 'self' www.nikrou.net ; report-uri https://nikrou.report-uri.io/r/default/csp/reportOnly"
Je n'ai pas mis en place HTTP Public Key Pinning qui me permet un peu complexe à mettre en place et surtout un peu critique. Je vais continuer à investiguer pour mesurer le risque.
Avec ces différents directives j'obtiens un score de A sur securityheaders.io :
Le site Dareboost passe mon score à 91%. C'est au niveau du contenu qu'il faut que je travaille pour améliorer le score, notamment le début d'affichage qui est un peu long.
1 De madvic -
Personellement, l'instruction " ServerTokens Prod" fait planté mon htaccess.
2 De Nicolas -
Oui c'est normal. Cette directive n'est autorisée que dans la configuration d'apache, pas dans un fichier .htaccess :
https://httpd.apache.org/docs/2.4/e...
3 De joe -
bonjour, et merci pour ce tuto, J'aurais cependant une question . Existe il des versions à mettre directement dans le htaccees pour ce qui est de Content-Security-Policy , Referrer-Policy et Feature-Policy ?
En effet, pour ma part, mon site est hébergé sur un serveur où je n'ai pas la mains sur la configuration de apache, je doit donc codé directement dans le htaccees et je n ai malheureusement pas trouver de solution pour ces 3 cas. Or j aimerais obtenir un A voir un A+ sur https://securityheaders.com
4 De joris -
et si possible je souhaiterais même un A+ sur le site que vous partagé où je n obtient qu'un F =.=" .
5 De Nicolas -
La directive Header est valide dans un .htaccess :
https://httpd.apache.org/docs/2.4/e...
6 De joris -
donc il me suffit simplement de copier coller dans mon htaccees ? au top dans ce cas :) .
7 De joris -
merci de votre réponse rapide
8 De stephane soulier -
attention néanmoins la balise if module est obligatoire dans le cas d une implantation d un header
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=16000000; includeSubDomains;
</IfModule>