Bonjour à tous !
Ajourd'hui un article assez léger sur comment bien configurer son serveur nginx, et plus particulièrement la partie HTTPS. Par défaut la configuration est correcte mais propose des protocoles connus pour être peu robustes. Nous allons donc faire du hardenning pour notre reverse proxy préféré afin que celui-ci n'utilise que ce qu'il se fait de mieux à l'heure actuelle (juin 2017).
Les sites de test
Je vais prendre pour référence les deux sites de test de sécurité HTTPS suivants :
- SSLLabs connu pour son exigeance ;
- CryptCheck qui est encore plus exigeant (mais moins connu).
La configuration nginx
Voici le fichier de configuration ssl.conf. Ces lignes ne déclarent pas le certificat à utiliser (celui-ci change en fonction du site que je sers) mais comment servir le HTTPS aux clients. Ce fichier est donc suffisement générique pour pouvoir être inclu après avoir déclaré le bon certificat et la clé qui va avec.
# certs sent to the client in SERVER HELLO are concatenated in ssl_certificate ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; # modern configuration. tweak to your needs. ssl_protocols 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'; # 90 score SSL Labs ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL; # 100 score SSL Labs ssl_prefer_server_ciphers on; ssl_dhparam /etc/nginx/dhparam4096.pem; # openssl dhparam -out dhparam4096.pem 4096 ssl_ecdh_curve secp384r1; # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months) add_header Strict-Transport-Security max-age=15768000; # OCSP Stapling --- # fetch OCSP records from URL in ssl_certificate and cache them ssl_stapling on; ssl_stapling_verify on;
J'utilise cette configuration avec un certificat RSA 4096 bits signé par LetsEncrypt.
Les résultats
Dans le cadre de mes tests j'ai utilisé une machine EC2 sur AWS. L'adresse IP ainsi que le nom de domaine que vous verez dans les captures d'écran suivantes sont donc bidons et n'existeront sans doute plus d'ici quelques semaines.
On commence avec le plus connu et le « moins » exigeant, SSLLabs.
Puis on passe ensuite à l'étape supérieure avec le sévère CryptCheck.
Conclusion
On a un résultat assez sympa. Il ne faut cependant pas oublier de relativiser car la sécurité est un domaine qui bouge beaucoup.
Les critères de choix seront peut-être encore plus sévères d'ici quelques années même si du RSA 4096 bits semble assez solide. Le plus important est de ne jamais reposer sur ses acquis et de garder à l'esprit que la sécurité parfaite n'existe pas (il y en a juste des moins pires que d'autres !).