具代表性的面試主題

系統設計面試:如何設計防竄改稽核日誌服務?

系統設計困難
OfferCC 編輯團隊發佈 更新

題幹

為安全與合規調查設計多租戶稽核日誌服務。請說明事件模型、接入持久性、防竄改證據、存取控制、保留、查詢隔離、匯出和故障處理。

題目與範圍

設計多租戶稽核日誌服務,記錄登入、權限變更、資料存取和設定更新等安全與合規動作。調查人員需要可搜尋歷史和可驗證匯出,同時日誌故障不能讓一般業務悄悄遺失關鍵證據。

先定義完整性承諾。AWS CloudTrail 描述可搜尋的不可變事件歷史,OpenTelemetry 提供結構化日誌模型;兩者都不能證明事件在產生前就一定真實。答案要說清系統能證明什麼。

面試官考察什麼

面試官考察持久接入、追加寫入、完整性驗證、租戶隔離、保留策略和運維權衡。好的回答會把稽核證據與一般除錯日誌分開,並解釋過載時如何避免安全事件遺失或被修改。

作答前需要確認的問題

  • 哪些動作必須記錄,事件每秒量和突發量是多少?
  • 需要的是可發現竄改、抗竄改,還是外部可證明?
  • 稽核事件無法接收時,業務請求必須失敗嗎?
  • 每個租戶保留多久,法律保全是否覆蓋刪除?
  • 誰能查詢、匯出或驗證其他租戶資料?
  • 調查人員需要哪些查詢維度和匯出格式?

30 秒回答框架

「我會提供區域接入 API 和本地持久緩衝,讓業務請求不依賴搜尋索引。每條事件包含租戶、操作者、動作、目標、請求關聯、事件時間、接收時間、Schema 版本和來源。按租戶與時間分區寫入追加日誌並跨故障域複製,再透過雜湊鏈或簽名段清單偵測後續修改。近期事件進入熱索引,舊段進入不可變保留。查詢和匯出按租戶授權、保留與法律保全執行,並輸出可驗證清單。監控接收與丟棄、延遲、完整性檢查和匯出完成率。」

分步深入

第一步:定義事件契約

要求事件 ID、租戶 ID、操作者和認證上下文、動作、目標、結果、來源服務、請求 ID、事件時間、接收時間、Schema 版本和必要屬性。不要把密鑰和無關載荷寫入記錄,使用引用或脫敏摘要。

第二步:分離接收與索引

只有事件進入持久緩衝或複製日誌後才回傳成功。消費者非同步建構搜尋索引和匯出。這樣搜尋叢集故障不會靜默刪除證據,也不會讓每個業務請求等待索引完成。

第三步:讓完整性可驗證

規範化事件,用前一事件或段根計算雜湊,並週期性簽名或把清單錨定到獨立信任域。保存序列缺口和驗證結果。雜湊鏈能發現接收後的修改,但不能證明上游服務發出的內容本身真實。

text
append(event):
    canonical = canonicalize(event)
    record.hash = H(previous_hash || canonical)
    durable_log.append(record)
    return accepted(record.event_id, record.hash)

第四步:分區與複製

按租戶和時間分區,用雜湊或租戶鍵分散熱點租戶。按持久性目標跨故障域複製後再確認。保留租戶內或聚合內順序即可,除非確有必要,不要承諾全域順序。

第五步:建構熱搜尋與冷保留

近期事件進入調查索引,舊段壓縮到不可變物件儲存。索引必須能從日誌重建。保留任務遵守租戶策略和法律保全;刪除可以留下可稽核的策略記錄,但不保留受保護載荷。

第六步:執行存取與匯出控制

每次查詢按租戶、角色、用途和時間範圍授權。查詢和匯出本身也記錄為稽核事件。匯出生成簽名清單,包含篩選條件、事件數、段雜湊和時間戳,接收方可驗證完整性。

第七步:定義故障和過載行為

選擇有界本地緩衝、背壓和關鍵事件策略。非關鍵遙測可以採樣或延遲;安全事件則拒絕原始變更,或路由到隔離應急通道。只有易失記憶體暫存時,不能向呼叫方報告已接收。

第八步:運作信任邊界

監控接入延遲、持久確認耗時、消費者延遲、拒絕事件、序列缺口、雜湊失敗、索引新鮮度、匯出耗時和保留錯誤。限制密鑰存取、輪換簽名密鑰、測試復原和驗證,並記錄「稽核系統的稽核」。

高品質示範回答

「我會把稽核日誌視為獨立證據系統。業務服務產生帶事件 ID、租戶、操作者、驗證上下文、動作、目標、結果、請求 ID 與 Schema 版本的規範事件;事件進入跨故障域複寫的持久日誌後才確認接收,搜尋索引與匯出由非同步消費者建立,索引遺失時可從證據日誌重建。

證據日誌按租戶與時間分段,保存前序雜湊並週期性簽章或錨定。查詢按租戶、角色、用途與時間範圍授權,查詢與匯出本身也寫入稽核;匯出包含篩選條件、事件數、段雜湊與簽章清單。安全事件在接入故障時進入有界應急通道或阻止原始高風險操作,不能只放在行程記憶體後就回報成功。維運上監控接入延遲、序號缺口、雜湊失敗、索引新鮮度、拒絕事件與保留錯誤,並定期演練索引重建、金鑰輪替和熱點租戶隔離。這個服務證明記錄在接收後是否保持完整,上游事件真實性仍依賴身分、授權與業務交易。」

常見錯誤

  • 在事件持久化前回報成功,行程結束後留下無聲缺口。
  • 把可修改的一般資料庫表或除錯日誌直接當成稽核證據。
  • 讓查詢索引成為唯一副本,索引損壞後無法重建。
  • 忽略查詢、匯出、保留策略變更與金鑰輪替本身也要稽核。
  • 聲稱雜湊鏈可以證明上游事件內容真實。

追問與應對

搜尋索引全部遺失怎麼辦?

保持證據日誌繼續接收,從不可變分段重建索引,並用事件數、序號與簽章清單驗證重建範圍。

稽核接入不可用時,業務是否繼續?

按事件關鍵性處理。一般低風險動作可以進入有界持久緩衝;無法可靠記錄的高風險安全動作應拒絕或進入隔離應急通道,不能靜默放行。

如何避免熱點租戶拖垮其他租戶?

按租戶與時間分區,設定接入、查詢與匯出配額,隔離消費者資源;壓力測試時同時驗證其他租戶的持久性與查詢服務等級目標。

如何處理隱私刪除與稽核保留衝突?

按法律保全與租戶策略區分欄位,優先保存去識別摘要或受控引用;執行刪除時同步處理索引、物件分段與備份,並保留可驗證的策略執行記錄。

公開來源

同類題目

相關面試工具

用 Solve 整理系統設計回答

從澄清需求開始,展開規模、架構、元件選擇和取捨。

查看工具