為什麼四眼檢查很危險

  1. 我為什麼寫這篇文章
  2. 批准疲勞的心理學
  3. 串通問題
  4. 虛假安全悖論
  5. 四眼檢查何時有效(何時無效)
  6. 更好的替代方案:自動化勝過人工勤勉
  7. 前進之路

四眼檢查無處不在。銀行要求大額交易的雙重批准。IT團隊在生產部署前強制要求同行審查。製造業要求品質檢查的雙重簽署。財務部門強制要求付款的雙重簽名。營運團隊要求兩名工程師批准基礎設施變更。邏輯看起來無懈可擊——兩個人審查同一個操作應該能發現錯誤並防止問題。

這種控制措施隨處可見。安全框架要求職責分離。DevOps實踐要求程式碼審查。製造業強制執行雙重品質檢查。製造商-檢查員流程跨越各個行業。兩雙眼睛審查關鍵操作應該為錯誤、詐欺和災難性錯誤提供強有力的保護。

但這種廣受信任的控制措施創造了危險的漏洞。組織實施四眼檢查並假設他們受到了保護。他們減少其他控制措施,相信雙重批准提供了足夠的安全性。這種虛假的信心創造了盲點,關鍵錯誤到達生產環境,安全漏洞通過程式碼審查,營運錯誤導致中斷。

我為什麼寫這篇文章

我看到四眼檢查在不同組織和環境中反覆失敗。一個關鍵的生產錯誤被兩名高級開發人員在程式碼審查中批准。一筆詐欺交易通過了雙重授權。一個基礎設施變更儘管有兩名工程師簽署,卻導致了重大中斷。每次,事後審查都揭示了相同的模式:兩個審查者都是橡皮圖章,沒有實際驗證。

我反覆看到的一個模式是組織將流程分解為多個子流程,每個都有自己的批准步驟。部署流程被分為:程式碼審查(兩次批准)、安全審查(兩次批准)、基礎設施審查(兩次批准)和最終部署批准(兩次批准)。八個人在四個階段批准同一個部署。組織相信這提供了深度防禦——多個檢查點捕獲不同的問題。

但這創造了相反的效果。每個審查者假設其他階段會捕獲問題。程式碼審查者假設安全審查會捕獲漏洞。安全審查者假設程式碼審查驗證了功能。基礎設施審查者假設前兩個階段都驗證了變更。最終批准者假設所有先前的批准意味著部署是安全的。沒有人進行全面審查,因為每個人都相信其他人已經做了。

子流程方法還分割了上下文。程式碼審查者看到程式碼變更但看不到基礎設施影響。基礎設施審查者看到配置變更但看不到業務邏輯。安全審查者看到潛在漏洞但看不到營運約束。每個子流程審查一個片段而不理解整體。跨越多個領域的關鍵問題被遺漏,因為沒有單個審查者擁有完整的上下文。

最讓我困擾的不是這些控制措施失敗——而是組織繼續盲目信任它們。每次事件後,典型的回應是「我們需要更好的培訓」或「審查者需要更加小心」或「我們需要更多批准階段」。沒有人質疑控制措施本身是否根本有缺陷。

本文探討為什麼四眼檢查如此一致地失敗,何時它們實際有效,以及什麼替代方案提供更好的保護。問題不在於概念——而在於人類在現實條件下執行這些檢查時的實際行為。

批准疲勞的心理學

當有人要求你批准某事時,你的大腦中實際發生了什麼?

橡皮圖章效應

⚠️ 批准疲勞模式

數量壓倒審查

  • 批准者每天面臨數十個請求
  • 每次審查都需要時間和精神能量
  • 維持工作流程速度的壓力
  • 預設行為轉向批准

信任取代驗證

  • "如果不對,他們不會提交"
  • 假設第一個審查者做了徹底檢查
  • 關係信任覆蓋流程驗證
  • 不延誤同事的社會壓力

責任擴散

  • "其他人會發現問題"
  • 共同責任變成無人負責
  • 每個審查者假設另一個仔細檢查了
  • 失敗發生時責任分散

第一個審查者提交交易申請批准。第二個審查者看到同事的請求。他們信任這個人。他們每天一起工作。請求者不會提交不正確或詐欺的東西——他們是值得信賴的。

