Vendredi 23 novembre 2018

Nginx + SSL + header + diffie-hellmann

Structure serveur nginx

/etc/nginx/
├── conf.d/
│   ├── xinyiczen.xyz.conf
│   └── xinyiczen.xyz.d/
├── dh_param
├── fastcgi.conf
├── fastcgi.conf.default
├── fastcgi_params
├── fastcgi_params.default
├── header_params
├── koi-utf
├── koi-win
├── mime.types
├── mime.types.default
├── nginx.conf
├── nginx.conf.default
├── scgi_params
├── scgi_params.default
├── ssl_params
├── uwsgi_params
├── uwsgi_params.default
└── win-utf

ssl
Il faut préalablement demander des certificats (ca+key) SSL pour le domaine auprès d’une autorité de certification (let’s encrypt ou autre)
Le fichier de configuration
sudo nano /etc/nginx/ssl_params

    ssl_certificate /etc/ssl/private/xinyiczen.xyz-fullchain.pem;
    ssl_certificate_key /etc/ssl/private/xinyiczen.xyz-key.pem;
    ssl_session_timeout 5m;
    ssl_session_cache shared:SSL:50m;
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ALL:!aNULL:!eNULL:!LOW:!EXP:!RC4:!3DES:+HIGH:+MEDIUM;

Entêtes
Le fichier de configuration
sudo nano /etc/nginx/header_params

    #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
    add_header Strict-Transport-Security "max-age=31536000;";

    #se protéger contre le détournement de clic (clickjacking) 
    add_header X-Frame-Options "SAMEORIGIN" always;

    #faire une vérification stricte des types Mime. Elle n’accepte qu’une seule directive : nosniff.
    add_header X-Content-Type-Options nosniff;

    #activer les filtres anti-xss incorporés dans certains navigateurs.
    add_header X-XSS-Protection "1; mode=block";

    #CSP permet d’autoriser seulement les domaines déclarés à exécuter du script JavaScript, une feuille de style css, etc.
    # Content-Security-Policy : https://openweb.eu.org/articles/content-security-policy
    add_header Content-Security-Policy "default-src 'self'";

    # Désactiver les références pour les navigateurs qui ne prennent pas en charge strict-origin-when-cross-origin
    # Referrer-Policy : https://scotthelme.co.uk/a-new-security-header-referrer-policy/
    # Utilise strict-origin-when-cross-origin pour les navigateurs qui le font
    add_header Referrer-Policy "no-referrer, strict-origin-when-cross-origin";

Diffie-Hellmann
Générer une clé Diffie-Hellmann
En cryptographie, l’échange de clés Diffie-Hellman, du nom de ses auteurs Whitfield Diffie et Martin Hellman, est une méthode par laquelle deux agents nommés conventionnellement A etB peuvent se mettre d’accord sur un nombre (qu’ils peuvent utiliser comme clé pour chiffrer la conversation suivante) sans qu’un troisième agent appelé D puisse découvrir le nombre, même en ayant écouté tous leurs échanges.

ATTENTION : Génération clé Diffie-Hellmann très très longue en temps , 30 minutes minimum…

Générer une clé openssl dhparam -out /etc/ssl/private/dh4096.pem -outform PEM -2 4096
Déplacer la clé dans le répertoire
sudo mv dh4096.pem /etc/ssl/private/
Droits pour root
sudo chmod 600 /etc/ssl/private/dh4096.pem
Le fichier de configuration
sudo nano /etc/nginx/dh_param

    # Uncomment the following directive after DH generation
    # > openssl dhparam -out /etc/ssl/private/dh4096.pem -outform PEM -2 4096
    ssl_dhparam /etc/ssl/private/dh4096.pem;

Configuration de base avec SSL et sécurité + letsencrypt (renouvellement)
sudo nano /etc/nginx/conf.d/xinyiczen.xyz.conf

server {
    listen 80;
    listen [::]:80;

    ## redirect http to https ##
    return  301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name xinyiczen.xyz;

    ####    Locations
    # On cache les fichiers statiques
    location ~* \.(html|css|js|png|jpg|jpeg|gif|ico|svg|eot|woff|ttf)$ { expires max; }
    # On interdit les dotfiles
    location ~ /\. { deny all; }

    include ssl_params;
    include header_params;
    include dh_param;

    root /var/www/ ;
    index index.php index.html index.htm;
        location ~ \.php$ {
           fastcgi_split_path_info ^(.+\.php)(/.+)$;
           fastcgi_pass unix:/run/php/php7.0-fpm.sock;    # PHP7.0 
           fastcgi_index index.php;
           include fastcgi_params;
	   fastcgi_param SCRIPT_FILENAME $request_filename;
        }

    include conf.d/xinyiczen.xyz.d/*.conf;

    access_log /var/log/nginx/xinyiczen.xyz-access.log;
    error_log /var/log/nginx/xinyiczen.xyz-error.log;
}

Vérifier
sudo nginx -t
Relancer
sudo systemctl restart nginx
Test redirection http/https avec curl depuis un poste distant

$ curl -I xinyiczen.xyz
HTTP/1.1 301 Moved Permanently
Server: nginx/1.13.5
Date: Wed, 04 Oct 2017 06:46:26 GMT
Content-Type: text/html
Content-Length: 185
Connection: keep-alive
Location: https://xinyiczen.xyz/

Tester le lien https://xinyiczen.xyz

Vérification headers https://securityheaders.io
Vérification complète https://observatory.mozilla.org/analyze.html?host=xinyiczen.xyz