Nginx
如何讓 nginx 記錄使用的 SSL/TLS 協議和密碼套件?
我的目標是確保連接到我的 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"