這種心理捷徑將驗證轉化為橡皮圖章。第二個審查者瞥一眼請求,看到熟悉的模式,然後批准。他們不驗證帳號,不重新計算金額,不驗證業務理由。他們信任。

專業知識錯覺

組織經常將四眼檢查分配給具有相似角色和專業知識的人。兩個開發人員審查程式碼變更。兩個會計師批准日記帳分錄。兩個系統管理員授權配置變更。

一些組織試圖透過讓經理審查其團隊的工作來解決這個問題。IT經理審查工程師的生產變更。開發經理批准其團隊的程式碼。這看起來更好——經理有責任、更廣闊的視角和權威。但它因不同原因而失敗。

這創造了一個危險的錯覺——相似的專業知識提供獨立驗證。但具有相似背景的人共享相似的盲點:

🎭 共同盲點

共同心理模型

  • 相同的培訓創造相同的假設
  • 相似的經驗導致相似的錯誤
  • 共享的專業知識意味著共享的差距
  • 行業實踐變成不被質疑的規範

專業偏見

  • "我們一直是這樣做的"
  • 技術正確性掩蓋業務風險
  • 專注於熟悉方面,忽略不熟悉的
  • 專業知識創造信心,減少質疑

兩個開發人員審查程式碼都錯過了相同的安全漏洞,因為他們的培訓從未涵蓋那種攻擊向量。兩個會計師批准相同的詐欺條目,因為兩人都學習了相同的過時控制程序。兩個營運工程師批准一個將導致級聯故障的配置變更,因為兩人都假設負載平衡器會處理它。相似的專業知識不提供獨立驗證——它放大共享的弱點。

經理審查迷思

許多組織相信經理審查解決了四眼檢查問題。經理有責任、權威和據說更廣闊的視角。IT經理審查工程師部署應該捕獲同行審查錯過的問題。但經理審查一致失敗:

技術深度與廣度權衡:經理獲得廣度但失去技術深度。審查20名工程師工作的IT經理無法在每個技術堆疊、框架版本和系統架構中保持深度專業知識。他們在表面層面審查——檢查測試是否存在,而不是測試是否全面。驗證文件是否存在,而不是是否準確。確認變更遵循流程,而不是技術上是否合理。

數量壓倒能力:經理審查其團隊產生的一切。擁有10名工程師的經理可能每週審查50+個變更。每次審查得到5-10分鐘。徹底的技術審查需要30-60分鐘。數學不成立。經理成為瓶頸,為了保持工作流程而橡皮圖章。

信任覆蓋驗證:經理對團隊成員的信任與同行不同。雇用工程師、指導他們並給予積極績效評估的經理已經投資於那個人的能力。質疑他們的工作感覺像是質疑自己的判斷。經理基於誰提交了工作而不是工作包含什麼來批准。

權威創造壓力:當經理審查時,工程師感到壓力要為自己的工作辯護而不是接受回饋。挑戰經理的技術關注有職業後果的風險。工程師學會自信地展示工作,經理學會信任自信的展示。審查變成表演而不是驗證。

責任不等於能力:經理對結果有責任,但這不給他們捕獲每個問題的能力。事件發生後,經理面臨後果——但這不意味著他們可以透過更好的審查來防止事件。沒有能力的責任只是創造責備而不改善結果。

串通問題

四眼檢查假設審查者之間的獨立性。但人類形成關係、聯盟,有時是陰謀。

遊戲系統

四眼檢查創造可預測的模式,人們學會利用——不總是惡意的,有時只是為了完成工作。

關係利用:信任取代驗證。在安全環境中,詐欺者隨時間與兩個審查者建立關係。在開發團隊中,開發人員形成審查夥伴關係,每個人都橡皮圖章另一個的程式碼。在營運中,一起工作夜班的工程師發展相互批准模式。關係成為批准的基礎而不是工作品質。

順序妥協:在安全中,攻擊者透過社會工程或脅迫妥協一個審查者。在生產環境中,一個工程師推動有風險的部署,第二個審查者——看到可信同事的批准請求——橡皮圖章它。無論意圖是惡意還是只是權宜,模式都是相同的。

