Savez-vous que la plupart des failles de sécurité peuvent être corrigées par la mise en place des en-têtes nécessaires dans l’en-tête de la réponse ?

La sécurité est aussi essentielle que le contenu et le référencement de votre site web, et des milliers de sites web sont piratés en raison d’une mauvaise configuration ou d’un manque de protection. Si vous êtes propriétaire d’un site web ou ingénieur en sécurité et que vous cherchez à protéger votre site web contre le Clickjacking, l’injection de code, les types MIME, les attaques XSS, etc. alors ce guide vous aidera.

Dans cet article, je vais vous parler de différents en-têtes HTTP(recommandés par l’OWASP) à implémenter dans plusieurs serveurs web, réseaux et fournisseurs CDN pour une meilleure protection de votre site web.

Notes :

  • Nous vous conseillons de faire une sauvegarde du fichier de configuration avant d’effectuer des modifications
  • Certains en-têtes peuvent ne pas être supportés par tous les navigateurs, vérifiez donc la compatibilité avant l’implémentation.
  • Mod_headers doit être activé dans Apache pour implémenter ces en-têtes. Assurez-vous que la ligne suivante est décommentée dans le fichier httpd.conf.
LoadModule headers_module modules/mod_headers.so

Sivous utilisez WordPress : vous pouvez essayer d’utiliser le plugin HTTP Headers, qui s’occupe de ces en-têtes et de bien d’autres choses encore.

Commençons… 👨‍💻

HTTP Strict Transport Security

L’en-tête HSTS (HTTP Strict Transport Security) permet de s’assurer que toutes les communications d’un navigateur sont envoyées via HTTPS (HTTP Secure). Cela empêche les invites à cliquer sur HTTPS et redirige les requêtes HTTP vers HTTPS.

Avant d’implémenter cet en-tête, vous devez vous assurer que toutes les pages de votre site web sont accessibles via HTTPS, faute de quoi elles seront bloquées.

L’en-tête HSTS est supporté par toutes les versions les plus récentes des navigateurs tels que IE, Firefox, Opera, Safari et Chrome. Il existe trois paramètres de configuration.

Paramètre Valeur Signification
max-age Durée (en secondes) pour indiquer à un navigateur que les requêtes ne sont disponibles que sur HTTPS.
includeSubDomains La configuration est également valable pour le sous-domaine.
preload A utiliser si vous souhaitez que votre domaine soit inclus dans la liste de préchargement HSTS

Prenons l’exemple d’une configuration HSTS pour un an, incluant le préchargement pour le domaine et le sous-domaine.

Serveur HTTP Apache

Vous pouvez implémenter HSTS dans Apache en ajoutant l’entrée suivante dans le fichier httpd.conf

