Jak mogę pozwolić, aby nginx rejestrował używany protokół SSL / TLS i oprogramowanie szyfrujące?

24

Moim celem jest zapewnienie odpowiedniego bezpieczeństwa klientom łączącym się z moim nginx. Postępuję zgodnie z instrukcjami Mozilli dotyczącymi prawidłowej konfiguracji TLS w mojej instalacji nginx, ale nie mam przeglądu faktycznych protokołów / szyfrów używanych w praktyce.

Co mam teraz:

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

W ten sposób chciałbym zarejestrować, który protokół SSL został użyty do połączenia i jakie oprogramowanie szyfrujące zostało wybrane po negocjacjach klient / serwer. Na przykład:

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

do

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"

W ten sposób mogę szybko zidentyfikować klientów korzystających z przestarzałych przeglądarek lub automatów, które nie obsługują PFS ani innych odpowiednich technologii zabezpieczających.

Jak skonfigurować nginx do rejestrowania tych informacji?

gertvdijk
źródło

Odpowiedzi:

44

Dodaj $ssl_cipherdo swojej log_formatkonfiguracji.

Zobacz http://nginx.org/en/docs/http/ngx_http_ssl_module.html#variables dla wszystkich zmiennych związanych z SSL.

Przykład

Zdefiniuj niestandardowy log_formatw httpkontekście (np. /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"';

Powyższe opiera się na domyślnym combinedformacie z dodatkową '$ssl_protocol/$ssl_cipher 'linią.

Następnie dodaj w serverkontekście (z włączonym SSL) access_logdyrektywę o niestandardowym formacie dziennika:

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

Po ponownym uruchomieniu nginx dzienniki wyglądają następująco:

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
źródło