互利方案:兩個內部人員為了互利而串通。在金融中,他們輪流批准詐欺交易。在開發中,他們輪流批准彼此測試不良的程式碼以滿足衝刺截止日期。在營運中,他們批准彼此的捷徑以避免文件工作。設計用來防止問題的控制成為啟用問題的機制。

子流程分割問題

我觀察到組織透過添加更多批准階段來回應四眼檢查失敗。他們將流程分解為子流程,每個都有雙重批准。這看起來合乎邏輯——更多檢查點應該捕獲更多問題。但它創造了危險的分割。

跨階段的責任擴散:當部署需要程式碼審查批准、安全審查批准、基礎設施審查批准和營運批准時,每個審查者假設其他人在全面檢查。程式碼審查者狹隘地專注於程式碼品質,假設安全審查會捕獲漏洞。安全審查者掃描已知漏洞,假設程式碼審查驗證了業務邏輯。基礎設施審查者檢查配置語法,假設先前階段驗證了變更有意義。營運批准者看到三個先前的批准階段並橡皮圖章。每個人批准他們的狹窄部分,而沒有人驗證整體。

上下文分割:每個子流程只看到圖片的一部分。程式碼審查者看到資料庫查詢最佳化但不知道它會在高峰時段導致鎖爭用。基礎設施審查者看到快取配置變更但不知道它破壞了關鍵應用功能。安全審查者看到認證變更但不知道它影響業務關鍵整合。完整圖片不存在於任何地方——它在子流程邊界間分割。

批准疲勞倍增:子流程不是減少批准疲勞,而是倍增它。單個部署現在需要8個批准而不是2個。每個批准者面臨更高的數量,因為他們審查觸及其子流程的每個變更。程式碼審查團隊審查一切。安全團隊審查一切。基礎設施團隊審查一切。數量同時壓倒每個階段。

虛假信心放大:多個批准階段創造與階段數量成比例的虛假信心。「這個部署在4個階段有8個批准——它必須經過徹底審查。」稽核員看到廣泛的批准軌跡並假設發生了嚴格審查。管理層看到多個檢查點並相信風險得到控制。現實是8個人橡皮圖章而沒有全面審查,但控制的外觀比以往任何時候都強。

壓力鍋

組織創造四眼檢查成為障礙而不是控制的環境:

🔥 壓力點

時間壓力

  • "這需要立即批准"
  • 生產中斷需要立即修復
  • 業務截止日期覆蓋安全流程
  • 延遲批准被歸咎於錯失機會

權威壓力

  • 高級管理人員請求批准
  • "CEO需要今天完成這個"
  • 阻止請求的職業後果
  • 權力動態覆蓋控制有效性

同行壓力

  • "不要難相處"
  • 團隊凝聚力比驗證更重要
  • 徹底的審查者被標記為阻撓者
  • 質疑同事的社會成本

在壓力下,四眼檢查崩潰。第二個審查者快速批准以避免衝突、維持關係或防止職業損害。控制在紙面上存在但不提供實際保護。

虛假安全悖論

四眼檢查最危險的方面不是它們失敗——而是組織相信它們有效。

降低警惕

當組織實施四眼檢查時,他們經常減少其他控制:

監控減少:「我們有雙重批准,所以我們不需要如此密切地監控這些交易。」在安全中,自動警報被禁用。在生產中,部署監控變得寬鬆。在營運中,變更追蹤變得不那麼嚴格。檢測控制減弱,因為預防控制似乎足夠。

技術控制減弱:「我們有人工審查,所以我們不需要系統驗證。」在安全中,輸入驗證被簡化。在開發中,自動化測試要求減少,因為「程式碼審查會捕獲問題」。在營運中,自動化健康檢查被跳過,因為「兩個工程師批准了變更」。技術保障措施侵蝕,因為人工判斷似乎更靈活和可靠。

測試減少:「我們有同行審查,所以我們不需要廣泛測試。」整合測試被跳過。負載測試變成可選。回滾程序未經測試。兩個人審查程式碼的假設取代了它實際工作的驗證。

稽核範圍縮小:「這些變更有雙重批准,所以我們將稽核工作重點放在其他地方。」安全稽核員花費更少時間審查雙重批准的交易。生產事件審查跳過雙重批准的部署。應該接受審查的控制被假設為有效。

這創造了一個危險的悖論——四眼檢查的存在透過創造削弱其他防禦的虛假信心來降低整體安全性。

