2013-10-09 73 views
8

我需要啓用訪問日誌,但出於合規性原因,無法在訪問日誌中記錄敏感的GET請求參數數據。雖然我知道,我可以解析日誌(事後)並對其進行清理,但這不是一個可接受的解決方案 - 因爲出於兼容性原因,日誌不能被篡改。如何不在nginx訪問日誌中記錄獲取請求參數?

http://www.example.com/resource?param1=123&sensitive_param=sensitive_data

如何防止被寫入日誌的「sensitive_data」參數值?這裏有一些想法:

  • 在POST請求中發送 - 不是JSONP的選項。
  • 對「資源」使用新的位置規則,並設置訪問日誌以使用使用不同格式(即不使用$ remote_addr)的log_format。請參考以下內容以供參考:http://nginx.org/en/docs/http/ngx_http_log_module.html
  • 記錄$ sanitized_remote_addr,並將其設置爲(在某種程度上解析$ remote_addr或其他內容?),然後將其記錄到日誌中。我們不確定這是否容易完成。

這應該怎麼辦?

+1

您也可能要考慮[nginx的爲mod_security的(http://www.modsecurity.org/projects/modsecurity/nginx/)看看吧在[naxsi項目](https://github.com/nbs-system/naxsi) –

回答

1

我到目前爲止找到的解決方案是here。總之:

location /any_sensitive... { 
    # Strip password in access.log 
    set $temp $request; 
    if ($temp ~ (.*)password=[^&]*(.*)) { 
     set $temp $1password=****$2; 
    } 

    log_format filter '$remote_addr - $remote_user [$time_local] ' 
     '"$temp" $status $body_bytes_sent "$http_referer" "$http_user_agent"'; 

    access_log logs/access.log filter; 
} 

也許這個曾經在某些時候工作,現在它說:

nginx: [emerg] unknown "temp" variable 

nginx: [warn] the "log_format" directive may be used only on "http" level in ... 
+0

也許如果它只是一個/兩個日誌文件,您可以使用管道並使用監聽這些文件的篩選器清理輸出。過濾器可以寫入真實的日誌文件。 –

+3

不,你說得對,只要你在某個地方設置了變量,nginx就不應該抱怨一個未知的變量。我將你的答案改編成一個可行的解決方案,在這裏描述:https://github.com/sunlightlabs/congress/tree/master/config/nginx#suppressing-user-latitudelongitude-in-our-logs – Konklone

4

以前的答案是行不通的,因爲log_format模塊只能使用在http級別配置。

爲了解決這個問題,我們可以從location指令中刪除log_format配置,並將它保留在http級別配置中。

http { 

    log_format filter '$remote_addr - $remote_user [$time_local] ' 
     '"$temp" $status $body_bytes_sent "$http_referer" "$http_user_agent"'; 

    # Other Configs 
} 

log_format指令可以在後面我們location指令塊定義的變量。

所以最後設置的樣子:

http { 

    log_format filter '$remote_addr - $remote_user [$time_local] ' 
     '"$temp" $status $body_bytes_sent "$http_referer" "$http_user_agent"'; 

    # Other Configs 

    server { 
     #Server Configs 
     location/{ 
      set $temp $request; 
      if ($temp ~ (.*)password=[^&]*(.*)) { 
       set $temp $1password=****$2; 
      } 

      access_log /opt/current/log/nginx_access.log filter; 
     } 
    } 
} 
相關問題