À propos des entêtes de sécurité.
Il y a quelques semaines, on m'a fait découvrir quelques champs d'entête pour mieux contrôler ce qu'un navigateur est prêt à utiliser pour faire fonctionner un site qu'il a chargé. Jusque là, je ne connaissais vraiment que les CORS, puisque j'avais bataillé avec les services Web que je fabriquais, étant plutôt un développeur backend.
J'avais mis en place ces champs d'entête sur mon serveur dédié pour pouvoir tester si cela causait plus de problèmes que ça n'en résolvait. Au départ, je n'avais rien observé vu que je ne suis pas un utilisateur intensif de JavaScript, et autres technologies restreintes par de telles politiques de sécurité. Cependant, il a suffi que je m'intéresse à la mise à jour d'un RoundCube que je mets à disposition pour que je m'aperçoive que tout explose !
Pour référence, j'avais appliqué ceci à tout mon Web :
# /etc/apache2/conf-available/headers-security.conf
# a2enconf headers-security
Header set Content-Security-Policy "script-src 'self'"
Header set Permissions-Policy "none"
Header set Referrer-Policy "no-referrer-when-downgrade"
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header set X-Content-Type-Options "nosniff"
Header set X-Frame-Options "SAMEORIGIN"
Header set X-Xss-Protection "1; mode=block"
La valeur d'entête maudite
J'avais mis l'entête Content-Security-Policy (CSP) à la
valeur qui suit :
"script-src 'self'"
Or RoundCube, et en particulier certains thèmes de ce webmail,
utilisent du JavaScript pour fonctionner. Les messages n'apparaissaient plus dans les
diverses boîtes, et il était impossible de se déconnecter. C'est un peu problématique
pour la sécurité des utilisateurs.
La valeur d'entête bénie
Avec pas mal de temps et de lutte, j'ai permis à mon webmail de fonctionner à nouveau, avec l'entête CSP suivant :
# Code inséré dans le VirtualHost du webmail
Header set Content-Security-Policy " \
default-src 'self' https://mail.example.com 'unsafe-inline'; \
script-src 'self' 'unsafe-inline' 'unsafe-eval'; \
img-src 'self'; \
object-src 'self'; \
"
Ceci semble avoir résolu les problèmes de restriction trop importante. En espérant ne pas avoir ouvert la porte aux attaques et rendu la chose inutile !
Quelques ressources pour aller plus loin :
- Un outil d'évaluation des CSP mis à disposition par Google
- La référence dans le MDC
- La recommandation du W3C
- Un cookbook