合規劇場

四眼檢查成為滿足要求但不提供真正保護的複選框練習:

📋 流程與現實

流程重於實質

  • 控制存在於文件中
  • 批准發生但驗證不發生
  • 稽核軌跡顯示雙重簽名
  • 流程的證據,不是有效性的證據

測量失敗

  • 指標追蹤批准速度,不是品質
  • 成功透過流程完成來衡量
  • 沒有測量捕獲的錯誤
  • 沒有驗證審查者的勤勉

生產範例

  • Git顯示拉取請求的兩個批准
  • 部署日誌顯示兩個工程師簽署
  • 變更票據顯示雙重授權
  • 但沒有證明實際審查發生

組織透過在日誌中顯示雙重批准來證明合規性。安全稽核看到交易上的雙重簽名。DevOps儀表板顯示每個部署兩個批准。變更管理系統顯示雙重授權。但日誌不揭示審查者是否實際驗證了任何東西。它們顯示兩個人點擊了「批准」——不是兩個人獨立驗證了工作。

四眼檢查何時有效(何時無效)

四眼檢查不是固有無用的——但它們需要特定條件才能有效。

成功條件

✅ 四眼檢查何時有效

真正獨立性

  • 不同部門或業務單位
  • 審查者之間沒有報告關係
  • 單獨的績效激勵
  • 物理或組織分離

明確驗證標準

  • 要檢查的特定項目已記錄
  • 客觀驗證要求
  • 複雜審查的檢查清單
  • 需要驗證證據

可管理的數量

  • 每人有限的審查數量
  • 為徹底審查分配足夠時間
  • 沒有快速批准的壓力
  • 品質比速度更重要

問責機制

  • 追蹤個人審查者身份
  • 定期批准品質稽核
  • 橡皮圖章的後果
  • 捕獲錯誤的獎勵

真正獨立性

獨立性意味著審查者沒有批准可疑請求的激勵。這需要組織分離,不只是不同的人。當財務經理審查其自己部門提交的交易時,獨立性不存在——他們共享相同的目標、壓力和激勵。真正的獨立性意味著審查者來自具有單獨績效指標和預算責任的不同業務單位。

經理審查未通過獨立性測試。審查自己團隊工作的經理有批准的每個激勵。他們的績效指標取決於團隊生產力。他們的聲譽取決於團隊能力。他們的預算取決於展示團隊價值。阻止部署延遲他們團隊的可交付成果。捕獲錯誤反映他們的雇用和培訓不佳。經理不是獨立的——他們是投資的利益相關者。

在生產環境中,獨立性意味著開發人員不審查來自在同一衝刺上工作的直接團隊成員的程式碼。它意味著來自不同班次或地區的營運工程師審查彼此的基礎設施變更。它意味著安全團隊審查存取請求而不是請求部門批准自己的需求。它意味著經理不審查自己團隊的工作——獨立團隊或自動化系統做。

物理或組織分離創造自然獨立性。不同辦公室、時區或報告鏈中的審查者有較少的關係壓力和不同的上下文偏見。他們更可能質疑假設並捕獲對內部人員看起來正常的問題。審查自己團隊的經理有最大的關係壓力和相同的上下文偏見。

明確驗證標準

像「審查並在可接受時批准」這樣的模糊指令保證橡皮圖章。有效的四眼檢查提供明確的檢查清單:驗證帳號與發票匹配,確認金額不超過閾值,驗證業務理由包括成本中心代碼,檢查批准權限與交易規模匹配。

在程式碼審查中,明確標準意味著:驗證單元測試覆蓋新功能,確認不存在硬編碼憑據,驗證所有外部呼叫的錯誤處理,檢查資料庫查詢使用參數化語句。審查者確切知道要驗證什麼,而不是對程式碼品質做主觀判斷。

記錄的標準也創造問責。當事件發生時,你可以確定審查者是否遵循了檢查清單。沒有標準,審查者可以聲稱他們「適當地」審查了,即使他們橡皮圖章了。

可管理的數量

人類注意力是有限的。每天處理5個批准的審查者可以徹底驗證每一個。每天處理50個批准的審查者必須匆忙通過它們。數量壓倒勤勉。

