Nginx

如何讓 nginx 記錄使用的 SSL/TLS 協議和密碼套件?

  • August 13, 2014

我的目標是確保連接到我的 nginx 的客戶端的適當安全性。我正在按照Mozilla 的指南在我的 nginx 安裝上正確配置 TLS,但我沒有對實際使用的實際協議/密碼套件有一個概述。

我現在擁有的:

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

有了這個,我想記錄哪個 SSL 協議用於連接,以及在客戶端/伺服器協商後選擇了什麼密碼套件。例如:

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"

通過這種方式,我可以快速辨識使用過時瀏覽器或不支持 PFS 或其他相關安全啟用技術的自動化機器的客戶端。

如何配置 nginx 來記錄這些資訊?

添加$ssl_cipher到您的log_format配置中。

有關所有 SSL 相關變數,請參閱http://nginx.org/en/docs/http/ngx_http_ssl_module.html#variables

例子

log_format在上下文中定義一個自定義http(例如/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"';

以上是基於預設combined格式加上'$ssl_protocol/$ssl_cipher '一行。

然後在server上下文(啟用 SSL)中添加access_log具有自定義日誌格式的指令:

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

重啟 nginx 後,日誌顯示如下:

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"

引用自:https://serverfault.com/questions/620123