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

24

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 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?

gertvdijk
la source

Réponses:

44

Ajoutez $ssl_cipherà votre log_formatconfiguration.

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

Exemple

Définissez une coutume log_formatdans le httpcontexte (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 combinedformat par défaut avec une '$ssl_protocol/$ssl_cipher 'ligne supplémentaire .

Ensuite, ajoutez dans un servercontexte (avec SSL activé) la access_logdirective avec le 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"
praséodyme
la source