有效的四眼檢查透過自動化和基於風險的方法限制數量。低風險交易獲得自動批准。中等風險交易獲得帶自動驗證的單一批准。只有高風險交易需要雙重人工審查。這保持數量可管理並將人類注意力集中在最重要的地方。

時間分配同樣重要。如果徹底審查需要15分鐘但審查者每個批准有5分鐘,數學不成立。組織必須減少數量、增加審查者能力,或接受審查將是表面的。

問責機制

沒有問責,四眼檢查成為橡皮圖章。有效的問責意味著追蹤個人審查者身份,不只是「兩個人批准了」。當事件發生時,你需要知道誰批准了什麼以及他們是否遵循了驗證程序。

定期品質稽核抽樣批准的交易並驗證審查者實際檢查了所需項目。他們驗證帳號了嗎?他們確認業務理由了嗎?他們驗證程式碼變更與描述匹配了嗎?稽核揭示審查者是勤勉還是橡皮圖章。

後果很重要。如果橡皮圖章沒有後果,它成為常態。如果捕獲錯誤的徹底審查者得到獎勵而橡皮圖章者面臨問責,行為改變。大多數組織追蹤批准但從不測量品質——確保平庸。

失敗條件

❌ 四眼檢查何時失敗

高數量 + 時間壓力

  • 每個審查者每天數十個批准
  • 需要立即批准的緊急請求
  • 工作流程瓶頸歸咎於審查延遲
  • 速度指標優先於品質

關係依賴

  • 審查者在同一團隊工作
  • 社會關係覆蓋驗證
  • 阻止同事的職業後果
  • 信任取代獨立驗證

模糊標準

  • "審查並在可接受時批准"
  • 沒有要驗證內容的檢查清單
  • 沒有指導的主觀判斷
  • 沒有實際檢查內容的證據

沒有問責

  • 追蹤批准但不追蹤品質
  • 橡皮圖章沒有後果
  • 失敗發生時責任擴散
  • 沒有測量捕獲與錯過的錯誤

現實差距

大多數組織在失敗條件下運作,同時期望成功結果。他們實施四眼檢查與同團隊審查者(沒有獨立性)、模糊的「審查並批准」指令(沒有明確標準)、每人每天數十個批准(不可管理的數量),以及沒有審查品質測量(沒有問責)。然後他們想知道為什麼關鍵問題被遺漏。

當失敗發生時,組織經常透過添加更多子流程批准階段而不是修復根本問題來回應。這使事情變得更糟——倍增批准疲勞、分割上下文、放大虛假信心,同時對獨立性、標準、數量或問責問題無所作為。

成功條件不是可選的好東西——它們是強制要求。沒有所有四個條件,四眼檢查提供劇場而不是保護。在沒有這些條件的情況下添加更多批准階段只是創造更精心的劇場。組織必須創造這些條件或承認控制實際上不起作用並實施替代方案。

更好的替代方案:自動化勝過人工勤勉

四眼檢查的根本問題是它們依賴於在使勤勉幾乎不可能的條件下的人工勤勉。解決方案不是更好的培訓或更嚴格的政策——而是自動化。

人類在重複驗證任務上很糟糕。我們會疲勞、分心和自滿。我們受關係、壓力和認知偏見影響。但我們在判斷呼叫、創造性問題解決和處理新情況方面很出色。

有效的控制利用自動化來做機器擅長的事情,並為人類擅長的事情保留人工判斷:

自動化驗證

自動化驗證為人類難以可靠應用的規則提供一致、不知疲倦的執行。更重要的是,自動化控制隨著政策演變和新威脅出現而持續改進。

業務規則執行:系統自動根據業務規則驗證交易。無效交易在人工審查前被拒絕。人類審查例外,不是常規交易。隨著合規要求變化,規則在程式碼中更新並立即應用於所有交易。新的監管要求成為自動化檢查而不是培訓主題。

自動化測試:全面的測試套件自動驗證程式碼變更。單元測試驗證功能。整合測試捕獲互動錯誤。負載測試驗證效能。安全掃描檢測漏洞。人類審查測試結果,不只是程式碼。當新的漏洞模式出現時,安全掃描工具更新並立即檢查所有程式碼。當效能要求變化時,負載測試閾值自動調整。

