Guide complet de configuration des en-tĂȘtes HTTP pour la sĂ©curitĂ©


Les entreprises qui vendent des cartes de pointage de sécurité sont en augmentation, leur influence dans les ventes aux entreprises augmente. De plus, il y a ceux qui sont confus par la faible cote de sécurité des vendeurs, et ceux qui au moins une fois, en regardant la cote, ont refusé d'acheter - j'ai parlé avec de telles personnes.


J'ai regardĂ© comment ces entreprises calculent les performances de sĂ©curitĂ© d'autres entreprises. Il s'est avĂ©rĂ© qu'ils envisageaient une combinaison d'utilisation de l'en-tĂȘte HTTP pour la sĂ©curitĂ© et la rĂ©putation des adresses IP.


La rĂ©putation d'une adresse IP est basĂ©e sur des informations de liste noire et de liste de spammeurs combinĂ©es Ă  des informations sur le propriĂ©taire de l'adresse IP publique. En principe, il doit ĂȘtre propre si votre entreprise n'envoie pas de spam et est en mesure d'identifier et d'arrĂȘter rapidement une mise en Ɠuvre malveillante. L'utilisation de l'en-tĂȘte de sĂ©curitĂ© HTTP est calculĂ©e de la mĂȘme maniĂšre que l'Observatoire de Mozilla fonctionne.


Ainsi, la notation de la plupart des entreprises est principalement déterminée par les rubriques figurant sur les sites Web publics de sécurité.


Définir correctement le titre n'est pas long (aucune vérification sérieuse n'est requise), mais cela améliorera la sécurité du site et aidera à ne pas perdre des clients pour qui la sécurité n'est pas une expression vide de sens


Je doute de la valeur de la mĂ©thodologie de vĂ©rification mentionnĂ©e; de ​​plus, le prix du service est exorbitant. Il est peu probable que les fournisseurs de ce service soient en mesure de dĂ©terminer la sĂ©curitĂ© d'une ressource avec la prĂ©cision indiquĂ©e. Cependant, la situation souligne une fois de plus combien il est important de s'asseoir et de prendre le temps d'activer et de configurer les titres corrects.


Dans cet article, je parlerai des en-tĂȘtes les plus frĂ©quemment vĂ©rifiĂ©s, pour chacun, je conseillerai les valeurs de sĂ©curitĂ© et donnerai un exemple de paramĂštres. À la fin, je donnerai des exemples de paramĂštres pour les applications courantes et les serveurs Web.


En-tĂȘtes de sĂ©curitĂ© importants


Contenu-Sécurité-Politique


Le CSP est utilisĂ© pour empĂȘcher les scripts intersites - en dĂ©terminant quelles ressources peuvent ĂȘtre tĂ©lĂ©chargĂ©es. De la liste entiĂšre, cette rubrique prendra plus de temps que d'autres pour crĂ©er et soutenir correctement, et encore plus d'autres sont Ă  risque. Lorsque vous dĂ©veloppez un CSP, vĂ©rifiez-le attentivement - si vous bloquez soudainement la source que vous utilisez, puis interrompez les fonctionnalitĂ©s de votre propre site.


Pour la version préliminaire, vous pouvez utiliser un merveilleux outil - une extension pour le navigateur Mozilla, Laboratory CSP . Installez-le dans un navigateur, étudiez attentivement le site pour lequel vous souhaitez créer un CSP, puis utilisez le CSP généré sur votre site. Idéalement, vous devez toujours retravailler JavaScript afin de pouvoir supprimer la directive en ligne non sécurisée.


Le CSP peut sembler compliqué et déroutant, donc si vous voulez approfondir le sujet, visitez le site officiel .


Vous pouvez préconfigurer CSP comme ceci (sur un site de combat, cela nécessitera trÚs probablement de nombreuses modifications). Ajoutez des domaines à chaque section de votre site.


# Default to only allow content from the current site # Allow images from current site and imgur.com # Don't allow objects such as Flash and Java # Only allow scripts from the current site # Only allow styles from the current site # Only allow frames from the current site # Restrict URL's in the <base> tag to current site # Allow forms to submit only to the current site Content-Security-Policy: default-src 'self'; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; 

Strict-transport-security


Cet en-tĂȘte indique au navigateur que vous ne pouvez accĂ©der au site qu'en utilisant le protocole HTTPS - activez-le toujours si HTTPS est activĂ© sur votre site. Incluez-le sur tous les sous-domaines utilisĂ©s, le cas Ă©chĂ©ant.


 Strict-Transport-Security: max-age=3600; includeSubDomains 

Options de type de contenu X


GrĂące Ă  cet en-tĂȘte, les navigateurs adhĂšrent aux types MIME installĂ©s par l'application, ce qui permet d'Ă©viter certaines attaques de script intersites.


