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
Article intéressant, je viens d’appliquer cela sur mon site.merci
Bonjour,
Petite question dans le cas de multiples domaines, peut on autoriser des IP: *192.168.1.1 (par exemple)
Merci
Vincent
Bonjour Vincent,
le plus simple est d’autoriser les domaines, exemple : Content-Security-Policy: default-src ‘self’ *.domaine.tld;