模式檢測:異常檢測識別不尋常的交易進行審查。機器學習標記偏離正常模式的情況。部署監控檢測異常行為。人工審查專注於真正可疑的活動。隨著攻擊模式演變,檢測模型在新資料上重新訓練。隨著系統行為變化,基線自動調整。

限制控制:硬限制防止過度交易,無論批准如何。系統強制的閾值不能被雙重批准覆蓋。部署門阻止失敗自動化檢查的變更。技術控制為人工判斷提供後備。當風險容忍度變化時,限制集中更新並立即應用於所有系統。

持續改進:自動化驗證的關鍵優勢是持續改進。當事件發生時,新檢查被添加以防止再次發生。當合規政策變化時,驗證規則立即更新。當發現新的安全漏洞時,掃描工具在所有程式碼中檢測它們。人工審查者必須單獨重新培訓並希望他們在壓力下記住新要求。自動化系統從部署的那一刻起一致地執行新要求。

每個事件都成為加強自動化控制的機會。透過程式碼審查的生產錯誤成為新的自動化測試。透過雙重批准的詐欺交易成為新的業務規則檢查。兩個審查者錯過的安全漏洞成為新的掃描規則。系統從失敗中學習並系統地防止它們,而不是希望人類記住經驗教訓。

職責分離

功能分離:不同的人在流程中執行不同的功能。一個人發起,另一個批准,第三個對帳。沒有單個人控制整個流程。

系統強制分離:系統防止同一使用者執行衝突功能。技術控制自動強制分離。人類串通變得不足以繞過控制。

檢測控制

持續監控:所有交易監控可疑模式。生產部署監控錯誤和效能下降。異常警報觸發調查。檢測發生,無論批准流程如何。

金絲雀部署:變更首先推出到小百分比的使用者。自動化監控在完全部署前檢測問題。問題在有限爆炸半徑內被捕獲。漸進推出提供多個驗證點。

定期對帳:獨立對帳在事後捕獲錯誤和詐欺。部署後驗證確認變更按預期工作。差異觸發調查。隨時間的多層驗證。

稽核抽樣:雙重批准交易的隨機抽樣。部署程式碼的品質檢查驗證審查者勤勉。事後審查檢查批准品質。維持批准品質的問責。

前進之路

四眼檢查將繼續存在——它們嵌入在法規、標準和公司政策中。但理解它們的局限性能夠實現更好的結果:

不要僅僅依賴四眼檢查:分層多個控制。將人工審查與自動化驗證結合。使用檢測控制捕獲失敗。在生產中,將程式碼審查與自動化測試、金絲雀部署和監控配對。

為人類行為設計:承認人類在壓力下橡皮圖章。減少批准數量。提供明確的驗證標準。給審查者要驗證內容的檢查清單。測量品質,不只是速度。追蹤多少百分比的審查捕獲實際問題。

維持獨立性:確保審查者真正獨立。分離組織單位。不同的激勵結構。沒有關係依賴。輪換審查分配以防止夥伴關係模式。

驗證驗證者:定期稽核批准品質。抽樣雙重批准的交易和部署。審查事件以查看批准流程是否失敗。讓審查者對勤勉負責。獎勵那些捕獲錯誤的人。

自動化人類做得不好的事情:人類在重複驗證上很糟糕,但在判斷呼叫上很好。自動化語法檢查、安全掃描、測試執行和合規驗證。為架構決策、業務邏輯和邊緣情況保留人工審查。

投資持續改進:將自動化控制視為隨威脅和要求演變的活系統。當事件發生時,更新自動化檢查以防止再次發生。當政策變化時,立即更新驗證規則。當新漏洞出現時,更新掃描工具以檢測它們。持續改進的自動化控制比依賴記憶和勤勉的人工審查提供更好的保護。

四眼檢查不是固有危險的——但對它們的盲目信仰是。它們是許多控制中的一個,只有在特定條件下才有效,並且容易受到人性的影響。理解這些局限性的組織構建更好的系統。那些不理解的創造危險的盲點,同時相信他們受到保護。

最好的組織不問「我們有四眼檢查嗎?」他們問「我們的四眼檢查實際上在工作嗎,當它們失敗時會發生什麼,什麼自動化控制支持它們?」他們投資於持續改進的自動化驗證,而不是在壓力下退化的人工流程。

分享到