wiki : Documentation Technique > En-têtes de sécurité
En-têtes de sécurité
- Présentation
- Les en-têtes de sécurité dans Lutèce
- Présentation détaillée des en-têtes de sécurité
- Aide au paramétrage des en-têtes de sécurité
- Recommandations générales
- Paramétrage des directives *-src de l’en-tête Content-Security-Policy (CSP)
- Paramétrage des directives *-src existantes dans le paramétrage Lutèce
- Chargement d'images externes : Directive img-src
- Chargement de scripts externes : Directive script-src
- Chargement de CSS externes : Directive style-src
- Appels externes (Ajax, websocket, ...) : Directive connect-src
- Objets embarqués (balises <embed>, <object>) : Directive object-src
- Directive default-src
- Paramétrage des directives *-src inexistantes dans le paramétrage Lutèce
- Paramétrage des directives *-src existantes dans le paramétrage Lutèce
Présentation
Les en-têtes HTTP sont des méta-informations transmises entre le client et le serveur en même temps que les données d'une requête ou d'une réponse. Ils se présentent sous la forme d'un nom et d'une valeur séparés par 2 points. Cette valeur est constituée d'une ou plusieurs instructions appelées directives.
Les en-têtes de sécurité sont un sous-ensemble d'en-têtes HTTP ajoutés aux réponses et axés sur la sécurité. Ils permettent de donner des indications destinées principalement aux navigateurs web sur le comportement à adopter vis-à-vis d'une page ou d'un document.
Ils offrent ainsi une couche supplémentaire de sécurité aux applications et permettent ainsi de se prémunir des attaques les plus courantes comme les attaques XSS ou par clickjacking.
Certains d'entre eux ne sont pas spécialement identifiés comme étant des en-têtes de sécurité mais ils sont également inclus dans ce groupe car ils participent à la sécurité d'une application (en-tête Cache-Control notamment).
Le projet OWASP secure headers
La fondation OWASP (Open Worldwide Application Security Project) à travers le projet OWASP secure headers project vise à promouvoir les en-têtes de sécurité afin d'augmenter le niveau de sécurité général des applications sur Internet. Le site web dédié se trouve à cette adresse : https://owasp.org/www-project-secure-headers/
Sur ce site, OWASP a listé les en-têtes de sécurité classés par état. Les états possibles sont :
- working draft
- active
- almost deprecated
- deprecated
De cette liste, OWASP a extrait une sélection d'en-têtes à ajouter aux réponses générées par les applications et propose un paramétrage recommandé pour chacun d'entre eux.
Les en-têtes de sécurité dans Lutèce
Pour Lutèce, le choix des en-têtes de sécurité à ajouter s'appuie sur cette sélection recommandée par le projet secure headers OWASP dans la limite des contraintes imposées par l'application et de ses besoins.
Seuls les en-têtes à l'état « active » sont retenus. Pour des raisons d'obsolescence, ceux dont l'état est « almost deprecated » et « deprecated » sont écartés. Pour l'unique en-tête à l'état « working draft » à savoir Permissions-Policy, OWASP conseille de ne pas de le mettre en place tant qu'il est dans cet état. Celui-ci peut être sujet à changement et seuls les navigateurs basés sur le moteur Chromium supportent une partie de ses fonctionnalités.
Il existe 2 types d'en-têtes dans Lutèce : les en-têtes de type page et les en-têtes de type API REST
Les en-têtes de type page
Les en-têtes de type page sont ajoutés aux pages envoyées par le serveur. Ils donnent des indications au navigateur sur le comportement à adopter en ce qui concerne la page renvoyée.
Dans Lutèce, il existe actuellement 5 catégories de pages auxquelles les en-têtes de sécurité sont ajoutés :
- Catégorie « toutes les pages »
Cette catégorie regroupe les en-têtes qui sont ajoutés systématiquement à toute page de l'application accédée par l'utilisateur. D'autres en-têtes plus spécifiques peuvent également être ajoutés en même temps comme ceux qui vont suivre.
- Catégorie « pages FO avec authentification »
Cette catégorie regroupe les pages du Front office dont l'accès nécessite une authentification de la part de l'utilisateur. A noter que certaines pages du Front office comme la page de connexion ou celle de déconnexion n'en font pas partie. Les en-têtes s'appliquant à cette catégorie de page ont principalement pour but d'éviter que les données confidentielles ne soient stockées dans le cache.
- Catégorie « pages BO avec authentification »
Cette catégorie est le pendant côté back office de la catégorie précédente.
- Catégorie « page de déconnexion FO »
Cette catégorie correspond à la page de déconnexion du Front office. Actuellement, les en-têtes ajoutés aux pages de cette catégorie ont pour but de vider les données qui auraient pu être stockées sur disque ou dans le cache notamment pendant la navigation alors que l'utilisateur était connecté au Front office.
- Catégorie « page de déconnexion BO »
Cette catégorie est le pendant côté Back office de la catégorie précédente.
Les en-têtes de type API REST
Bien que destinés principalement aux navigateurs, les en-têtes peuvent également avoir une utilité dans le cas des appels aux API REST. Dans la configuration proposée par le projet OWASP secure headers, il est indiqué que celle-ci est proposée à la fois dans le contexte d'une application web mais aussi d'une API. Dans Lutèce, les appels aux API REST se font entre services et beaucoup de ces en-têtes ne sont donc pas utiles dans ce contexte.
Dans le cadre de ses cheat sheet series, OWASP propose une note sur la sécurité des API REST disponible à cette adresse : https://cheatsheetseries.owasp.org/cheatsheets/REST_Security_Cheat_Sheet.html. Dans le chapitre Security Headers, elle indique une configuration qui s'avère mieux adaptée aux appels aux API REST. Le paramétrage pour Lutèce a été défini en suivant cette note.
Configuration
Une page de gestion des en-têtes de sécurité a été ajoutée dans le menu Système du back office. Elle permet de lister les en-têtes, de créer, de modifier, de supprimer ou d'activer/désactiver un en-tête. En ce qui concerne l'ajout des en-têtes aux pages ou aux appels API REST, l'application utilise le mécanisme des filtres de servlet pour les identifier et consulte la configuration mise en place avec l'interface pour déterminer quels en-têtes doivent être ajoutés à une réponse.
Il est fortement recommandé de laisser activés les différents en-têtes activés par défaut à l'initialisation du site Lutece.
Présentation détaillée des en-têtes de sécurité
Liste des en-têtes de sécurité
Aide au paramétrage des en-têtes de sécurité
Il est très probable que le paramétrage des en-têtes fourni par défaut pour Lutèce doive être complété avec les spécificités de votre application. Vous trouverez ci-dessous des indications pour vous aider dans cette tâche.
Recommandations générales
- Il est conseillé de compléter le paramétrage par défaut de manière très progressive, en validant vos modifications à chaque étape pour, en fin de compte, arriver à un paramétrage incluant le paramétrage établi initialement pour Lutèce et celui qui est spécifique à votre application. Pour rappel, la console des navigateurs est très utile pour arriver à ce résultat car les contraintes mises en place qui ne sont pas respectées sont affichées avec notamment le nom des directives en erreur. Il faut toutefois faire attention car les valeurs affichées ne reprennent parfois pas entièrement les valeurs positionnées ce qui peut nuire à la résolution des problèmes.
- Il peut également être intéressant d'utiliser différents navigateurs afin de valider que vos modifications fonctionnent correctement mais aussi car les messages affichés peuvent être plus ou moins informatifs en fonction du navigateur que vous aurez choisi
- Vous pouvez trouver des recommandations sur le paramétrage des en-têtes de sécurité dans ce guide édité par l’ANSSI (Agence nationale de la sécurité des systèmes d’information) : https://cyber.gouv.fr/sites/default/files/2013/05/anssi-guide-recommandations_mise_en_oeuvre_site_web_maitriser_standards_securite_cote_navigateur-v2.0.pdf
Paramétrage des directives *-src de l’en-tête Content-Security-Policy (CSP)
L'en-tête de sécurité CSP joue un rôle crucial dans la protection de votre application. Il nécessitera probablement des ajustements de configuration pour fonctionner correctement avec votre site. Les directives de l’en-tête CSP de la forme *-src fonctionnent toutes selon le même principe en permettant de restreindre les ressources qui peuvent être chargées ou accédées depuis les pages de votre site. Si plusieurs domaines/urls doivent être autorisés, vous devez les ajouter à la liste des valeurs de la directive en ajoutant un espace pour les séparer comme dans l’exemple suivant :
img-src 'self' https://mesimages.com https://img.com
Pour information, vous pouvez consulter la liste des valeurs possibles pour ces directives à l’adresse suivante dans la rubrique Source List Reference : https://content-security-policy.com/#source_list
Paramétrage des directives *-src existantes dans le paramétrage Lutèce
Les directives présentes dans le paramétrage Lutèce de l’en-tête CSP sont les suivantes : img-src, script-src, style-src, connect-src, object-src et default-src.
Chargement d'images externes : Directive img-src
Utilisée pour définir les sources valides pour les images. Si votre site utilise des images dont l’origine est différente de celui-ci alors vous devrez ajouter le nom de domaine où sont hébergées ces images. Ainsi, si vous utilisez l’image https://owasp.org/assets/images/logo.png, vous devrez adapter le paramétrage par défaut comme dans l’exemple ci-dessous :
img-src 'self' https://owasp.org data: blob:
Chargement de scripts externes : Directive script-src
Utilisée pour indiquer les sources de script valides. Le paramétrage Lutèce est 'self' 'unsafe-inline' ce qui signifie que seuls les scripts ayant la même origine que votre site pourront être chargés et exécutés. Par exemple, si vous utilisez la plateforme google analytics en chargeant le script externe https://www.google-analytics.com/analytics.js, l’adaptation consiste à ajouter le domaine de ce script au paramétrage Lutèce :
script-src 'self' 'unsafe-inline' https://www.google-analytics.com
Chargement de CSS externes : Directive style-src
Permet de définir les sources valides pour les feuilles de styles ou CSS. Etant donné que le paramétrage Lutèce est 'self' 'unsafe-inline', si vous utilisez des feuilles de style externes à votre site, le domaine où celles-ci sont hébergées doit être ajouté à la liste des sources valides autorisées pour les styles. Donc, si vous utilisez les feuilles css provenant d’une ressource externe nommé https://css.sheets.org/exemple.css par exemple, vous devrez compléter le paramétrage par défaut avec le nom de domaine de cette ressource comme ci-dessous :
style-src 'self' 'unsafe-inline' https://css.sheets.org
Appels externes (Ajax, websocket, ...) : Directive connect-src
Utilisée pour contrôler les appels effectués à des ressources à l'aide des interfaces suivantes : XMLHttpRequest (AJAX), WebSocket, fetch(), <a ping> ou EventSource. Avec le paramétrage par défaut (‘self’ blob:), l'accès à ces ressources sera refusé si elles ne sont pas hébergées dans Lutèce. En cas d’erreur, il faut donc identifier les noms de domaines auxquels vous accédez et vous devez les ajouter aux valeurs déjà existantes pour cette directive. Par exemple, supposons que certaines de vos pages effectuent des appels AJAX à une API externe comme la base des adresses nationales dont l’url est https://api-adresse.data.gouv.fr, le contenu de la directive connect-src doit être le suivant :
connect-src 'self' https://api-adresse.data.gouv.fr blob:
Objets embarqués (balises <embed>, <object>) : Directive object-src
Indique les sources valides pour les éléments <object> et <embed>. Cette directive a pour valeur ‘none’ par défaut. Si toutefois votre site nécessite l’inclusion d’objets embarqués (sachant que cela n’est pas recommandé), il faudra supprimer la valeur ‘none’ et la remplacer par le ou les noms de domaine que souhaitez autoriser comme dans l’exemple ci-dessous :
connect-src https://trusted-source.com
Directive default-src
Permet de positionner une valeur par défaut pour toutes les directives de type *-src. Dans le cas du paramétrage Lutèce, cette directive a pour valeur 'self' et indique que les ressources doivent obligatoirement avoir la même origine que la page appelante. Donc toutes les directives de type *-src prennent cette valeur sauf celles qui sont redéfinies dans l'en-tête CSP comme script-src ou style-src. Par conséquent, une directive comme font-src qui n'apparaît pas dans le paramétrage Lutèce hérite donc de la valeur par défaut 'self'.
A priori, vous n’avez pas à changer la valeur de cette directive.
Paramétrage des directives *-src inexistantes dans le paramétrage Lutèce
Il est possible que des erreurs se produisent sur des directives *-src ne faisant pas partie du paramétrage Lutèce par défaut. Comme dit précédemment, ces directives ont pour valeur ‘self’ par héritage du paramétrage de la directive default-src. En prenant l’exemple d’une application qui accède à des fichiers audio ou vidéo externes via les balises HTML <audio> ou <video> alors ces ressources ne seront pas accessibles. Un message d'erreur s'affichera alors dans la console du navigateur indiquant que la politique de sécurité n’est pas respectée pour la directive media-src de l’en-tête CSP. Dans ce cas, à supposer que les fichiers audio/vidéo soient hébergés sur le site http://example.video-audio.com, vous devrez ajouter cette directive aux autres directives de l’en-tête CSP pour redéfinir sa valeur comme ci-dessous :
media-src 'self' http://example.video-audio.com