Optimiser et sécuriser ses sites avec Nginx

Écrit par fdgeek
12 minutes
Optimiser et sécuriser ses sites avec Nginx

Comparativement au serveur web Apache, un des gros avantages de Nginx (Engine X) réside dans sa configuration centralisée.

En effet, avec Apache les instructions et les directives doivent se faire à la fois :

  • dans le fichier de configuration principal (httpd.conf)
  • dans les fichiers des VirtualHosts
  • au niveau des répertoires avec les fichiers .htaccess

A contrario, avec Nginx, tout se gère au niveau du fichier de configuration général (nginx.conf) et dans les VirtualHosts (fichiers de configuration de sites). Terminé donc, la pléthore de fichiers .htaccess à gérer sur votre espace web. Grâce à Nginx ils sont purement et simplement ignorés. Toutes vos directives présentent dans ces fichiers .htaccess devront donc être adaptées et intégrées dans vos VirtualHosts.

Il existe d'ailleurs pour cela un outil en ligne gratuit (Htaccess to Nginx Converter) qui permet, en y copiant vos instructions .htaccess de les traduire en expressions compatibles avec Nginx.

En plus de gérer bien plus efficacement les requêtes et les processus mémoire, ce sont cette simplicité et cette approche globale de la configuration qui font le succès de Nginx.

Toutefois, et si comme-moi vous aimez que tout soit propre et bien rangé, il est possible d'utiliser Nginx avec des fichiers de configuration séparés sous forme d'inclusion.

Tout l'intérêt des inclusions est de garder vos VirtualHosts les plus légers et lisibles possibles. D'autre part, vous gagnerez du temps dans le paramétrage, notamment si vous hébergez plusieurs sites sur le même serveur. En outre, posséder des fichiers de configuration séparés et dévolus à des tâches bien spécifiques me paraît plus logique et plus pratique.

Exemple : Un fichier de configuration dédié à la sécurité, un fichier de configuration dédié à la compression, un autre dédié aux redirections, un dédié uniquement à des sites Wordrpess, etc....

1) Le fichier de configuration générale de Nginx :

Certaines valeurs de bases déclarées dans le fichier /etc/nginx/nginx.conf peuvent être personnalisées. Par exemple, vous pouvez adapter la directive "worker_processes" et la directive "worker_connections" afin de tirer pleinement partie de votre matériel :

worker_processes 4; # précise le nombre de Cores Processeur
worker_connections 1024; # Définie le nombre connections simmultanées

Au passage, sécurisez un peu votre serveur Nginx en modifiant la directive "Server_Tokens" pour masquer le numéro de version utilisée.

 server_tokens off; 
# Ainsi, vous empêchez curieux de savoir quelle est la version de Nginx.
# On enregistre et on quitte l'éditeur Nano :
CTRL+O
CTRL+X

La plupart du temps, une fois le fichier de configuration général de Nginx paramétré, vous ne devriez plus avoir à y toucher.

2) La création de fichiers de configuration à inclure:

Dans le répertoire de Nginx (/etc/nginx) vous trouverez, un sous-répertoire /snippets (qui peut se traduire par "extraits" ou "petits bouts"). C'est dans ce répertoire que nous allons centraliser nos fichiers de configuration spécifiques.

Pour exemple, créons un fichier de configuration (gzip.conf) dédié à l'activation et l'optimisation de la compression Gzip ; ceci afin d’accélérer les accès à votre site en délivrant aux navigateurs des fichiers plus légers.

# création d'un fichier gzip.conf
sudo nano /etc/nginx/snippets/gzip.conf

Paramétrage des directives Gzip :

# Directives Gzip :

gzip on; # Activation de la compression Gzip
gzip_disable        "msie6"; # désactivée pour les anciens navigateurs
gzip_http_version       1.1;
gzip_comp_level           6; # Niveau de compression (de 1 à 9)
gzip_min_length         256; # taille minimale des fichiers à compresser
gzip_buffers          16 8k; # Nombre et taille des tampons (ex: 32 4K)
gzip_proxied            any;
gzip_vary                on;

gzip_types # Types de fichiers à compresser
application/atom+xml
application/javascript
application/json
application/ld+json
application/manifest+json
application/rss+xml
application/vnd.geo+json
application/vnd.ms-fontobject
application/x-font-ttf
application/x-web-app-manifest+json
application/xhtml+xml
application/xml
font/opentype
image/bmp
image/svg+xml
image/x-icon
text/cache-manifest
text/css
text/plain
text/vcard
text/vnd.rim.location.xloc
text/vtt
text/x-component
text/x-cross-domain-policy;

