Como posso deixar que o nginx registre o protocolo SSL / TLS usado e o ciphersuite?

22

Meu objetivo é garantir segurança adequada aos clientes que se conectam ao meu nginx. Estou seguindo o guia da Mozilla para configurar o TLS corretamente na instalação do nginx, mas não tenho uma visão geral do real protocolos / ciphersuites sendo usados na prática.

O que eu tenho agora:

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;
}

Com isso, gostaria de registrar qual protocolo SSL foi usado para uma conexão e qual ciphersuite foi escolhido após o cliente / servidor ser negociado. Por exemplo:

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

para

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"

Desta forma, posso identificar rapidamente clientes que utilizam navegadores desatualizados ou máquinas automáticas que não suportam PFS ou outras tecnologias relevantes de ativação de segurança.

Como configuro o nginx para registrar essas informações?

    
por gertvdijk 13.08.2014 / 13:57

1 resposta

36

Adicione $ssl_cipher à sua configuração log_format .

Consulte o link para todas as variáveis relacionadas ao SSL.

Exemplo

Defina um log_format personalizado no contexto http (por exemplo, /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"';

O acima é baseado no formato padrão combined com uma linha '$ssl_protocol/$ssl_cipher ' adicional.

Em seguida, adicione em server contexto (com SSL ativado) a diretiva access_log com o formato de registro personalizado:

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

Depois de reiniciar o nginx, os registros aparecem como:

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"
    
por 13.08.2014 / 14:43