web-dev-qa-db-fra.com

Comment puis-je laisser nginx enregistrer le protocole SSL / TLS et la suite de chiffrement utilisés?

Mon objectif est d'assurer une sécurité adéquate pour les clients se connectant à mon nginx. Je suis le guide de Mozilla pour configurer TLS correctement sur mon installation de nginx, mais je n'ai pas un aperçu des protocoles/ciphersuites réels utilisés dans la pratique.

Ce que j'ai maintenant:

server {
    listen 443;
    ssl on;
    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;
    ssl_dhparam /path/to/dhparam.pem;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'the_long_ciphersuite_listed_there';
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:50m;
}

Avec cela, je voudrais enregistrer quel protocole SSL a été utilisé pour une connexion et quelle ciphersuite a été choisie après la négociation client/serveur. Par exemple.:

10.1.2.3 - - [13/Aug/2014:12:34:56 +0200] "GET / HTTP/1.1" 200 1234 "-" "User agent bla"

à

10.1.2.3 - - [13/Aug/2014:12:34:56 +0200] ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 "GET / HTTP/1.1" 200 1234 "-" "User agent bla"

De cette façon, je peux identifier rapidement les clients qui utilisent des navigateurs obsolètes ou des machines automatisées qui ne prennent pas en charge PFS ou d'autres technologies d'activation de sécurité pertinentes.

Comment configurer nginx pour enregistrer ces informations?

25
gertvdijk

Ajoutez $ssl_cipher À votre configuration log_format.

Reportez-vous à http://nginx.org/en/docs/http/ngx_http_ssl_module.html#variables pour toutes les variables liées à SSL.

Exemple

Définissez un log_format Personnalisé dans le contexte http (par exemple /etc/nginx/nginx.conf):

log_format combined_ssl '$remote_addr - $remote_user [$time_local] '
                        '$ssl_protocol/$ssl_cipher '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent"';

Ce qui précède est basé sur le format combined par défaut avec une ligne '$ssl_protocol/$ssl_cipher ' Supplémentaire.

Ajoutez ensuite dans un contexte server (avec SSL activé) la directive access_log Au format de journal personnalisé:

server {
  listen 443;
  ssl on;
  access_log /var/log/nginx/access.log combined_ssl;
  [...]
}

Après avoir redémarré nginx, les journaux apparaissent comme:

10.1.2.3 - - [13/Aug/2014:12:34:56 +0200] TLSv1.2/ECDHE-RSA-AES128-GCM-SHA256 "GET / HTTP/1.1" 200 1234 "-" "User agent bla"
46
praseodym