Defense in Depth
Defense in Depth 的核心概念是讓單一控制失效不等於整體失守,做法是在同一條攻擊路徑上放置多個彼此獨立的控制。它的成立條件是各層真的獨立:任一層被繞過時,其餘各層仍然各自生效。多層控制若共用同一個前提,該前提失效時各層會同時失效,層數就只是表面上的。它處理的是失效發生前的機率,失效發生後的擴散範圍由 Blast Radius 承接。
概念位置
與 Blast Radius 對照最容易看清它的責任邊界:縱深防禦作用在事件發生前,降低單一失效演變成失守的機率;爆炸半徑作用在發生後,處理已經失守的擴散範圍。同一套分層設計通常兩者都要回答,但它們的驗收方式不同。
它常被用來為外層的弱控制辯護,例如客戶端的 Obfuscation 或前端的輸入檢查。這個辯護的成立與否可以實測:把外層刻意停掉,讓攻擊路徑跑一次,看內層自己擋不擋得住。沒跑過這一步時,「還有其他防線擋著」是推測而非事實,而推測在事件當下不提供任何保護。
可觀察訊號與例子
需要正視分層獨立性的訊號是各層控制共用同一個判斷依據。前端與後端都依賴同一個 session 判斷權限時,該 session 被偽造就同時通過兩層;多個服務用同一把密鑰互相驗證時,密鑰外洩讓所有驗證同時失效。
另一個訊號是層數增加但未被驗證。新增一層控制之後沒有測試「前一層失效時這一層是否生效」,這一層在真實事件中的表現無法預期,稽核清單上卻已經記了一筆。
反向的失效是把縱深當成弱控制的通行證。每一層都以「還有其他層擋著」為由降低自身標準時,總體防護會低於任何一層單獨承擔時的水準。
設計責任
設計時要為每一層寫下它獨立承擔什麼、以及它被繞過時哪一層接手。這份對照關係讓「還有其他防線」這個主張變成可查證的敘述,而非討論中的免責說法。
各層的失效條件要在該路徑所關注的威脅範圍內彼此不同。宿主作業系統、雲帳號、發佈管線這類共同前提無法消除,拿「有沒有任何共同前提」去審,任何分層都會被判成只有一層,這個標準沒有行動性。可操作的問法是限定在該路徑的攻擊者身上:他能不能用同一個動作繞過兩層。答案是能的時候,那兩層在這條路徑上算一層。
分層的成本要與風險相稱。每一層都帶來配置、監控與排障的持續負擔,層數的取捨依據是該路徑失守的後果,而非防護層數本身。