Como posso permitir que o nginx registre o protocolo SSL / TLS e o ciphersuite usados?

24

Meu objetivo é garantir a segurança adequada para os clientes que se conectam ao meu nginx. estou seguindo o guia da Mozilla para configurar o TLS corretamente na minha instalação do nginx, mas não tenho uma visão geral dos protocolos / ciphersuites atuais 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 a negociação do cliente / servidor. 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"

Dessa forma, posso identificar rapidamente os clientes que estão usando navegadores desatualizados ou máquinas automatizadas que não oferecem suporte ao PFS ou outras tecnologias relevantes de ativação de segurança.

Como faço para configurar o nginx para registrar essas informações?

gertvdijk
fonte

Respostas:

43

Adicione $ssl_cipherà sua log_formatconfiguração.

Consulte http://nginx.org/en/docs/http/ngx_http_ssl_module.html#variables para todas as variáveis ​​relacionadas ao SSL.

Exemplo

Defina um costume log_formatno httpcontexto (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 combinedformato padrão com uma '$ssl_protocol/$ssl_cipher 'linha adicional .

Em seguida, adicione em um servercontexto (com SSL ativado) a access_logdiretiva com o formato de log personalizado:

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

Após reiniciar o nginx, os logs 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"
praseodym
fonte