3

Sécuriser son site web sous nginx avec l’ajout d’en-têtes (headers)

Un petit mémo pour connaitre les en-têtes à ajouter dans la configuration du serveur web Nginx pour bloquer les attaques les plus courantes.

Effectivement, que ce soit un CMS ou un site développé entièrement à la main peut contenir des failles, qui peuvent être exploitées par des personnes malveillantes. Afin de se protéger des exploits les plus courants, il sera ajouter des en-têtes qui seront exécutées par le navigateur internet.

Les en-têtes sont soit ajoutées directement dans le fichier de configuration nginx.conf ou dans les différents « block server« . Un descriptif succinct est accompagné pour chaque en-tête.

X-Frame-Options

Cet en-tête permet de se protéger contre le détournement de clic (clickjacking) :

add_header X-Frame-Options "SAMEORIGIN" always;

X-Content-Type-Options

Cet en-tête permet de faire une vérification stricte des types Mime. Elle n’accepte qu’une seule directive : nosniff.

add_header X-Content-Type-Options nosniff;

X-XSS-Protection

Cet en-tête permet d’activer les filtres anti-xss incorporés dans certains navigateurs.

add_header X-XSS-Protection "1; mode=block";

CSP : Content-Security-Policy

L’en-tête CSP permet d’autoriser seulement les domaines déclarés à exécuter du script JavaScript, une feuille de style css, etc.
Exemple pour WordPress avec gestion de sous domaine et accès aux fonts google :

add_header Content-Security-Policy "default-src 'self' *.memo-linux.com; img-src 'self' data: http: https: *.memo-linux.com; font-src 'self' data: http: https: fonts.googleapis.com";

HSTS : HTTP Strict Transport Security

HSTS est un dispositif de sécurité par lequel un site web peut déclarer aux navigateurs qu’ils doivent communiquer avec lui en utilisant exclusivement le protocole HTTPS, au lieu du HTTP. De plus, cela permet d’éviter la réécriture de tous les chemins lorsqu’un site web passe au tout https.

add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";

Vérification de la mise en place des headers

Pour la prise en compte des ajouts dans la configuration du block serveur, il faut relancer le service nginx :

systemctl restart nginx

Avec l’aide de la commande curl, on va vérifier les différentes en-tètes :

curl -I https://memo-linux.com
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 04 Sep 2015 10:29:21 GMT
Content-Type: text/html; charset=UTF-8
Vary: Accept-Encoding
X-Pingback: https://memo-linux.com/xmlrpc.php
Content-Security-Policy: default-src 'self' *.memo-linux.com; img-src 'self' data: http: https: *.memo-linux.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.memo-linux.com; style-src 'self' 'unsafe-inline' http: https: fonts.googleapis.com; font-src 'self' data: http: https: fonts.googleapis.com
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Strict-Transport-Security: max-age=31536000; includeSubdomains
X-Varnish: 887463
Age: 0
Via: 1.1 varnish-v4
Connection: keep-alive

Pour plus d’infos : www.lexsi.com

Partager l'article :





fred

"Dire que l'on s'en fiche du droit à la vie privée sous prétexte qu'on a rien à cacher, c'est comme déclarer que l'on se fiche du droit à la liberté d'expression sous prétexte qu'on a rien à dire." Edward Snowden

3 commentaires

  1. Bonjour,
    Petite question dans le cas de multiples domaines, peut on autoriser des IP: *192.168.1.1 (par exemple)
    Merci
    Vincent

  2. Bonjour Vincent,
    le plus simple est d’autoriser les domaines, exemple : Content-Security-Policy: default-src ‘self’ *.domaine.tld;

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.