Configuration nginx

fichier /etc/nginx/ssl_dh_headers_ocsp

  • Les certificats Let’s Encrypt du domaine dans /etc/ssl/private/
  • Remplacer le domaine xoyize.xyz par le votre
  • Diffie-Hellman : openssl dhparam -out /etc/ssl/private/dh2048.pem -outform PEM -2 2048
    ssl_certificate /etc/ssl/private/xoyize.xyz-fullchain.pem;
    ssl_certificate_key /etc/ssl/private/xoyize.xyz-key.pem;
    ssl_session_timeout 5m;
    ssl_session_cache shared:SSL:50m;

    # As suggested by Mozilla : https://wiki.mozilla.org/Security/Server_Side_TLS and https://en.wikipedia.org/wiki/Curve25519
    ssl_ecdh_curve secp521r1:secp384r1:prime256v1;
    ssl_prefer_server_ciphers on;

    # Ciphers with modern compatibility
    ssl_protocols TLSv1.3 TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';

    # Diffie-Hellman (DH)
    ssl_dhparam /etc/ssl/private/dh2048.pem;

    # Follows the Web Security Directives from the Mozilla Dev Lab and the Mozilla Obervatory + Partners
    # https://wiki.mozilla.org/Security/Guidelines/Web_Security
    # https://observatory.mozilla.org/ 
    more_set_headers "Strict-Transport-Security : max-age=63072000; includeSubDomains; preload"; 
    more_set_headers "Content-Security-Policy : upgrade-insecure-requests";
    more_set_headers "Content-Security-Policy-Report-Only : default-src https: data: 'unsafe-inline' 'unsafe-eval'";
    more_set_headers "X-Content-Type-Options : nosniff";
    more_set_headers "X-XSS-Protection : 1; mode=block";
    more_set_headers "X-Download-Options : noopen";
    more_set_headers "X-Permitted-Cross-Domain-Policies : none";
    more_set_headers "X-Frame-Options : SAMEORIGIN";

    
    # OCSP settings
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/ssl/private/xoyize.xyz-ca.pem;
    resolver 127.0.0.1 127.0.1.1 valid=300s;
    resolver_timeout 5s;

Le fichier est à inclure dans tous les fichiers de configuration des VHOST , exemple

/etc/nginx/conf.d/sub.xoyize.xyz.conf 
server {
    listen 80;
    listen [::]:80;

    ## redirect http to https ##
    server_name sub.xoyize.xyz;
    return  301 https://$server_name$request_uri;
}

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

    include ssl_dh_headers_ocsp;

    location / {
	proxy_pass http://192.168.0.45:4040;
    }

}

Que sont les dossiers de la CAA ?

CAA signifie “Certificate Authority Authorization” et est un type spécial d’enregistrement DNS qui indique quelles autorités de certification peuvent émettre des certificats pour votre domaine et sous-domaines. Il a également une méthode d’envoi d’alertes chaque fois qu’une autorité de certification reçoit une demande pour un nouveau certificat qui est interdit selon vos dossiers CAA.

DNS OVH → Domaines (sélectionner le domaine) → Zone DNSAjouter une entrée de type CAA

    3600 IN CAA    0 issue "letsencrypt.org"

Vérification : CAA record check

SSL cipher dh

Modifier le fichier /etc/nginx/conf.d/default.conf ou le fichier de configuration du VHOST

    # certificats ssl let's encrypt
    ssl_certificate /etc/ssl/private/xinyiczen.xyz.crt.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;

    # Clé Diffie-Hellman (DH)
    ssl_dhparam /etc/ssl/private/dh4096.pem;

OCSP Stapling (Online Certificate Status Protocol )

Mise en place de l’OCSP Stapling (Online Certificate Status Protocol ) sur NGINX
On va télécharger les certificats que Let’s Encrypt utilise pour signer les certificats qu’il délivre.
Let’s Encrypt utilise uniquement Let’s Encrypt Authority X3 pour signer les certificats et garde Let’s Encrypt Authority X4 en cas de problèmes. X1 et X2 ne sont plus utilisés.
Intégration de X3 et X4 dans un fichier par concaténation :

cd /etc/ssl/private
rm -f ocsp-certs.pem
wget -O- https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem https://letsencrypt.org/certs/lets-encrypt-x4-cross-signed.pem | tee -a ocsp-certs.pem > /dev/null

Modification du fichier de configuration principal /etc/nginx/nginx.conf:

nano /etc/nginx/nginx.conf

Et ajoutez ceci dans la balise http { :

    ##OCSP settings
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/ssl/private/ocsp-certs.pem;
    # Facultatif (utiise par défaut les DNS contenus dans resolv.conf)
    #resolver 8.8.4.4 8.8.8.8 valid=300s;
    #resolver_timeout 5s;

headers

Tout ce qui suit peut être à l’intérieur d’un fichier .conf situé soit sous /etc/nginx/conf.d ou dans le cas d’une installation yunohost , sous /etc/nginx/conf.d/domaine.tld.d/
domaine.tld est à remplacé par le nom du domaine déclaré à l’installation de yunohost

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… (ici domaine xinyiczen.xyz et uniquement en https)

Content Security Policy

    ## CSP nginx
    # add_header Content-Security-Policy "default-src 'self' *.xinyiczen.xyz; img-src 'self' data: https: *.xinyiczen.xyz"; # TROP BLOQUANT
    add_header Content-Security-Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'";

X-Frame-Options

    # autoriser uniquement les Iframes provenant du même domaine
    add_header X-Frame-Options SAMEORIGIN;

X-XSS-Protection

    # activer la protection contre les attaques Xss et MIME
    add_header X-XSS-Protection "1; mode=block";

X-Content-Type-Options

    add_header X-Content-Type-Options nosniff;

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 (headers) :

curl -I https://xinyiczen.xyz

Résultat :

HTTP/1.1 200 OK
Server: nginx/1.10.1
Date: Thu, 24 Nov 2016 09:14:27 GMT
Content-Type: text/html
Content-Length: 868
Last-Modified: Wed, 23 Nov 2016 19:43:09 GMT
Connection: keep-alive
ETag: "5835f14d-364"
Strict-Transport-Security: max-age=31536000;includeSubDomains
Content-Security-Policy: default-src 'self' *.xinyiczen.xyz; img-src 'self' data: https: *.xinyiczen.xyz
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Accept-Ranges: bytes

Liens