
我們有一個 nginx 伺服器,在某些情況下,它會接收 HTTP 用戶名字段中的敏感資料。更具體地說,它是客戶端發送的 API 金鑰,例如curl -u "$API_KEY:" ...
.
預設的 nginx access_log 格式包括 $remote_user,它將整個客戶端 API 金鑰寫入存取日誌並使用敏感資料污染該檔案。我知道我可以定義一個不同的 log_format 來完全省略 $remote_user 變量,但是我可以看到至少有一個關於客戶端是誰的提示對於日誌關聯或事件響應非常有幫助。有沒有辦法設定 nginx 在存取日誌中儲存 $remote_user 的嚴重截斷副本,而不是客戶端的完整值? (即ABCDEFGH12345678
成為ABCD*
或類似的東西。)
(不用說,我不想破壞 WSGI 後端進行身份驗證所依賴的實際 REMOTE_USER 類型變數。)
這是 nginx 1.10.3,在預設的 Debian Stretch 儲存庫中提供。
答案1
您可以使用 map 指令根據一個變數設定另一個變數。
我還沒有測試過這個,所以不確定 Nginx 是否能很好地處理{,9}
我的正則表達式語法的一部分,所以你可能需要稍微調整它,但是這樣的東西應該給你一個帶有remote_user變量的前9個字元的變量,編輯你的日誌格式以包含 truncated_user 變數。
map $remote_user $truncated_user {
~* ^(.{,9}).* $1;
}
答案2
@miknik 的答案幾乎有效,但需要進行一些調整和實驗才能真正使其發揮作用。我最終使用的完整配置是:
http {
[...]
map $remote_user $truncated_remote_user {
"~^(?P<tu>.{0,6}).*" $tu;
default -;
}
log_format combined_trunc '$remote_addr - $truncated_remote_user [$time_local] '
'"$request" $status $body_bytes_sent "$http_referer" '
'"$http_user_agent"';
[...]
server {
[...]
access_log /path/to/access.log combined_trunc;
[...]
}
}