Mettre en place Permissions-Policy, l'en-tête HTTP qui remplace le Feature-Policy
Le 5 juin dernier, je vous ai proposé un tutoriel pour mettre en place l'en-tête HTTP Feature-Policy. Les choses ont quelque peu évolué depuis et l'en-tête a été renommé en Permissions-Policy. S'il s'agit d'un renommage de cet en-tête, conservant les mêmes directives, il ne suffit pas pour autant de renommer l'ancien en-tête en Permissions-Policy pour que cela soit opérationnel. Voyons donc ce qu'il convient de faire pour remplacer l'en-tête Feature-Policy par son successeur. Notons au passage que le tutoriel du jour peut aussi être utilisé pour mettre en place une Permissions-Policy en partant de zéro.
Permissions-Policy : un en-tête existant renommé
L'en-tête Permissions-Policy, n'est ni plus ni moins que l'en-tête Feature-Policy renommé. Dès lors, les fonctionnalités de ces deux en-têtes sont les mêmes. Je vous repartage donc ici leurs fonctionnalités. Cela vous servira notamment si vous souhaitez mettre en place l'en-tête Permissions-Policy en partant de zéro :
- accelerometer
- ambient-light-sensor
- autoplay
- battery
- camera
- display-capture
- document-domain
- encrypted-media
- fullscreen
- geolocation
- gyroscope
- layout-animations
- legacy-image-formats
- magnetometer
- microphone
- midi
- notifications
- oversized-images
- payment
- picture-in-picture
- publickey-credentials-get
- push
- speaker
- sync-xhr
- usb
- vibrate
- vr (encore actif, mais déprécié)
- wake-lock
- xr-spatial-tracking
Pour chacune des fonctionnalités ci-dessus, on va ensuite pouvoir indiquer nos directives, c'est-à-dire les comportements à adopter. Ces directives sont les suivantes :
- * pour permettre la fonctionnalité, quelle que soit son origine
- 'self' : pour permettre d'autoriser les fonctionnalités seulement si elles proviennent du même domaine
- src : permet de définir une source pour laquelle la fonctionnalité est activée
- () : pour interdire purement et simplement l'utilisation de la fonctionnalité
Pour rappel, cet en-tête vise à contrôler (autoriser ou restreindre) les fonctionnalités des navigateurs qui le prennent en compte lorsqu'ils servent le contenu de notre site. Le but final ici est bien évidemment d'éviter que des fonctionnalités inutiles pour le site soient exploitées de manière malicieuse.
Voyons maintenant comment en pratique mettre en place cet en-tête.
Implémenter l'en-tête Permissions-Policy sur son site web
Comme indiqué en introduction de ce billet, il ne suffit pas de remplacer Feature-Policy par Permissions-Policy pour que cela soit opérationnel. Si vous vous contentez de faire cela, alors vous aurez bien un en-tête Permissions-Policy, mais celui-ci contiendra des directives inopérantes, comme le montre la capture ci-dessous (oui oui, j'ai tenté l'expérience pour vous...).
Pour ceux qui ont déjà implémenté Feature-Policy, le plus simple est surement de commenter votre directive Feature avec le caractère dièse en début de ligne # et de repartir sur une nouvelle ligne. Cela permettra de conserver les anciennes directives le temps de les intégrer dans le nouvel en-tête. Pour implémenter l'en-tête Permissions-Policy, on va pouvoir agir, comme souvent, soit de manière générale sur le serveur web, soit de manière granulaire sur les sites web. Voyons donc rapidement ces deux méthodes.
Implémentation générale pour le serveur web apache2
Pour activer cet en-tête de manière globale sur un serveur web de type apache2, il convient d'éditer le fichier /etc/apache2/conf-available/security.conf et d'y ajouter le Permissions-Policy sur une nouvelle ligne comme ceci :
Header set Permissions-Policy "accelerometer=(), geolocation=('self'), fullscreen=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), display-capture=('self')"
La syntaxe est donc la suivante : fonctionnalité=(ce qu'on autorise), fonctionnalité2=(ce qu'on autorise). Dans le cas où l'on souhaite interdire complètement la fonctionnalité, il suffit de ne rien écrire entre les parenthèses.
Une fois que vous avez renseigné toutes vos directives, redémarrez votre serveur apache2 (un reload est peut-être suffisant, mais pour ma part je préfère un restart) :
systemctl restart apache2
Implémentation au cas par cas pour un site web
Si votre serveur web héberge plusieurs sites, il est probable que vous souhaitiez implémenter cet en-tête de manière personnalisée sur chaque site. Et bien, c'est tout à fait possible. Pour cela, on va utiliser le fichier de déclaration de notre virtual host. Éditez donc le fichier contenant la configuration de votre vhost, et placez simplement votre directive avant la balise </VirtualHost> de la manière suivante :
<IfModule headers_module> Header set Permissions-Policy "accelerometer=(), geolocation=('self'), fullscreen=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), display-capture=('self')" </IfModule>
Ensuite, un petit restart et le tour est joué.
Mais il est également possible que vous n'ayez pas la main sur la configuration du serveur web hébergeant votre site. Dans ce cas, une implémentation est tout de même possible au travers du fichier .htaccess. Pour cela, il suffit d'ajouter nos directives dans la section mod_headers.c comme ceci :
<IfModule headers_module.c> Header set Permissions-Policy "accelerometer=(), geolocation=('self'), fullscreen=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), display-capture=('self')" </IfModule>
Le résultat
Quelle que soit la méthode utilisée, votre en-tête doit maintenant être fonctionnel et il est donc temps de vérifier ça en scannant à nouveau votre site web (ou l'un de vos sites web) avec SecurityHeaders.
Et bien pour ma part, comme vous pouvez le constater, j'ai récupéré mon A !! 🙂
Partager la publication "Mettre en place Permissions-Policy, l'en-tête HTTP qui remplace le Feature-Policy"
J'ai suivis tous les tutos et ça m'aide beaucoup à comprendre et sécuriser Apache.
Tu feras la dernière étape "Content-Security-Policy" ?
Salut ckrisL,
Oui j'ai prévu de la faire... un jour ! C'est l'en-tête le plus complexe à mettre en place... Il faut donc que je trouve le temps et la motivation pour le faire. Mais je le ferai un jour, c'est promis !
We are waiting you :')
Pour la petite histoire...
j'ai découvert ton site récemment car comme toi j'ai découvert un peu par hazard le monde caché des ces foutus "Headers" il y' a 2..3 jours.
Du coup je suis partie en guerre contre toutes ces foutus failles. J'ai résolu une bonne parti de mes soucie avec le Plugin HTTP Headers.
Je ne sais pas si tu connais ?! Je tiens à précisé que je ne suis pas un codeur juste un curieux de nature.
Mais quand je suis arrivé à cette merde de CSP qui à réussi à me faire refuser l'accès à mon site, c'est la que j'ai compris la merde que c'était,
du coup après ça j'ai commencer mon voyage pour découvrir la solution de paramétrage idéal CSP et j'ai découvert divers site dont le tiens !
Même si j'avais déjà fait pas mal de réglages tes articles sur le sujet à apporter pas mal de réponses. Bref du bon boulot dans la présentation et la pédagogie. Faire du bon taf c'est pas facile alors du coup je te félicite pour ça.
J'espère que tu m'en veux pas trop pour le "tutoiement", mais tant que le respect est là, de mon point de vue tout roule.
Mon commentaire supplémentaire à cet article ne va pas arranger la chose niveau pression, mais c'est dans un but positif pour nous TOUS....
alors c'est quand que tu t'attaque à Broly ?! je veux parler bien sur parler de Content-Security-Policy" ! 😎
A un moment donné ou à un autre, faut qu'on (internet FR) lui foute sur la geulle à cet enfoirée de CSP avec un bon petit nouvel article cool non ?!!
Salut ! Merci pour ton commentaire... Bon vous êtes vraiment trop à me le demander, cela ne peut plus durer. Je vais tenter de faire ça lors de mes prochaines vacances ! (sans doute en mars/avril).
Très bonne nouvelle. Prend ton temps (vue la complexité du machin) pour nous pondre un truc aussi cool que le reste.
Comme j'ai dit plus haut j'ai utilisé le plugin HTTP HEADERS....du coup tu nous dira ce qu'on peut paramétré et ce qu'on doit éviter...bref....Tu verra je te fais confiance.
PS: si jamais tu veux faire ça en vidéo, je te conseille le logiciel CAMTASIA....car il est propre et facile à prendre en main au point d'en devenir presque addict ^^.
à bientôt !
Bonjour Super! je n'attends plus que celui ci, et merci pour les autres, ils fonctionnent parfaitement dans le .htacess sauf chez one & one IONOS pourtant en apache, je me demande pourquoi, auriez vous une idée?
Merci pour vos articles, je suis graphiste webdesigner et cela me permet d'être plus secure pour mes clients.
Merci pour cet article.
J'ai mis le code que tu proposes dans ton article dans mon htaccess et j'ai systématiquement cette erreur dans la console Chrome Dev Tool :
"Error with Permissions-Policy header: Parse of permissions policy failed because of errors reported by structured header parser."
As-tu une idée de la cause ?
Salut,
Merci beaucoup pour ta série d'article sur la sécurité des pages web !
Tes explications sont claires.
Ps : il ne te reste qu'a obtenir le A+ désormais 😉
@phil : concernant l'erreur : "Error with Permissions-Policy header: Parse of permissions policy failed because of errors reported by structured header parser" ----> il faut enlever les quote à 'self '
Source : https://github.com/w3c/webappsec-permissions-policy/blob/main/permissions-policy-explainer.md#appendix-big-changes-since-this-was-called-feature-policy
J'ai enlevé les quotes à 'seld". Il n'y a plus d'erreur, mais à la place sont apparus ces avertissements :
Error with Permissions-Policy header: Unrecognized feature: 'ambient-light-sensor'.
Error with Permissions-Policy header: Unrecognized feature: 'battery'.
Error with Permissions-Policy header: Origin trial controlled feature not enabled: 'display-capture'.
Bonjour et merci pour ces tutos très riches d'instruction pour des neophytes comme moi.
Une petite question en rapport avec cet article. N'ayant pas accès au serveur (sites mutualisés), j'ai implémenter la directive dans mon fichier htaccess en me basant sur l'exemple que tu donnes.
Header set Permissions-Policy "accelerometer=(), geolocation=('self'), fullscreen=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), display-capture=('self')"
Ma question est, ne faut-il pas préciser TOUTES les fonctionnalités ou bien peut-on se contenter de n'en spécifier que qlqunes ? quid alors des fonctionnalités qui ne sont pas précisées ? n'y il a t-il pas alors une (des) faille(s) exploitable(s) ?
Encore un grand merci !
Par defaut (donc si elles ne sont pas spécifiées), quelle valeur prennent les fonctionnalités ?
Si on ne spécifie pas "Permissions-Policy" dans notre fichier Htaccess, ces fonctionnalités ne sont -elles pas déjà prisent en compte sur le serveur ? (en ayant un site mutualisé, on n'a pas accès au serveur)