Header set Strict-Transport-Security "max-age=31536000 ; includeSubDomains ; preload" (Jeu d'en-têtes Strict-Transport-Security "max-age=31536000 ; includeSubDomains ; preload")

Redémarrez Apache pour voir les résultats

Nginx

Pour configurer HSTS dans Nginx, ajoutez l’entrée suivante dans nginx.conf sous la directive server (SSL)

add_header Strict-Transport-Security 'max-age=31536000 ; includeSubDomains ; preload' ;

Comme d’habitude, vous devrez redémarrer Nginx pour vérifier

Cloudflare

Si vous utilisez Cloudflare, vous pouvez activer HSTS en quelques clics.

  • Connectez-vous à Cloudflare et sélectionnez le site
  • Allez dans l’onglet “Crypto” et cliquez sur “Enable HSTS”

cloudflare-hsts-config

Sélectionnez les paramètres dont vous avez besoin, et les changements seront appliqués à la volée.

Microsoft IIS

Lancez le gestionnaire IIS et ajoutez l’en-tête en allant dans “HTTP Response Headers” pour le site concerné.

iis-hsts

Redémarrez le site

X-Frame-Options

Utilisez l’en-tête X-Frame-Options pour prévenir la vulnérabilité du Clickjacking sur votre site web. En implémentant cet en-tête, vous demandez au navigateur de ne pas intégrer votre page web dans une frame/iframe. La prise en charge par les navigateurs étant limitée, vous devez vérifier avant de l’implémenter.

Vous pouvez configurer les trois paramètres suivants.

Paramètre Valeur Signification
SAMEORIGIN Le contenu d’un cadre/iframe n’est autorisé qu’à partir du même site d’origine.
DENY Empêche tout domaine d’intégrer votre contenu à l’aide d’un cadre/iframe.
ALLOW-FROM Autorise le cadrage du contenu uniquement sur un URI particulier.

Voyons comment mettre en œuvre “DENY” pour qu’aucun domaine n’intègre la page web.

Apache

Ajoutez la ligne suivante dans httpd.conf et redémarrez le serveur web pour vérifier les résultats.

En-tête toujours annexé X-Frame-Options DENY

Nginx

Ajoutez la ligne suivante dans nginx.conf sous server directive/block.

add_header X-Frame-Options “DENY” ;

Redémarrez pour vérifier les résultats

F5 LTM

Créez une iRule avec les éléments suivants et associez-la au serveur virtuel correspondant.

when HTTP_RESPONSE {

HTTP::header insert "X-FRAME-OPTIONS" "DENY"

}

Vous n’avez pas besoin de redémarrer quoi que ce soit, les changements sont reflétés dans l’air.

WordPress

Vous pouvez également implémenter cet en-tête via WordPress. Ajoutez ce qui suit dans un fichier wp-config.php

header('X-Frame-Options : DENY) ;

Si vous n’êtes pas à l’aise pour éditer le fichier, vous pouvez utiliser un plugin comme expliqué ici ou mentionné ci-dessus.

Microsoft IIS

Ajoutez l’en-tête en allant dans “HTTP Response Headers” pour le site concerné.

iis-x-frame-options

Redémarrez le site pour voir les résultats.

X-Content-Type-Options

Prévenez les risques de sécurité liés aux types MIME en ajoutant cet en-tête à la réponse HTTP de votre page web. Cet en-tête indique au navigateur de considérer les types de fichiers tels qu’ils sont définis et d’interdire le reniflage de contenu. Il n’y a qu’un seul paramètre à ajouter : “nosniff”.

Voyons comment annoncer cet en-tête.

Apache

Vous pouvez le faire en ajoutant la ligne suivante dans le fichier httpd.conf

Header set X-Content-Type-Options nosniff

N’oubliez pas de redémarrer le serveur web Apache pour que la configuration soit active.

Nginx

Ajoutez la ligne suivante dans le fichier nginx.conf sous le bloc serveur.

add_header X-Content-Type-Options nosniff ;

Comme d’habitude, vous devez redémarrer Nginx pour vérifier les résultats.

Microsoft IIS

Ouvrez IIS et allez dans HTTP Response Headers (En-têtes de réponse HTTP)

Cliquez sur Ajouter et entrez le nom et la valeur

iis-mime-types

Cliquez sur OK et redémarrez IIS pour vérifier les résultats.

Politique de sécurité du contenu

Prévenez les attaques de type XSS, clickjacking, injection de code en implémentant l’en-tête Content Security Policy (CSP) dans la réponse HTTP de votre page web. La CSP indique au navigateur de charger le contenu autorisé sur le site web.

Tous les navigateurs ne supportent pas la CSP, vous devez donc vérifier avant de l’implémenter. Il existe trois façons de mettre en place les en-têtes CSP.

  • Politique de sécurité du contenu – Niveau 2/1.0
  • X-Content-Security-Policy – Déclassé
  • X-Webkit-CSP – Obsolète

Si vous utilisez toujours la version obsolète, vous pouvez envisager de passer à la version la plus récente.

Il existe de nombreux paramètres possibles pour mettre en œuvre la CSP, et vous pouvez vous référer à l’OWASP pour vous en faire une idée. Cependant, passons en revue les deux paramètres les plus utilisés.

Paramètre Valeur Signification
default-src Charge tout à partir d’une source définie
script-src Charge uniquement les scripts à partir d’une source définie

L’exemple suivant permet de charger tout ce qui provient de la même origine dans différents serveurs web.

Apache

Ajoutez les éléments suivants dans le fichier httpd.conf et redémarrez le serveur web pour qu’ils soient effectifs.

Header set Content-Security-Policy "default-src 'self' ;"

Nginx

Ajoutez ce qui suit dans le bloc serveur du fichier nginx.conf

add_header Content-Security-Policy "default-src 'self' ;";

Microsoft IIS

Allez dans HTTP Response Headers pour votre site respectif dans IIS Manager et ajoutez ce qui suit

iis-csp

Consultez cette page pour mettre en œuvre les frame-ancestors à l’aide de CSP. Il s’agit d’une version avancée de X-Frame-Options.

X-Permitted-Cross-Domain-Policies (en anglais)

Vous utilisez des produits Adobe tels que PDF, Flash, etc. ?

Vous pouvez implémenter cet en-tête pour indiquer au navigateur comment traiter les requêtes interdomaines. En implémentant cet en-tête, vous limitez le chargement des ressources de votre site à partir d’autres domaines afin d’éviter l’abus de ressources.

Plusieurs options sont disponibles.

Valeur Description
aucune aucune politique n’est autorisée
maître uniquement autorise uniquement la politique principale
tous tout est autorisé
par contenu uniquement N’autoriser qu’un certain type de contenu. Exemple – XML
by-ftp-only applicable uniquement à un serveur FTP

Apache

Si vous ne voulez autoriser aucune politique.

Jeu d'en-tête X-Permitted-Cross-Domain-Policies "none" (aucune)

Vous devriez voir l’en-tête comme suit.

permitted-cross-domain

Nginx

Supposons que vous ayez besoin d’implémenter la politique master-only, ajoutez alors ce qui suit dans nginx.conf sous le bloc serveur.

add_header X-Permitted-Cross-Domain-Policies master-only ;

Et le résultat.

nginx-permitted-cross

Politique de référencement

Vous souhaitez contrôler la politique de référence de votre site ? Cela présente certains avantages en termes de confidentialité et de sécurité. Cependant, toutes les options ne sont pas prises en charge par tous les navigateurs. Il convient donc d’examiner vos besoins avant de procéder à la mise en œuvre.

Referrer-Policy prend en charge la syntaxe suivante.

Valeur Description
no-referrer Les informations relatives au référent ne seront pas envoyées avec la demande.
no-referrer-when-downgrade Paramètre par défaut dans lequel les informations de référence sont envoyées au même protocole que HTTP à HTTP, HTTPS à HTTPS.
unsafe-url l’URL complète sera envoyée avec la demande.
same-origin Le référent ne sera envoyé que pour le même site d’origine.
strict-origin n’est envoyé que si le protocole est HTTPS
strict-origin-when-cross-origin l’URL complète sera envoyée via un protocole strict tel que HTTPS
origine envoyer l’URL d’origine dans toutes les demandes
origin-when-cross-origin envoyer l’URL COMPLET sur la même origine. Cependant, dans les autres cas, vous n’enverrez que l’URL d’origine.

Apache

Vous pouvez ajouter ce qui suit si vous souhaitez définir l’option “no-referrer”.

En-tête set Referrer-Policy "no-referrer"

Après le redémarrage, vous devriez avoir dans les en-têtes de réponse.

referrer-policy-apache

Nginx

Supposons que vous ayez besoin d’implémenter la même origine, vous devez donc ajouter ce qui suit.

add_header Referrer-Policy same-origin ;

Une fois configuré, vous devriez obtenir les résultats ci-dessous.

referrer-nginx-same-origin

Attendez-CT

Un nouvel en-tête encore à l’état expérimental consiste à demander au navigateur de valider la connexion avec les serveurs web pour la transparence des certificats (CT). Ce projet de Google vise à corriger certaines failles du système de certificats SSL/TLS.

Les trois variables suivantes sont disponibles pour l’en-tête Expect-CT.

Valeur Description
max-age En secondes, durée pendant laquelle le navigateur doit mettre en cache la politique.
enforce Directive facultative permettant d’appliquer la politique.
report-uri Le navigateur doit envoyer un rapport à l’URL spécifiée lorsque la transparence d’un certificat valide n’est pas reçue.

Apache

Supposons que vous souhaitiez appliquer cette politique, envoyer un rapport et mettre en cache pendant 12 heures, vous devez alors ajouter ce qui suit.

Jeu d'en-têtes Expect-CT 'enforce, max-age=43200, report-uri="https://somedomain.com/report"'

Et voici le résultat.

expect-ct-apache-http

Nginx

Que faire si vous voulez faire un rapport et un cache pendant 1 heure ?

add_header Expect-CT 'max-age=60, report-uri="https://mydomain.com/report"' ;

Le résultat serait le suivant.

expect-ct-nginx

Politique de permissions

Connue auparavant sous le nom de “Feature-Policy”, elle a été rebaptisée “Permissions-Policy” avec des fonctionnalités améliorées. Vous pouvez consulter cette page pour comprendre les principaux changements entre la politique des fonctionnalités et la politique des permissions.

Avec la politique de permissions, vous pouvez contrôler les fonctionnalités du navigateur telles que la géolocalisation, le plein écran, le haut-parleur, l’USB, la lecture automatique, le haut-parleur, le microphone, le paiement, l’état de la batterie, etc. pour les activer ou les désactiver dans une application web. En mettant en œuvre cette politique, vous permettez à votre serveur d’ordonner à un client (navigateur) d’obéir aux fonctionnalités de l’application web.

Apache

Supposons que vous ayez besoin de désactiver la fonction “plein écran”. Pour ce faire, vous pouvez ajouter ce qui suit au fichier httpd.conf ou apache2.conf, en fonction de la version du serveur HTTP Apache que vous utilisez.

Header always set Permissions-Policy "fullscreen 'none'" (en-tête)

Que diriez-vous d’ajouter plusieurs fonctionnalités en une seule ligne ?

C’est également possible !

L'en-tête définit toujours la politique de permissions "fullscreen 'none' ; microphone 'none'"

Redémarrez Apache HTTP pour voir le résultat.

HTTP/1.1 200 OK
Date : Thu, 29 Apr 2021 06:40:43 GMT
Serveur : Apache/2.4.37 (centos)
Politique de permissions : fullscreen 'none' ; microphone 'none'
Dernière modification : Thu, 29 Apr 2021 06:40:41 GMT
ETag : "3-5c116c620a6f1"
Accept-Ranges : bytes
Content-Length : 3
Keep-Alive : timeout=5, max=100
Connexion : Keep-Alive
Content-Type : text/html ; charset=UTF-8

Le code ci-dessus demandera au navigateur de désactiver le plein écran et le microphone.

Vous pouvez également désactiver entièrement cette fonctionnalité en laissant la liste d’autorisations vide.

Par exemple, vous pouvez ajouter ce qui suit pour désactiver la fonction de géolocalisation.

Header always set Permissions-Policy "geolocation=()"

Le navigateur afficherait le résultat suivant

HTTP/1.1 200 OK
Date : Thu, 29 Apr 2021 06:44:19 GMT
Serveur : Apache/2.4.37 (centos)
Politique de permissions : geolocation=()
Last-Modified : Thu, 29 Apr 2021 06:40:41 GMT
ETag : "3-5c116c620a6f1"
Accept-Ranges : bytes
Content-Length : 3
Keep-Alive : timeout=5, max=100
Connexion : Keep-Alive
Content-Type : text/html ; charset=UTF-8

Nginx

Prenons un autre exemple, celui de la désactivation du vibreur.

add_header Permissions-Policy "vibrate 'none' ;";

Ou encore, désactivez la géolocalisation, l’appareil photo et le haut-parleur.

add_header Permissions-Policy "geolocation 'none' ; camera 'none' ; speaker 'none' ;";

Voici le résultat après le redémarrage de Nginx.

HTTP/1.1 200 OK
Serveur : nginx/1.14.1
Date : Thu, 29 Apr 2021 06:48:35 GMT
Content-Type : text/html
Content-Length : 4057
Last-Modified : Mon, 07 Oct 2019 21:16:24 GMT
Connexion : keep-alive
ETag : "5d9bab28-fd9"
Permissions-Policy : geolocation 'none' ; camera 'none' ; speaker 'none' ;
Accept-Ranges : bytes

Toute la configuration de Nginx est placée sous le bloc http dans nginx.conf ou tout autre fichier personnalisé que vous utilisez.

Effacer les données du site

Comme vous pouvez le deviner par son nom, l’implémentation d’un en-tête Clear-Site-Data est un excellent moyen de dire à un client d’effacer les données de navigation telles que le cache, le stockage, les cookies ou tout autre élément. Cela vous donne plus de contrôle sur la façon dont vous voulez stocker les données du site web dans le navigateur.

Apache

Supposons que vous souhaitiez effacer le cache d’origine, vous pouvez ajouter ce qui suit.

L'en-tête définit toujours Clear-Site-Data "cache"

Ce qui produira la réponse HTTP suivante

HTTP/1.1 200 OK
Date : Thu, 29 Apr 2021 07:52:14 GMT
Serveur : Apache/2.4.37 (centos)
Clear-Site-Data : cache
Last-Modified : Thu, 29 Apr 2021 06:40:41 GMT
ETag : "3-5c116c620a6f1"
Accept-Ranges : bytes
Content-Length : 3
Keep-Alive : timeout=5, max=100
Connexion : Keep-Alive
Content-Type : text/html ; charset=UTF-8

ou, pour tout effacer.

L'en-tête définit toujours Clear-Site-Data "*"

Nginx

Configurons Nginx pour qu’il efface les cookies.

add_header Clear-Site-Data "cookies" ;

Vous verrez la sortie ci-dessous.

HTTP/1.1 200 OK
Serveur : nginx/1.14.1
Date : Thu, 29 Apr 2021 07:55:58 GMT
Content-Type : text/html
Content-Length : 4057
Last-Modified : Mon, 07 Oct 2019 21:16:24 GMT
Connexion : keep-alive
ETag : "5d9bab28-fd9"
Clear-Site-Data : cookies
Accept-Ranges : bytes

Conclusion

Sécuriser un site web est un défi, et j’espère qu’en implémentant les en-têtes ci-dessus, vous ajouterez une couche de sécurité. Si vous gérez un site commercial, vous pouvez également envisager d’utiliser un cloud-WAF comme SUCURI pour protéger votre activité en ligne. L’avantage de SUCURI est qu’il offre à la fois sécurité et performance.

Si vous optez pour le WAF de SUCURI, vous trouverez une section d’en-têtes supplémentaires sous l’onglet Pare-feu >> Sécurité.

sucuri-secure-headers