Il rĂ©duit Ă©galement le risque de comportement d'application inattendu lorsque le navigateur «devine» de maniĂšre incorrecte le type de contenu sur le site - par exemple, si le dĂ©veloppeur dĂ©signe une page «HTML» et que le navigateur voit JavaScript et essaie de rendre la page en consĂ©quence. De plus, grĂące Ă  cet en-tĂȘte, le navigateur conserve toujours les types MIME installĂ©s par le serveur.


 X-Content-Type-Options: nosniff 

ContrĂŽle du cache


Celui-ci sera plus pauvre que les autres, car pour différents types de contenu, vous aurez probablement besoin de politiques de mise en cache différentes.


Aucune information sensible, telle que la page d'un utilisateur ou la page de paiement d'un produit, ne doit ĂȘtre mise en cache. L'une des raisons Ă  cela est qu'un autre utilisateur d'ordinateur n'appuie pas sur le bouton de retour, ne lit pas l'historique et ne voit pas les donnĂ©es personnelles d'un autre utilisateur.


Cependant, vous pouvez et devez mettre en cache les pages rarement mises Ă  jour, telles que les ressources statiques (images, fichiers CSS et JS). La mise en cache peut ĂȘtre configurĂ©e page par page ou en utilisant l'expression rĂ©guliĂšre dans les paramĂštres du serveur.


 # Don't cache by default Header set Cache-Control no-cache # Cache static assets for 1 day <filesMatch ".(css|jpg|jpeg|png|gif|js|ico)$"> Header set Cache-Control "max-age=86400, public" </filesMatch> 

Expire


Cet en-tĂȘte dĂ©finit l'heure Ă  laquelle la demande en cours est mise en cache. Il est ignorĂ© si l'en-tĂȘte max-age Cache-Control est activĂ©, nous ne l'activons donc que dans le cas oĂč un simple scanner le vĂ©rifierait - Ă  l'exclusion des contrĂŽles de mise en cache.


Nous supposons que pour des raisons de sĂ©curitĂ©, le navigateur ne met rien en cache, donc la date dans l'en-tĂȘte sera toujours dans le passĂ©.


 Expires: 0 

X-frame-options


Cet en-tĂȘte permet l'affichage du site dans un iFrame.


En plaçant votre site Web dans une iFrame, une ressource malveillante a la possibilitĂ© d'effectuer une attaque de dĂ©tournement de clic - en lançant une sorte de JavaScript qui incite l'utilisateur Ă  cliquer sur l'iFrame, puis commence Ă  interagir avec la ressource Ă  partir de son nom d'utilisateur (c'est-Ă -dire qu'une personne clique sur un lien ou un bouton malveillant sans mĂȘme le savoir!).


Cet en-tĂȘte doit toujours ĂȘtre configurĂ© pour Ă©chouer, Ă  l'exception si vous utilisez intentionnellement des trames. Ensuite, l'en-tĂȘte doit ĂȘtre dĂ©fini sur la mĂȘme source. Si vous utilisez des cadres avec un site diffĂ©rent par dĂ©faut, ajoutez le domaine tiers Ă  la liste blanche.


Il convient Ă©galement de noter que cet en-tĂȘte est remplacĂ© par la directive frame-ancestors CSP. Je recommande de l'activer pour l'instant, mais juste pour fermer les outils de vĂ©rification des en-tĂȘtes, ils s'en dĂ©barrasseront trĂšs probablement Ă  l'avenir.


 X-Frame-Options: deny 

Access-Control-Allow-Origin


Cet en-tĂȘte indique au navigateur quel code externe de quels sites tiers a le droit de faire des requĂȘtes sur une page spĂ©cifique. Les paramĂštres par dĂ©faut sont gĂ©nĂ©ralement corrects, mais vous pouvez les modifier si nĂ©cessaire.


Par exemple, le site A contient une sorte de JavaScript qui souhaite faire une demande au site B. Le site B doit rĂ©pondre Ă  cette demande - si l'en-tĂȘte permet au site A de faire une demande. Si vous devez configurer plusieurs sources, consultez les dĂ©tails sur la page MDN .


Ici, vous pouvez ĂȘtre un peu confus, j'ai donc fait un diagramme - pour illustrer le fonctionnement de cet en-tĂȘte:



Flux de données avec Access-Control-Allow-Origin


 Access-Control-Allow-Origin: http://www.one.site.com 


Assurez-vous que vos cookies sont dĂ©finis uniquement via le protocole HTTPS (avec cryptage) et qu'ils ne sont pas accessibles via JavaScript. Ces fichiers ne peuvent ĂȘtre envoyĂ©s que si votre site prend Ă©galement en charge HTTPS, comme il se doit. Vous devez toujours dĂ©finir ces drapeaux:


  • SĂ©curisĂ©
  • HTTP uniquement

Exemple de définition de cookie:


 Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly 

En savoir plus dans l'excellente documentation des cookies de Mozilla .


Protection X-XSS


