Learning Objectives
- 列出資安日誌應記錄的事件與欄位,以及不應記錄的資料
- 說明時間同步與日誌完整性對調查的影響
- 以過濾與彙總從存取日誌找出撞庫、注入嘗試與資料外洩的痕跡,並建立時間軸
- 調整偵測規則,說明誤報與漏報之間的取捨
資安日誌的用途
校園網站的管理者接到通知,部分成績資料可能已經外流。接下來需要回答的問題很具體:事情從何時開始、來源是哪裡、使用了哪個帳號、取走了多少資料、現在是否仍在進行。這些問題能否回答,取決於事件發生之前系統記錄了什麼。
OWASP Top 10:2025 將「安全日誌與告警失效」列為第 9 項,並指出缺少日誌與監控時,攻擊與入侵無從偵測;缺少告警時,事件發生當下很難快速回應。
日誌的作用有三項:偵測(發現正在發生的異常)、調查(事後重建經過與影響範圍)、問責(確認操作由誰執行)。日誌本身不會阻止攻擊,它的價值在於縮短發現問題所需的時間,以及讓後續的處置有依據。
本課的模擬環境。 本課的日誌由程式產生,帳號、事件與 IP 全部虛構。分析真實系統的日誌需要取得管理者的授權,日誌本身也可能含有個人資料(第 1 課)。
應記錄的事件與欄位
OWASP Logging Cheat Sheet 建議記錄的事件包括:輸入驗證失敗、認證的成功與失敗、授權失敗、工作階段管理失敗、應用程式錯誤、啟動與關閉,以及高風險操作,例如使用者管理、管理員操作、敏感資料的存取、資料匯入與匯出、檔案上傳。
每一筆事件應該能回答四個問題:
| 問題 | 欄位範例 |
|---|---|
| 何時(when) | 事件時間、紀錄時間、串連同一次互動的識別碼 |
| 何處(where) | 應用程式名稱與版本、主機、服務、網址與 HTTP 方法 |
| 誰(who) | 來源位址、使用者身分(已登入或已知時) |
| 什麼(what) | 事件類型、嚴重程度、結果、原因、回傳的狀態碼 |
不應直接記錄的資料同樣重要。日誌通常保存較久、存取的人也較多,一旦寫入敏感資料,日誌本身就成為外洩的來源。OWASP 列舉的項目包括密碼、存取權杖、工作階段識別碼(需要追蹤時可以記錄雜湊值)、資料庫連線字串、加密金鑰、付款卡資料、健康資料與身分證號等敏感個人資料。姓名、電話、信箱與內部網路名稱與位址對調查有用,但要特別處理,必要時去識別化。
實作上還有一個容易忽略的細節:使用者偶爾會把密碼誤填到帳號欄位。若登入失敗時原樣記錄帳號欄位,密碼就可能進入日誌。
時間同步與日誌完整性
時間同步。 調查經常要比對網站、資料庫、防火牆與認證服務的日誌。若各機器的時鐘不同步,事件的先後順序就可能判斷錯誤。OWASP 的建議是同步所有伺服器與裝置的時間,實務上通常使用 NTP;無法同步的來源,例如使用者裝置,則嘗試估計時間差或標註時間的可信度。本平台與本課的日誌都以 UTC 記錄,顯示時才轉換為當地時間。
日誌完整性。 入侵者可能修改或刪除紀錄,所以日誌需要受到保護:
- 紀錄盡早傳送到另一台主機或唯讀媒體,應用程式主機被入侵時紀錄才不會一併遭到竄改
- 使用只能附加的儲存方式,並設置竄改偵測
- 限制讀取權限,記錄對日誌的存取
- 偵測日誌停止寫入的情況,這本身也可能是攻擊的跡象
- 依規定的期限保存,不提早銷毀,也不超過期限保留
日誌注入。 日誌常常包含使用者輸入。若輸入含有換行字元,攻擊者可以偽造看起來正常的紀錄。OWASP 建議中和 CR、LF 與分隔字元,優先使用 JSON 等結構化格式,並限制寫入的長度。這與第 7、8 課是同一類問題:資料被當成了結構的一部分。
常見攻擊在日誌中的特徵
下列特徵可以作為調查的起點。它們只是線索,每一項都可能由正常行為造成,判定前要結合其他資料。
| 活動 | 常見特徵 | 可能的正常解釋 |
|---|---|---|
| 撞庫(credential stuffing,第 5 課) | 同一來源短時間內大量登入失敗,涉及許多不同帳號 | 宿舍或校園網路共用一個對外 IP |
| 暴力破解 | 同一帳號反覆失敗 | 使用者忘記密碼、裝置儲存了舊密碼 |
| SQL 注入嘗試(第 7 課) | 查詢參數含單引號與 SQL 關鍵字,語句連續變化,伴隨 5xx 錯誤 | 姓名含撇號的正常搜尋 |
| 資料外洩 | 匯出端點被連續存取,傳輸量明顯高於平常,帳號的來源改變 | 教師的正常匯出 |
調查的基本作法是:先彙總找出異常的來源,再逐筆確認內容,把關鍵事件排成時間軸。時間軸要能看出因果順序,例如「取得帳號」發生在「匯出資料」之前。
偵測規則與告警
人工逐筆閱讀只適用於事後調查。平時需要由程式依規則發出告警,例如「同一來源在 10 分鐘內登入失敗達到 20 次」。規則的判斷有四種結果:
| 實際是攻擊 | 實際是正常行為 | |
|---|---|---|
| 發出告警 | 偵測成功 | 誤報(false positive) |
| 沒有告警 | 漏報(false negative) | 正確不告警 |
降低門檻會減少漏報,但誤報增加;提高門檻則相反。兩者不能同時任意降低,要依代價決定。誤報的代價不只是浪費時間:OWASP 指出,過多誤報會使重要告警難以分辨,真正的威脅因此較晚被注意或遭到忽略。漏報的代價則是攻擊持續進行而沒有人知道。
改變門檻之外,也可以改變規則觀察的角度。下方的練習提供兩種規則:計算失敗次數,以及計算不同帳號數。
重點整理
- 日誌用於偵測、調查與問責,本身不會阻止攻擊
- 記錄認證、授權失敗、高風險操作等事件,並能回答何時、何處、誰、什麼
- 密碼一律不記錄;權杖、工作階段識別碼、連線字串與敏感個人資料不以明文記錄
- 時間要同步,日誌要防止竄改與注入,也要偵測日誌停止寫入的情況
- 特徵只是線索,判定前要比對其他資料並建立時間軸
- 誤報與漏報之間存在取捨;任何單一規則都有盲點,分散式活動不會在以來源為單位的規則中出現
- 沒有告警不代表沒有事件:部分攻擊不會在一般日誌留下痕跡(第 18 課的 Heartbleed)
下一課討論確認發生事件之後的處理流程。
小測驗
工程師為了除錯,把整個登入請求的內容寫入日誌。這樣做的主要問題是什麼?
網站主機與資料庫主機的時鐘相差 5 分鐘,對事件調查的主要影響是什麼?
日誌中出現一筆查詢 /courses?q=O'Brien,狀態碼 200。可以得到什麼結論?
把偵測規則的門檻從 20 次降到 5 次,最可能的結果是什麼?
日誌欄位含有使用者輸入時,為什麼要中和換行字元?
下列關於集中式日誌與告警的敘述,何者正確?