「寫 Log」是很有效的線上系統偵錯手段,就像飛機黑盒子或行車記錄器,能在事故發生後提供寶貴資訊,釐清肇事原因,還能用於責任歸屬舉證。例如:
- 系統不定期爆炸,由 Log 歸納每次發生在某使用者進行某項操作之後
- 客戶否認下單,調閱 Log 舉證登入時間,來源 IP 以及操作順序,萬一客訴鬧上法院還可當作呈堂證供
- 資料庫發生 Deadlock,由 Log 找出事件當下兩名使用者執行的作業及輸入參數,鎖定可疑 SQL 語法進行調查
簡單來說,愈重要的網站系統愈需要 Log 機制協助維運,而 Log 該保存什麼內容,視作業性質而定,不外乎時間、IP 來源、使用者身分、操作參數… 等。而Log 儲放位置有很多選擇,本機檔案、Log 資料庫、Log 伺服器… 等。其中以本機檔案執行成本低、速度快,不易故障,可靠性最高,是最常見的 Log 選項。
Image by thom
由於 Log 會內含機敏資訊,若是處理不慎,Log 檔可能成為營運機密或個資洩漏的源頭。前陣子剛好看到營運資料透過 Log 檔在網站裸奔的案例,猜想有些開發朋友還沒意識到這類潛在風險。本文將整理我所想到處理網站 Log 常犯的錯誤及其可能衍生的資安風險:
未排除個資或機密資訊
以事後偵察的角度,保留資訊愈完整,愈能還原現場,故開發人員有時會將所有輸入參數與輸出結果都留在 Log 裡,但這裡有個常犯錯誤,機密敏感資料例如:身分證號、密碼、銀行帳號、信用卡號、地址、電話… 等也被寫入 Log,而系統管理者處理 Log 檔的資安敏感度不如原始碼、資料庫嚴謹,導致 Log 檔案外流的機率較其餘二者為高,一旦 Log 檔落入賊人之手,其中的個資會惹來無窮麻煩。
解決之道在於調整程式邏輯,排除個資或機密資料,若必須保留也請打上馬賽克,例如:身分證號寫成 A12XXXXX89,密碼只留頭尾一碼(甚至全部遮罩),電話號碼改成 0937XXX123,信用卡號改成 1234-XXXX-XXXX-5678。不保留完整內容,在某些情境會影響還原現場的完整度,但必須取捨,依實務經驗,即使參數被馬賽克,仍可從相關資訊識別請求來源,應付大部分偵錯需求綽綽有餘。衡量其風險及必需性,針對機密或個資,強烈建議排除或馬賽克處理。
將 Log 檔直接放在網站目錄下
有些開發者選擇在網站資料夾下開個 Log 之類子錄(例如:wwwroot\MyApp\Log)放記錄檔。將存取 Log 跟網站放在一起,相關資訊集中管理貌似天經地義,但要當心一個天大陷阱: 一旦 Log 路徑及檔名被惡意人士掌握,對方開個瀏覽器輸入 URL 就能光明正大將 Log 下載回去把玩,要是 Log 還包含個資、帳號密碼、交易內容... 事情就大條了。說不定接著會上演「黑先生,您最近有在我們網站買了一本單元測試的藝術 [第二版],因系統問題被設成 12 期分期每月扣款,需要您到 ATM 機器解除設定...」
因此,除了個資及敏感內容要馬賽克,也請不要將 Log 放在可直接下載的資料夾範圍。一般來說,外界很難得知 Log 路徑檔名,但無法排除以下狀況:
- 取得原始碼或網站檔案備份
- 由其他網站或測試台觀察到目錄結構
- 使用讀心術、通靈術瞎猜矇到
一旦路徑被掌握加上 Log 附檔名是網站允許的 MIME 型別(例如: .txt),後果會十分慘烈,不可不慎。如果一定要集中放在網站目錄,請設定排除規則禁止外部透過 GET/POST 該路徑下的內容,或是善用 ASP.NET 的 App_Data 隱身特性,但強烈建議在網站目錄之外為 Log 另開專屬目錄存放更安全。
備份與複製檔案時未排除 Log
在實務上,基於管理、偵錯需求有時我們需要備份或複製整個網站或整台主機檔案,對於程式檔案管理者的警覺性不像對待資料庫或資料檔那麼高規格,加上沒有意識到包含商業機密的 Log 檔案也在其中,備份檔可能被放在不夠安全地方且未嚴格限定存取,導致 Log 內容外流。
依我的經驗 ,備份或複製網站程式檔較常發生(換版前備份、複製到其他主機重現問題),將 Log 移出網站資料夾,除非備份整顆硬碟或刻意選取 Log 資料夾執行,Log 被意外備份或複製的機率可大幅下降。這也是我強烈建議另外為 Log 建立專屬資料夾的理由,除了避免不小心被備份或複製,管理者操作時能更明確認知到他在處理包含營運資訊的內容(前題是要有 Log 會內含機密資訊的認知),而不是當成程式有所輕忽。
非必要的偵錯詳細資訊
這個是較罕見的低級錯誤,我曾見過開發者為了偵錯時能萬無一失,居然在 Log 檔中印出資料庫連線字串備查。(我的老天鵝)
敢這麼做多半基於一個假設: Log 檔永遠被會嚴加保管,限制管理者存取。理應如此,但你知道的,實務上總會有豬隊友,有意外。面對資安議題,永遠假設機制會失靈,人為必有疏失就對了。決定要在 Log 寫入機密資料前,若評估一旦外洩會有嚴重後果,除非有絕對理由必須承擔此風險,否則別這麼做。
最後總結處理網站 Log 的幾點資安原則:
- 排除機密敏感內容,若必須保留要加馬賽克
- 避免允許使用者透過網站直接下載 Log 檔
- 為 Log 另建專屬資料夾避免因備份或複製而外流
- 開發者及系統管理者應建立 Log 可能內含機密資訊的認知
- 永遠假設 Log 可能外流,避免寫入非必要的機密資訊