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 des différents HTTP Headers(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
- Certaines 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
- Après l'implémentation, vous pouvez utiliser l'outil en ligne Secure Headers pour vérifier les résultats.
Commençons... 👨💻
Sécurité stricte du transport HTTP
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 permet d'éviter les invitations à cliquer sur HTTPS et de rediriger les demandes 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 au navigateur que les requêtes ne sont disponibles que via HTTPS. |
includeSubDomains | La configuration est également valable pour le sous-domaine. |
précharge | 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 que le système de sécurité de
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"
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é
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é que s'il provient du même site. |
REFUSER | 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 "REFUSER"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
L'
en-tête ajoute toujours X-Frame-Options DENY
Nginx
Ajoutez la ligne suivante dans nginx.conf
directive/bloc du serveur sous
add_header X-Frame-Options "DENY" (en anglais)
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é
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
Jeu d'en-têtes 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
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 des 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 encore 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 | Chargez uniquement les scripts à partir d'une source définie |
L'exemple suivant montre comment tout charger à partir 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 efficaces
Jeu d'en-têtes 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 les en-têtes de réponse HTTP pour votre site respectif dans le gestionnaire IIS et ajoutez ce qui suit
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 (politiques interdomaines autorisées)
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 sur un domaine croisé. 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
Nginx
Et, disons que vous avez besoin d'implémenter master-only alors ajoutez ce qui suit dans nginx.conf
sous le bloc serveur
add_header X-Permitted-Cross-Domain-Policies master-only
Et le résultat
Politique de référence
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 la mise en œuvre
Referrer-Policy prend en charge la syntaxe suivante
Valeur | Description |
non-référent | 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. |
même origine | Le référent ne sera envoyé que pour le même site d'origine. |
origine stricte | n'est envoyé que si le protocole est HTTPS |
origine stricte quand l'origine est croisée | l'URL complète sera envoyée via un protocole strict tel que HTTPS |
origine | envoyer l'URL d'origine dans toutes les demandes |
l'origine quand l'origine croisée | 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"
Et après le redémarrage, vous devriez avoir dans les en-têtes de réponse
Nginx
Supposons que vous ayez besoin d'implémenter la même origine, alors vous devez ajouter ce qui suit
add_header Referrer-Policy same-origin
Une fois configuré, vous devriez obtenir les résultats ci-dessous
Attendez-CT
Un nouvel en-tête, encore à l'état expérimental, indique 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. |
faire respecter | Directive facultative permettant d'appliquer la politique. |
rapport-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
Header set Expect-CT 'enforce, max-age=43200, report-uri="https://somedomain.com/report"'
Et voici le résultat
Nginx
Et 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
Politique de permissions
Connue auparavant sous le nom de Feature-Policy, elle a été renommée Permissions-Policy avec des fonctionnalités améliorées. Vous pouvez consulter document du ce 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
Server : Apache/2.4.37 (centos)
Permissions-Policy : fullscreen 'none' ; microphone 'none'
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
Connection : 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 la 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
Server : Apache/2.4.37 (centos)
Permissions-Policy : 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
Connection : 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
Connection : 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 le 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 le reste. 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
Server : 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
Connection : Keep-Alive
Content-Type : text/html ; charset=UTF-8
ou, pour tout effacer
L'
en-tête est 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
Connection : 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é