Cet en-tĂȘte indique au navigateur d'interrompre les attaques de script intersites dĂ©tectĂ©es. En l'allumant, vous ne prenez pas beaucoup de risques, mais testez-le avant de le lancer dans l'environnement de production.


 X-XSS-Protection: 1; mode=block 

Exemple de paramĂštres de serveur Web


En gĂ©nĂ©ral, dans les paramĂštres du serveur, il est prĂ©fĂ©rable d'ajouter des en-tĂȘtes Ă  l'ensemble du site. Les cookies sont une exception, car ils sont dĂ©finis dans l'application elle-mĂȘme.


Je vous conseille, avant d'ajouter des en-tĂȘtes au site, vĂ©rifiez d'abord avec l'Observatoire ou regardez manuellement dans les en-tĂȘtes - vĂ©rifiez ceux qui sont dĂ©jĂ  installĂ©s. Certains moteurs de site et de serveur installeront tout par eux-mĂȘmes, alors implĂ©mentez simplement les en-tĂȘtes dont vous avez besoin ou modifiez ceux qui en ont besoin.


Configuration d'Apache


Exemple de configuration Apache en .htaccess:


 <IfModule mod_headers.c> ## CSP Header set Content-Security-Policy: default-src 'self'; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; ## General Security Headers Header set X-XSS-Protection: 1; mode=block Header set Access-Control-Allow-Origin: http://www.one.site.com Header set X-Frame-Options: deny Header set X-Content-Type-Options: nosniff Header set Strict-Transport-Security: max-age=3600; includeSubDomains ## Caching rules # Don't cache by default Header set Cache-Control no-cache Header set Expires: 0 # Cache static assets for 1 day <filesMatch ".(ico|css|js|gif|jpeg|jpg|png|svg|woff|ttf|eot)$"> Header set Cache-Control "max-age=86400, public" </filesMatch> </IfModule> 

Configuration de Nginx


 ## CSP add_header Content-Security-Policy: default-src 'self'; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; ## General Security Headers add_header X-XSS-Protection: 1; mode=block; add_header Access-Control-Allow-Origin: http://www.one.site.com; add_header X-Frame-Options: deny; add_header X-Content-Type-Options: nosniff; add_header Strict-Transport-Security: max-age=3600; includeSubDomains; ## Caching rules # Don't cache by default add_header Cache-Control no-cache; add_header Expires: 0; # Cache static assets for 1 day location ~* \.(?:ico|css|js|gif|jpe?g|png|svg|woff|ttf|eot)$ { try_files $uri @rewriteapp; add_header Cache-Control "max-age=86400, public"; } 

ParamĂštre d'en-tĂȘte au niveau de l'application


Si vous n'avez pas accĂšs au serveur Web ou si les exigences de dĂ©finition des en-tĂȘtes sont complexes, vous devrez probablement les configurer dans l'application elle-mĂȘme. Habituellement, pour l'ensemble du site, cela se fait Ă  l'aide d'un middleware ou sur la base d'un paramĂštre unique d'en-tĂȘtes pour chaque demande.


Par souci de concision, j'ai inclus une seule rubrique dans chaque exemple. Vous ajoutez de la mĂȘme maniĂšre tout ce qui est nĂ©cessaire.


Noeud et express:


Ajouter un chemin de montage global:


 app.use(function(req, res, next) { res.header('X-XSS-Protection', 1; mode=block); next(); }); 

Java et Spring


J'ai peu d'expĂ©rience avec Spring, mais Baeldung a un excellent guide sur la configuration des en-tĂȘtes au printemps.


Php


Je ne connais pas les diffĂ©rents environnements PHP. Recherchez le middleware pour les requĂȘtes. Pour une seule demande, tout est simple.


 header("X-XSS-Protection: 1; mode=block"); 

Python / Django


Django comprend un middleware de sécurité personnalisable qui fera tout cela pour vous. Activez-les d'abord.


Les rĂ©ponses de certaines pages peuvent ĂȘtre interprĂ©tĂ©es comme un dictionnaire. Django a une façon spĂ©ciale de travailler avec la mise en cache, et si vous souhaitez configurer les en-tĂȘtes de mise en cache de cette maniĂšre, vous devez vous familiariser avec celle-ci.


 response = HttpResponse() response["X-XSS-Protection"] = "1; mode=block" 

Conclusions


La configuration des en-tĂȘtes est un processus relativement simple et rapide, mais il augmente le niveau de sĂ©curitĂ© du site - en termes de protection des donnĂ©es, des scripts intersites et du dĂ©tournement de clics.


À l'avenir, vous vous protĂ©gerez de l'Ă©chec des transactions, car votre cote de sĂ©curitĂ© restera au niveau. La pratique de l'Ă©valuer sur la base des paramĂštres que j'ai examinĂ©s prend de l'ampleur et il me semble que son rĂŽle dans les annĂ©es Ă  venir dans le domaine de la vente ne fera que s'intensifier.


Faites-moi savoir si j'ai manqué un titre important!

Source: https://habr.com/ru/post/fr471746/


All Articles