Petite précision au sujet du niveau de compression : plus il est élevé, plus il est consommateur de ressources. Un niveau de compression à 9 n'apportera peut être pas de gain réel comparé aux ressources utilisées. (En règle générale, une valeur de 5 ou de 6 est un bon compromis).

Vous pouvez tester l'efficacité et le gain apporté par la compression Gzip à cette adresse :

Tester son site internet sur Pingdom.com

# Enregitrez et quittez l'éditeur Nano :
CTRL+O
CTRL+X

Continuons avec la création d'un fichier de configuration dédié lui, à la protection des sites internet via l'activation de Headers (en-têtes HTTP). L'implémentation de ces headers indique aux navigateurs internet d'activer ces fonctionnalités de protection. (Celles-ci sont généralement prises en charge par la majorité des navigateurs récents).

On crée donc un fichier nommé par exemple : headers_secure.conf

# création d'un fichier headers_secure.conf
sudo nano /etc/nginx/snippets/headers_secure.conf

Puis on y déclare les directives "Headers" suivantes:

# Directives headers

 add_header X-Frame-Options "SAMEORIGIN" always; # Protection contre le click-jacking
 add_header X-Content-Type-Options nosniff; # Vérification stricte des types MIME
 add_header X-XSS-Protection "1; mode=block"; # Active les filtres anti-XSS des navigateurs
 add_header Referrer-Policy "same-origin" always;
# Le header suivant impose l'utilisation exclusive du protocole HTTPS
# (A utiliser ou pas en fonction de votre site) 
 add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
# Le header suivant désactive certaines fonctionnalités web matérielles
# (Fonctionnalités à choisir selon votre site)
 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;";
 add_header Content-Security-Policy "default-src 'self' data: http: https: 'unsafe-inline' 'unsafe-eval;" always;

# Enregitrez et quittez l'éditeur Nano :
CTRL+O
CTRL+X

3) Inclusion des fichiers de configuration :

Maintenant que nos fichiers sont crées, voyons comment les utiliser avec la directive "include" au sein d'un VirtualHost.

Ouvrez avec l'éditeur Nano le fichier de configuration du site pour lequel vous souhaitez utiliser vos configurations personnalisées :

# Edition du fichier de configuration d'une site
sudo nano /etc/nginx/sites-available/www.monsite.conf

Et rajoutez-y au sein du bloc serveur (dans notre cas)  les lignes "include" pointant vers les fichiers de configuration que nous venons de créer:

#
# Déclaration du serveur
# Server www.monsite.fr
#
server {
        listen 80;
        listen [::]:80;

        server_name www.monsite.fr; # Votre nom de domaine correpondant
        root /var/www/html/monsiteperso;# Répertoire du site

        include /etc/nginx/snippets/headers_secure.conf; # Activation des headers HTTP
        include /etc/nginx/snippets/gzip.conf; # Activation de la compression Gzip

        location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
        expires 30d;
        add_header Pragma public;
        add_header Cache-Control "public";

Une fois vos inclusions rajoutées, enregistrez et quittez

# Enregitrez et quittez l'éditeur Nano :
CTRL+O
CTRL+X

Puis relancer votre serveur Nginx afin que les modifications soient prises en compte et testez la présence d'éventuelles erreurs:

# Redémarrage du serveur Nginx :
sudo service nginx restart
# Test de la configuration de Nginx :
sudo nginx -t

Si tout est bon (message : "test is successful"), utilisez alors la commande Curl pour afficher le détail des nouveaux paramètres pris en compte :

# test de son site avec Curl :
curl -H "Accept-Encoding: gzip" -I www.monsite.fr

Vous devriez avoir une réponse énumérant votre configuration concernant les en-têtes http et la compression Gzip.

# exemple de réponse :
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 25 Feb 2019 16:45:59 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: Bludit
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Referrer-Policy: same-origin
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;
Content-Security-Policy: default-src 'self' data: http: https: 'unsafe-inline' 'unsafe-eval;
Content-Encoding: gzip

Voilà, maintenant que vous avez compris le principe de la commande "include" avec Nginx, libre à vous de l'exploiter comme bon vous semble afin d'optimiser votre site et votre serveur Nginx.

Soyez tout de même conscient que trop de fichiers inclus pourraient au final nuire aux performances. Il faut donc trouver le juste milieu entre un fichier VirtualHost très fournit (difficilement lisible) et des fichiers de configuration bien identifiés et facilement intégrables (une seule ligne avec la directive "include).

Mais quoiqu'il en soit, l'activation de Gzip et des Headers de protection permettent déjà à votre site de gagner en rapidité et en sécurité.

A bientôt.