NGINX
Par ce salop de FanfanlaTulipe, corrigé par ce salop de fl0w5
Nginx (s'écrit aussi NGINX, nginx ou NginX) est un serveur web qui peut servir de reverse-proxy, load-balancer ou mail-proxy. Nous verrons ici l'installation du service ainsi que sa configuration selon les recommandations de l'ANSSI.
Installation
L'exemple d'installation sera fait sur une machine Debian.
apt install nginx
apt install nginx-extras # pour cacher le header de signature
systemctl status nginx # On vérifie que le service fonctionne.
Architecture du service :
├── conf.d
├── fastcgi.conf
├── fastcgi_params
├── koi-utf
├── koi-win
├── mime.types
├── modules-available
├── modules-enabled
│ └── [...]
├── nginx.conf # Fichier de configuration du service
├── proxy_params
├── scgi_params
├── sites-available # Dossier contenant tous les sites
│ ├── default
│ └── my_site.conf
├── sites-enabled # Dossier contenant des liens symboliques vers les sites visibles
│ └── my_site.conf -> /etc/nginx/sites-available/my_site.conf
├── snippets
│ ├── fastcgi-php.conf
│ └── snakeoil.conf
├── uwsgi_params
└── win-utf
On travaillera principalement sur :
nginx.conf
pour les configurations générales.- les fichiers de configuration des sites.
Configuration
nginx.conf
nginx.conf
représente le fichier de configuration globale.
http {
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
ssl_protocols TLSv1.2 TLSv1.3; # On accepte que les protocoles TLS récents
ssl_prefer_server_ciphers on; # On force l'utilisation des ciphers du serveur
error_log /var/log/nginx/error.log notice; # On est le plus verbose possible dans les logs
gzip on;
}
Le site
Dans sites-available
se trouve les configurations des sites. La convention veut que seuls des liens symboliques soit présents dans sites-enabled
vers les sites "activés".
# On fait ses configurations pour cacher l'utilisation dans les headers d'un serveur nginx
server_tokens off; # cache le numéro de version dans les headers
more_set_headers 'Server'; # cache le header Server
add_header X-XSS-Protection "1: mode=block" always; # évite les attaques XSS
add_header X-Frame_Options "SAMEORIGIN" always; # évite le 'clickjacking'
add_header Permission-Policy ""; # on utilise pas d'API
add_header Content-Security-Policy "default-src 'self';" always; # On précise que tout le contenu du site proviendra de la même origine. Cette option est très souvent retirée car trop restrictive.
add_header X-Content-Type-Options "nosniff" always; # évite le 'sniffing' sur IE et Chrome
# Serveur HTTP classique, redirigeant sur le serveur HTTPS
# Pour des raisons évidentes, l'utilisation de HTTP est limitée au minimum.
server {
listen 80; # IPv4, on écoute sur le port 80, http par défaut
listen [::]:80; # IPv6
return 301 https://$host$request_uri; # On redirige le client vers la même page en https.
}
# Exemple de serveur reverse-proxy sur HTTPS
server {
listen 443 ssl; # IPv4, on écoute sur le port HTTPS (443)
listen [::]:443; # IPv6
server_name wiki.salo.pe; # Ce serveur répond au host 'wiki.salo.pe'
location / { # Pour n'importe quel fichier demandé
proxy_pass http://localhost:8080/; # On redirige la requete vers localhost sur le port 8080 en HTTP
}
ssl_certificate <chemin vers le certificat>; # On spécifie le certificat
ssl_certificate_key <chemin vers la clé privée>; # et sa clé privée
ssl_protocols TLSv1.2 TLSv1.3; # On n'autorise que les protocoles récents
ssl_prefer_server_ciphers on; # On force l'utilisation de nos ciphers
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA HIGH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
ssl_stapling on; # On active la réponse OCSP
ssl_stapling_verify on; # et on la vérifie
add_header Strict-Transport-Security "max-age=63072000" always; # On active HSTS contre les attaques d'Homme-du-Milieu
}
# Exemple de serveur web HTTPS
server {
listen 443 ssl;
listen [::]:443;
server_name grosse.salo.pe;
root /var/www/html; # On spécifie la racine du serveur
index index.html; # On spécifie le fichier par défaut
error_page 404 /error_404.html; # On change la page 404
location /error_404.html { # et on spécifie sa localisation
root /etc/nginx/ressources;
internal;
}
ssl_certificate <chemin vers le certificat>; # On spécifie le certificat
ssl_certificate_key <chemin vers la clé privée>; # et sa clé privée
ssl_protocols TLSv1.2 TLSv1.3; # On n'autorise que les protocoles récents
ssl_prefer_server_ciphers on; # On force l'utilisation de nos ciphers
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA HIGH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
ssl_stapling on; # On active la réponse OCSP
ssl_stapling_verify on; # et on la vérifie
add_header Strict-Transport-Security "max-age=63072000" always; # On active HSTS contre les attaques d'Homme-du-Milieu
}