Mise en place des headers pour Nginx |
Article original Publié le : 26 janvier 2018
Mise a jour le : – |
Suite a la mise en place d’un site avec Nginx, il manque des headers pour plus de sécurité comme on peux le constater depuis le site securityheaders ou j’obtiens un D.
Pour la partie certificat/cipher depuis ssllabs je suis en A
Pour la correction, c’est dans le vhost du site que ça se passe et dans le block suivant
1 2 3 4 5 6 |
server { listen 443 ssl http2; server_name site.domaine.local; access_log /var/log/nginx/site.access.log; error_log /var/log/nginx/site.error.log; ... |
1 – Strict-Transport-Security
Ajouter la directive suivante
1 |
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; |
Le paramètre includeSubDomains est facultatif et indique au navigateur que la stratégie HSTS s’applique également à tous les sous-domaines du domaine actuel.
Le paramètre always garantit que l’en-tête est défini pour toutes les réponses.
Plus d’info: https://www.nginx.com/blog/http-strict-transport-security-hsts-and-nginx/
2 – X-XSS-Protection
Ajouter la directive suivante
1 |
add_header X-Xss-Protection "1; mode=block" always; |
Le cross-site scripting est un type de faille de sécurité des sites web permettant d’injecter du contenu dans une page.
Plus d’info: https://www.kiwii.ch/fr/marketing-digital/securiser/verifier-securite-entetes-http/
3 – X-Content-Type-Options
Ajouter la directive suivante
1 |
add_header X-Content-Type-Options "nosniff" always; |
L’en-tête X-Content-Type-Options vous permet de rejeter des éléments avec des types MIME incorrects.
Plus d’info: https://www.noobunbox.net/serveur/securite/securiser-https-nginx
4 – X-Content-Type-Options
Ajouter la directive suivante
1 |
add_header Feature-Policy "midi none;notifications none;push none;sync-xhr none;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"; |
L’entête Feature-Policy permet aux propriétaires de sites d’activer et de désactiver des fonctionnalités de navigateur et des API spécifiques, exemple la camera, micro … Sur l’entête ci dessous,je désactive toutes les fonctionnalités non nécessaires à mon site.
Plus d’info: https://fearby.com/article/set-up-feature-policy-referrer-policy-and-content-security-policy-headers-in-nginx/ et https://scotthelme.co.uk/a-new-security-header-feature-policy/ ou https://zinoui.com/blog/security-http-headers#feature-policy
5 – Referrer-Policy
Ajouter la directive suivante
1 |
add_header Referrer-Policy "same-origin" always; |
Donne le contrôle de la valeur de référence.
Plus d’info: https://www.kiwii.ch/fr/marketing-digital/securiser/verifier-securite-entetes-http/
6 – Content-Security-Policy
Ajouter la directive suivante
1 |
add_header Content-Security-Policy "default-src 'self' https: data: 'unsafe-inline' 'unsafe-eval';" always; |
ou
1 |
add_header Content-Security-Policy "default-src 'self' ; frame-src 'self' ; child-src 'self' ; img-src 'self' data: http: https: ; style-src 'self' data: http: https: 'unsafe-inline' ; script-src 'self' data: http: https: 'unsafe-inline' 'unsafe-eval';"; |
Autre façon en autorisant les domaines en fonction des destinations comme par cette exemple ci dessous provenant de https://stackoverflow.com/questions/50260092/nginx-content-security-policy-header-still-blocking-bootstrapcdn
1 2 3 4 5 6 7 8 9 |
set $CSP_image "img-src 'self' 'unsafe-inline' 'unsafe-eval' data: *.printfriendly.com *.w.org *.gravatar.com *.vimeocdn.com; "; set $CSP_script "script-src 'self' 'unsafe-inline' 'unsafe-eval' *.w.org *.gravatar.com *.googleapis.com *.jsdelivr.net *.printfriendly.com *.kxcdn.com *.vimeocdn.com *.hs-analytics.net *.securitymetrics.com *.google-analytics.com; "; set $CSP_style "style-src 'self' 'unsafe-inline' *.googleapis.com *.bootstrapcdn.com *.gstatic.com *.vimeocdn.com; "; set $CSP_font "font-src 'self' data: *.googleapis.com *.bootstrapcdn.com *.gstatic.com *.googleapis.com; "; set $CSP_frame "frame-src 'self' *.vimeocdn.com *.vimeo.com; "; set $CSP_object "object-src 'self' ; "; set $CSP "default-src 'self' ; ${CSP_image} ${CSP_script} ${CSP_style} ${CSP_font} ${CSP_frame} ${CSP_object}"; add_header Content-Security-Policy $CSP; |
La partie que j’ai du mal a configurer, Content Security Policy est un mécanisme de sécurité permettant de restreindre l’origine du contenu tel qu’un script Javascript, des images, des CSS, etc…
Plus d’info: https://content-security-policy.com/ et https://www.kiwii.ch/fr/marketing-digital/securiser/verifier-securite-entetes-http/
Après les modifications, je rescan et finalement j’obtiens un A sur securityheaders et A+ sur ssllabs
Autres liens
https://blog.dareboost.com/fr/2017/09/hsts-fiabiliser-connexions-securisees/
https://memo-linux.com/securiser-son-site-web-sous-nginx-avec-lajout-den-tetes-headers/