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

ssl - www.nikrou.net ssl - www.phyxo.net

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 :

www.nikrou.netwww.phyxo.net

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.

nikrou.net - dareboost.com