security-headers: module NGINX pour l'envoi d'en-têtes de sécurité
Installation
Vous pouvez installer ce module dans n'importe quelle distribution basée sur RHEL, y compris, mais sans s'y limiter :
- RedHat Enterprise Linux 7, 8, 9 et 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 et Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-security-headers
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-security-headers
Activez le module en ajoutant ce qui suit en haut de /etc/nginx/nginx.conf :
load_module modules/ngx_http_security_headers_module.so;
Ce document décrit nginx-module-security-headers v0.3.0 publié le 15 février 2026.
Ce module NGINX ajoute des en-têtes de sécurité et supprime les en-têtes non sécurisés, de la bonne manière (c).
Synopsis
http {
security_headers on;
...
}
L'exécution de curl -IL https://example.com/ renverra les en-têtes de sécurité ajoutés :
HTTP/1.1 200 OK Server: nginx Date: Tue, 21 May 2019 16:15:46 GMT Content-Type: text/html; charset=UTF-8 Vary: Accept-Encoding Accept-Ranges: bytes Connection: keep-alive X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff Referrer-Policy: strict-origin-when-cross-origin Cross-Origin-Resource-Policy: same-site Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
En général, le module permet d'envoyer des en-têtes HTTP de sécurité d'une manière qui respecte mieux les normes.
Par exemple, l'en-tête Strict-Transport-Security ne doit pas être envoyé pour les requêtes HTTP simples.
Le module suit cette recommandation.
Remarque importante sur Strict-Transport-Security
Le module ajoute plusieurs en-têtes de sécurité, y compris Strict-Transport-Security.
Notez que preload est envoyé dans la valeur de cet en-tête, par défaut.
Cela signifie que Chrome peut et inclura vos sites Web dans sa liste de préchargement de domaines qui sont uniquement HTTPS.
C'est généralement ce que vous voulez de toute façon, mais gardez à l'esprit que dans certains cas particuliers, vous voudrez accéder à un sous-domaine via une connexion non chiffrée.
Si vous êtes absolument sûr que tous vos domaines et sous-domaines utilisés avec le module fonctionneront principalement sur HTTPs, procédez sans étape supplémentaire.
Si vous n'êtes pas sûr d'avoir ou d'avoir besoin d'accéder à vos sites Web ou à l'un de ses sous-domaines via
le protocole HTTP non sécurisé, assurez-vous que security_headers_hsts_preload off; dans votre configuration avant de jamais
démarrer NGINX avec le module pour éviter que votre domaine soit préchargé par Chrome.
Caractéristiques clés
- Plug-n-Play : l'ensemble par défaut des en-têtes de sécurité peut être activé avec
security_headers on;dans votre configuration NGINX - Envoie uniquement des en-têtes de sécurité pour les types pertinents, sans les envoyer pour d'autres, par exemple
X-Frame-Optionsest inutile pour CSS - Fonctionne bien avec les requêtes
GETconditionnelles : les en-têtes de sécurité ne sont pas inclus inutilement - Ne souffre pas des pièges de la directive
add_header - Cache
X-Powered-Byet d'autres en-têtes qui divulguent souvent des informations sur la version du logiciel - Cache complètement l'en-tête
Server, pas seulement les informations de version
Directives de configuration
security_headers
- syntax:
security_headers on | off - default:
off - context:
http,server,location
Active ou désactive l'application des en-têtes de sécurité. L'ensemble par défaut comprend :
X-Frame-Options: SAMEORIGINReferrer-Policy: strict-origin-when-cross-originX-Content-Type-Options: nosniffCross-Origin-Resource-Policy: same-site
L'en-tête obsolète X-XSS-Protection est activement supprimé par défaut.
Les valeurs de ces en-têtes (ou leur inclusion) peuvent être contrôlées avec d'autres directives security_headers_* ci-dessous.
hide_server_tokens
- syntax:
hide_server_tokens on | off - default:
off - context:
http,server,location
Active la dissimulation des en-têtes qui divulguent des informations sur le logiciel :
ServerX-Powered-ByX-Page-SpeedX-Varnish
Il convient de noter que certains de ces en-têtes ont une utilisation fonctionnelle, par exemple, les docs X-Page-Speed mentionnent :
... il est utilisé pour éviter les boucles infinies et les réécritures inutiles lorsque PageSpeed récupère des ressources d'une origine qui utilise également PageSpeed
Il est donc préférable de spécifier hide_server_tokens on; dans les instances NGINX exposées, par exemple
celles accessibles par de véritables navigateurs, et non celles consommées par Varnish ou d'autres logiciels.
Dans la plupart des cas, vous serez juste bien avec security_headers on; et hide_server_tokens on;, sans ajustements.
Pour un réglage fin, utilisez les directives spécifiques aux en-têtes ci-dessous.
Une valeur spéciale omit désactive l'envoi d'un en-tête particulier par le module (utile si vous souhaitez laisser votre application backend l'envoyer).
security_headers_xss
- syntax:
security_headers_xss off | on | block | omit | unset - default:
unset - context:
http,server,location
Contrôle l'en-tête X-XSS-Protection.
unset(par défaut) : Supprime activement l'en-tête des réponses, y compris tout en-tête défini par des serveurs en amont. C'est le paramètre recommandé car l'en-tête est obsolète et introduit des vulnérabilités XSS dans les navigateurs qui le prennent en charge.omit: N'ajoute ni ne supprime l'en-tête ; permet aux en-têtes en amont de passer sans changement.off: EnvoieX-XSS-Protection: 0pour désactiver explicitement le filtrage XSS du navigateur.on: EnvoieX-XSS-Protection: 1.block: EnvoieX-XSS-Protection: 1; mode=block.
security_headers_frame
- syntax:
security_headers_frame sameorigin | deny | omit - default:
sameorigin - context:
http,server,location
Contrôle l'inclusion et la valeur de l'en-tête X-Frame-Options.
La valeur spéciale omit désactivera l'envoi de l'en-tête par le module.
security_headers_referrer_policy
- syntax:
security_headers_referrer_policy no-referrer | no-referrer-when-downgrade | same-origin | origin | strict-origin | origin-when-cross-origin | strict-origin-when-cross-origin | unsafe-url | omit - default:
strict-origin-when-cross-origin - context:
http,server,location
Contrôle l'inclusion et la valeur de l'en-tête Referrer-Policy.
La valeur spéciale omit désactivera l'envoi de l'en-tête par le module.
security_headers_corp
- syntax:
security_headers_corp same-site | same-origin | cross-origin | omit - default:
same-site - context:
http,server,location
Contrôle l'inclusion et la valeur de l'en-tête Cross-Origin-Resource-Policy.
Cet en-tête contrôle comment vos ressources peuvent être intégrées par d'autres origines.
La valeur spéciale omit désactivera l'envoi de l'en-tête par le module.
Le choix par défaut same-site est un choix sûr qui empêche l'intégration inter-sites tout en permettant les requêtes de même site.
security_headers_coop
- syntax:
security_headers_coop same-origin | same-origin-allow-popups | unsafe-none | omit - default:
omit - context:
http,server,location
Contrôle l'inclusion et la valeur de l'en-tête Cross-Origin-Opener-Policy.
Cet en-tête contrôle les relations d'ouverture de fenêtres entre origines.
La valeur spéciale omit désactivera l'envoi de l'en-tête par le module.
Le choix par défaut est omit car activer cet en-tête peut casser les modèles de communication popup/window.opener.
Activez-le explicitement uniquement si vous comprenez les implications.
security_headers_coep
- syntax:
security_headers_coep require-corp | credentialless | unsafe-none | omit - default:
omit - context:
http,server,location
Contrôle l'inclusion et la valeur de l'en-tête Cross-Origin-Embedder-Policy.
Cet en-tête contrôle l'intégration de ressources inter-origines.
La valeur spéciale omit désactivera l'envoi de l'en-tête par le module.
Le choix par défaut est omit car activer cet en-tête peut casser les sites qui chargent des ressources tierces
(analytique, actifs CDN, publicités) sans en-têtes CORS appropriés.
Isolation inter-origines
Pour activer l'isolation inter-origines (nécessaire pour SharedArrayBuffer et des minuteries haute résolution),
configurez les trois en-têtes inter-origines :
security_headers on;
security_headers_corp same-origin;
security_headers_coop same-origin;
security_headers_coep require-corp;
Avertissement : Cette configuration cassera le chargement de toutes les ressources inter-origines qui ne le permettent pas explicitement via CORS.
GitHub
Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-security-headers.