開發人員威脅建模指南

安全軟體設計,少量且頻繁

本文提供明確且簡單的步驟,協助想要採用威脅建模的團隊。威脅建模是基於風險的方法,用於設計安全系統。它是基於識別威脅,以便發展對策。隨著網路安全風險增加,企業也越來越意識到其負債,軟體開發團隊需要有效的方法將安全性建置到軟體中。不幸的是,他們常常難以採用威脅建模。許多方法需要複雜、詳盡的前期分析,這與現代軟體團隊的工作方式不符。因此,我鼓勵團隊從簡單開始,並從中成長,而不是停止一切來建立完美的威脅模型。

2020 年 5 月 28 日



如何簡化複雜問題

您正在建置的軟體有哪些安全性需求?令人驚訝的是,要找到一個好的答案很複雜。您想要在系統的整個生命週期中防止網路損失。但是,要達成此結果的具體故事、驗收標準和技術範圍是什麼?本指南將解決這個謎題。

抱怨抱怨抱怨

您的威脅模型是什麼

-- Dan Kaminsky

網路專家經常會問:「您的威脅模型是什麼?」這個答案通常非常不具體且不確定,就像轉身說「這要看情況」一樣。更糟的是,「威脅模型」對大多數人來說都是難懂的技術術語,增加了不必要的玄妙感。如果您研究威脅建模的主題,這些資訊可能會讓人不知所措且難以採取行動。對於「威脅模型」或類似概念,並沒有公認的標準。

那麼,什麼是威脅模型,威脅建模又是什麼?這個概念的核心非常簡單。它是關於了解與網路安全損失相關的原因。它是關於利用這種理解以基於風險的方式保護您的系統。這表示從您特定案例中的潛在威脅開始,而不是只遵循檢查清單。

了解您系統的威脅模型並不容易。您可以想像對任何系統都有無限的威脅,其中許多威脅可能是可能的。威脅的現實是,許多原因會結合在一起。網路威脅以意外、不可預測甚至混亂的方式串聯。與文化、流程和技術相關的因素都會造成影響。這種複雜性和不確定性是網路安全問題的根源。這就是為什麼軟體開發團隊很難就安全需求達成共識的原因。

真實的資料外洩事件背後的故事,顯示威脅和因果關係的複雜性,其細節往往令人驚訝。NotPetya 事件 就是一個很好的例子。國家級惡意軟體是由一個名為「ShadowBrokers」的組織交易,然後武器化。最終的影響幾乎是隨機地對組織造成重大損失。航運公司 Mearsk 必須暫停航運進度。糖果製造商 Cadbury's 必須停止生產巧克力。他們各自的威脅模型是什麼?哪個開發團隊可以想像如此複雜的因果關係和附帶損害?你的團隊需要多長時間才能對此建模,以及其他所有危險的可能性?

威脅建模是否太複雜而沒有價值?開發人員是否應該只遵循檢查清單、「祈禱」並希望自己幸運?我認為,懷疑是健康的,但學習威脅建模是開發人員的一項關鍵技能。我們需要的是正確的方法和工具來控制複雜性。本指南就是本著這種精神編寫的,並從三個想法開始,這些想法使識別良好的、基於風險的安全需求變得更加簡單。

從技術開始

第一個建議是至少一開始主要關注技術威脅,而不是廣泛的威脅

  • 廣泛的威脅和威脅來源包括駭客組織、惡意行為者、心懷不滿的員工、人為錯誤或新蠕蟲式惡意軟體的流行。這些類型的成因來自廣闊的世界,而且極其多樣、不確定和不可預測。它們與系統數據和服務對組織和其他人而言的價值有關。這些是與非技術人員容易談論的戲劇性風險。
  • 技術威脅和漏洞的顆粒度更高,例如軟體中的特定弱點或缺少加密或授權等安全控制。這些類型的威脅源自於您的團隊正在建構的系統中固有的結構和資料流。通常,許多技術威脅會結合在一起,讓廣泛的威脅影響您的系統。

透過遵循本指南,您將主要專注於找出技術威脅。這有助於簡化闡述流程,因為系統的結構和資料流是您能確定的。但這也表示您可以從您作為軟體開發人員的既有優勢開始,了解技術方面。這是比您可能不太了解的威脅來源的高階風險分析更強而有力的基礎。

不過,別完全忘記整體情況。務實且基於風險地了解哪些廣泛的威脅是可能的,有助於將一個技術威脅優先於另一個。例如,單純的人為錯誤通常比國家攻擊更可能發生(請參閱側欄)。這種思考方式可以納入選擇要先檢查哪個安全範圍。當您先專注於找出技術威脅時,就能更容易將它們與更廣泛的威脅關聯起來,為修正和額外控制提供依據。

採取協作方式

第二個建議是採用協作的團隊導向方法。找出安全需求並不容易,而觀點的多元化將有助於做出更好的決策。總是有另一個漏洞或技術威脅需要找出,因此為演練帶來各種觀點,能讓集思廣益更穩健。這也會增加您找出最重要威脅的可能性。在小組中進行威脅建模有助於全面性地處理風險,並幫助整個團隊學習如何有效地思考和討論安全性。

從風險管理的角度來看,讓產品負責人參與進來是一個絕佳的機會。產品負責人對用戶行為和業務背景有深入的了解,而軟體開發人員根本沒有。他們應該了解特定服務對業務的價值,以及如果數據被洩露或丟失會產生什麼影響。當發生網路安全損失時,它們就是業務損失。如果最壞的情況發生,那麼原因很可能是你的組織和所使用的技術所特有的。網路安全問題不僅僅是勾選技術框,還包括做出良好的投資決策來保護業務。

威脅建模「少量且頻繁」

第三個建議是「經常少量」地開始威脅建模。與團隊的每次威脅建模會議都應該簡短且專注,以便快速消化成可以交付的東西。從分析系統中最薄的部分開始;僅分析你現在正在處理的部分。不要試圖預先分析整個系統,而是讓你的團隊逐漸建立威脅建模的肌肉記憶。

需要完全指定軟體設計的實務與敏捷團隊的工作方式不符。沒有理由威脅建模需要是詳盡的預先分析。團隊經常被威脅建模的全面且高度結構化的方法所淹沒[1]。我見過團隊嘗試這種方法,在發現任何真實威脅之前就耗盡了時間和耐心,更不用說交付修復了!

不要建立和維護詳盡的「威脅模型」文件,而要「經常少量」地進行威脅建模。當你這樣工作時,每次威脅建模會議都很小,影響很小。然而,這樣做的累積效應卻很大。當你知道你將在每次迭代中再次執行此操作時,嘗試一次性完成所有工作的誘因就會減少,而優先考慮當前最重要的工作的誘因就會增加。

開始前的準備

本指南的這一部分開始讓事情變得更詳細、更具體,以便你可以計劃與你的團隊開始威脅建模。

三個關鍵問題

了解威脅建模會議的簡單結構,並做一些規劃,對於獲得良好的結果大有幫助。

要介紹的第一件事是威脅建模的簡單且靈活的結構[2]。這基於三個關鍵問題。它有助於將此結構記在腦海中。無論何時需要評估威脅,你都可以使用這三個問題結構作為指南。就像騎自行車一樣,一旦你掌握了基礎知識,你就可以應用和培養這些技能。

活動問題結果
說明並探索您正在建立什麼?技術圖表
集思廣益威脅什麼可能會出錯?技術威脅清單
優先處理並修正您打算怎麼做?已優先處理的修正事項已新增至待辦事項

本指南遵循三個問題結構。在每個威脅建模會議中,您應花費約三分之一的時間回答每個問題。然後,您將得到有用的結果。本指南的其餘部分將把此基本結構分解為更詳細的步驟、指標和說明,以幫助您執行成功的威脅建模會議。

實際考量

在執行威脅建模會議之前,您需要先了解一些事項。下列指標應有助於您進行規劃。

誰應參與?

嘗試讓整個交付團隊參與每個會議,也就是說技術和非技術角色。這會為會議帶來更多觀點和想法,同時也能建立共同的理解。排除產品負責人、業務分析師和交付經理可能會導致安全漏洞修復工作無法完成,因為價值不會被廣泛理解。

您絕對不需要安全專家來開始威脅建模和發現有價值的安全範圍。但是,威脅建模會議是與專家、安全架構師或風險管理團隊協作的絕佳機會。這一切都取決於您組織中的角色和專業知識。

節奏和持續時間

首先,我建議會議長度為 90 分鐘。您需要給團隊時間和空間來了解所涉及的結構和安全概念。不過,一旦您開始進行,事情應該會快很多。我曾經參與過影響最大的威脅建模會議不到 15 分鐘。一旦團隊中的每個人都透過練習建立了「肌肉記憶」,就可以進行簡短而有力的會議。

我常被問到威脅建模會議應該多久舉行一次。我不認為有正確答案,這取決於你的團隊。我認為威脅建模就像任何其他團隊設計會議一樣。我不會那麼死板地說它必須每週舉行一次。然而,我曾與許多風險狀況的團隊合作,他們認為每衝刺一次威脅建模是合理的。在另一個極端情況下,如果已經有幾個衝刺沒有進行任何威脅建模,那麼這個做法顯然不夠持續,無法被視為成熟。

面對面舉行會議與遠程舉行會議

面對面的威脅建模會議可以在會議室舉行,或者如果空間足夠,也可以在團隊的正常工作區域中較為非正式地舉行。典型的會議包括繪製圖表以說明和探討範圍、集思廣益威脅,然後優先處理待處理事項的修復。然而,面對面的會議並不總是可行的。

當你遠程舉行會議時,你只需要稍作不同的計畫,以便每個人都能虛擬參與。你需要視訊會議和協作工具。事先同意並設定這些工具。Thoughtworks 的團隊成功使用了各種工具,包括 Mural、Miro、Google Jamboard 和 Google Docs。

在會議之前熟悉你的工具,並讓參與者測試他們是否有權限。無論你選擇哪個工具,請確保你已獲得組織的安全核准來使用該工具。威脅建模輸出代表著敏感資訊,基於多種原因,必須受到保護。

以下是遠程工作時需要記住的一些其他事項

  • 在練習之前非同步建立圖表可能會有幫助。這是因為在虛擬白板上繪製圖表可能會花費大量時間。
  • 更注意建立對用於說明系統的概念和符號的共識。說明圖表符號、資料流箭頭和數位便利貼的顏色。
  • 更用心確保每個人都參與練習。或許使用一些與安全性相關的腦筋急轉彎作為破冰方式。參閱遠端促進的更廣泛指南。
  • 如果您有一大群人,將他們分成小組再合併產出可能是個好主意。幾個小場次會比一場大型場次更好、更能持續。
  • 您將需要比面對面場次更多的休息時間。遠端工作很累人。

無論您的場次是遠端或面對面,您都應該準時結束。並有一些具體成果!這需要紀律 - 促進時程可以由交付經理或某個有經驗的人擔任,確保工作坊場次成功。

Thoughtworks Germany 的 Mona Fenzl 和 Sarah Schmid 使用一種稱為 Mural 的協作工具獲得了一些成功。他們使用它來建立威脅建模範本,以幫助其他團隊開始使用該工具。

界定會議範圍

決定場次的正確重點和詳細程度稱為「識別範圍」。在讓大家聚在一起執行活動之前,請務必決定好這一點。以目前最有價值的事物為指導。或許只是您在此次迭代中處理的使用案例?

不要一次嘗試涵蓋太多範圍!如果您嘗試一次威脅建模整個系統,您將在可用時間內找不到任何結果,或者您將大幅超時,而且沒有意願或預算再次執行。將威脅建模分為可管理的區塊,經常「少量多次」執行活動會好得多。

以下是一些效果良好的範圍範例

  • 當前迭代中的範圍。
  • 即將推出的安全性敏感功能,例如新的使用者註冊流程。
  • 持續交付管道和交付基礎架構。
  • 特定微服務及其協作服務
  • 系統的高階概觀,以識別安全技術債務。

無論您的團隊選擇什麼範圍,請確保它不會太大,無法在可用時間內涵蓋。

範例:範圍

本指南的其餘部分使用實際功能來顯示威脅建模中涉及的具體步驟。一家零售組織有一個開發團隊正在建立一個平台,用於銷售送貨到府的食品雜貨。以下是他們在即將到來的衝刺中擁有的史詩

作為客戶,我需要一個頁面讓我可以看到我的客戶詳細資料,這樣我才能確認它們是正確的

如果你曾經使用過線上商店,你就能想像一個用來更新地址詳細資料,或許還能查看忠誠卡餘額的頁面。

根據經驗,這個大小的功能對於威脅建模會議來說是一個相當合理的範圍。

說明並探索

不要試圖從 Wiki 中提取過時的圖片。討論系統目前的情況,或將來的情況,建立共同的理解。

「你在建構什麼?」

圖表是解釋和探索軟體如何建構,以及設計用於溝通的完美工具。本指南的這一部分提供有關圖表的詳細指標,這些指標將作為威脅建模會議的基礎。

繪製「低保真」技術圖表

畫一張圖讓每個人都在同一頁面上。在開始思考威脅、風險和緩解措施之前,你需要對你正在處理的軟體或基礎設施有一個共同的技術理解。

i. 顯示相關組件。

幸運的是,開發人員會很樂意繪製圖表來探索軟體設計。透過在白板或海報紙上繪製一個簡單的技術圖表,來利用這些既有的技能。

不需要複雜或完美,只要為主要組件繪製方塊並標記它們即可。

ii. 在圖表上顯示使用者。

最終,系統的設計目的是讓人們做事。使用者很重要,因為他們是系統中被授權做事情的人。在你的圖表上表示和標記他們。

  • 有些使用者比其他使用者更值得信賴。例如,與管理員相比,一般使用者通常在系統中執行操作的自由度較低。如果多個使用者群組與會議的範圍相關,請表示和標記每個群組。
  • 並非所有系統都是面向使用者的。如果你的系統是後端系統(例如僅接受來自其他系統請求的下游微服務),則表示被授權與系統互動的協作系統。

信任基本上是關於誰或什麼應該有自由去做某件事。確保你說明那些「參與者」,因為它們對於安全性很重要。

一個範例:低保真度圖表

回到上面介紹的真實功能,讓我們看看團隊如何選擇說明新的「客戶詳細資料頁面」功能。他們繪製了以下圖表。

它說明了對系統的理解

  • 基於微服務架構
  • 已經有一個身份提供者,允許客戶進行驗證。
  • 有一個用於客戶詳細資料的後端服務(使用 Java 編寫)
  • 具有後端服務 (BFF) 和前端 UI(使用 Javascript 和 React 編寫)
  • 有身為客戶的使用者,且想要編輯其個人資料

不需要對這些技術有詳細的了解即可遵循本指南,但這些事實說明了在繪製圖表時應討論的詳細程度。

顯示資料流向

加入詳細資料以顯示資料如何在系統中流動非常重要。

iii. 繪製箭頭以顯示資料流

攻擊者經常使用與合法使用者相同的路徑在系統中進行橫向移動。差別在於,他們會濫用或以無人想到檢查的方式使用這些路徑。因此,顯示系統中受信任的路徑非常重要,這有助於找出實際威脅可能發生的地方。

使用箭頭顯示資料流,從使用者和協作系統開始。現今,大多數資料流都是請求回應,因此是雙向的。但我建議您從請求發出的位置繪製方向箭頭。根據經驗,這使得稍後集思廣益威脅時更容易進行。

iv. 標示網路並顯示邊界。

威脅更有可能來自某些網路。網路會進行設定,以限制流量從一個地方流動到另一個地方的自由度。這種限制性(或開放性)將有助於確定哪些威脅是可能的或可能的。開放的網際網路比受良好保護的後端網路更危險(即使您的後端網路是雲端供應商所主辦的 VPC)。

使用另一種顏色繪製虛線,以顯示系統中不同網路之間的邊界。這些通常稱為「授權邊界」。有時值得說明閘道裝置,例如負載平衡器或防火牆。其他時候,這些裝置對您在該階段的範圍來說並不重要,這也沒關係。如果您不確定,邀請具有 DevOps 或基礎架構知識的人參加您的下一個階段可能是明智之舉。

一個實際範例:顯示資料流

在我們的案例中,加入箭頭來說明資料流,從想要查看其詳細資料的客戶,到 UI,然後到 BFF 服務,再到客戶詳細資料資源伺服器以取得或更新資料。還有一個資料流到身分伺服器,該伺服器會發出授權階段的權杖。

由於使用者介面在網際網路上,而其他元件在組織的雲端主機中,因此也有一個授權界線。

v. 顯示你的資產。

在圖表中快速指出具有商業價值的資料或服務所在位置很有幫助。例如,這可能是你儲存個人資料的地方。如果你的系統處理付款,或許就是執行這項服務的地方。系統中的資產是需要保密或完整的資訊,但也包括需要保持可用的服務。

不要花太多時間在這個步驟上。目的只是提供一些背景資訊,以協助集思廣益和優先順序排序。如果你花超過 5 分鐘,那可能太久了。

實際範例:顯示你的資產

團隊將客戶服務儲存的個人可識別資訊 (PII) 和身分提供者中憑證儲存庫識別為具有最高商業價值的資產。

集思廣益威脅

「可能會出什麼問題?」

對於會議的第二部分,只要集思廣益你所繪製系統的威脅即可。本節提供詳細步驟和提示,以協助你提出各種相關的安全威脅。

使用 STRIDE 協助

如果你的團隊開始進行威脅建模,STRIDE 是完美的選擇。STRIDE 是一個非常輕量的架構,可以讓你開始集思廣益安全威脅。它是一個助記符,每個字母都代表一個安全概念。重點不在於分類你發現的內容,而是幫助你有效地集思廣益。

在開始之前,花一些時間與團隊了解和討論六個安全概念。為了幫助學習,Thoughtworks 建立了一組 STRIDE 提示卡。這六張卡片連結在正下方。它們的反面也包含範例清單。

在網際網路上,沒有人知道你是一隻狗

資料會不會溢位並變成指令?

如果沒有證據,很容易否認它曾經發生

還有誰可能會在尋找?

服務會不會被關閉?

繞過防護措施有多容易?

邪惡集思廣益

想出攻擊、破壞或阻礙特定軟體的方法就是威脅建模的精髓。它也可以非常有趣!

i. 集思廣益威脅!

小組中的每個人都加入建議威脅。找到最廣泛的威脅種類是一件好事,我們感興趣的是可能性,而不是「快樂路徑」。一些異想天開的想法也有幫助。通過確保每個人都參與其中,並且不允許任何單一的聲音佔主導地位,來鼓勵這種多樣性。確保每個人都能使用筆和便條紙,並建議至少一種潛在威脅,無論其背景或經驗如何。

使用創造性、發散性思維,並利用小組中存在的經驗和各種觀點。稍後,您將優先考慮風險最高或最重要的威脅,因此擁有過多的潛在威脅並不可怕。

ii. 遵循數據流線!

如果您需要靈感,請逐一遵循圖表上的數據流線。STRIDE 概念中哪一個可能適用於該數據流?這是否表明需要解決的特定威脅?這種工作方式有助於識別攻擊者可能使用的技術機制和數據流。

任何網路攻擊都有數據流,就像您繪製的可信數據流一樣。攻擊者使用相同的路徑繞過已為可信用戶設置的系統。當技術層面沒有足夠的約束來防止壞事發生時,就會發生網路安全損失。

iii. 在便條紙上記錄威脅

對於每個威脅,花點時間記錄它。「來自網際網路的 SQL 注入」、「資料庫中缺乏加密」、「沒有多重驗證」是好的範例。問題也很棒,例如「我們需要儲存這些資料嗎?」、「是否可能繞過授權?」和「誰將撤銷離職者的帳戶?」

您會發現將這些便利貼放在圖表上的特定位置,與特定使用者、元件或資料流程並列,是很自然的事。只包含足夠的詳細資訊,讓您知道便利貼的意義,然後繼續集思廣益下一個威脅。

實際範例:已識別的威脅

使用先前建立的圖表,團隊使用 STRIDE 協助集思廣益系統中的每個資料流程。

當我們在軟體機制中發現潛在威脅時,請將它們寫在便利貼上並註解在低保真度圖表中。

以下是他們在集思廣益部分的會議結束時提出的內容

資料流程
威脅
客戶→身分服務
  • 驗證基於密碼,沒有兩階段驗證
客戶→使用者介面
  • 基於 DOM 的跨網站指令碼 (XSS) 攻擊
使用者介面→後端服務
  • 身分驗證令牌驗證不存在或很弱
  • 注入攻擊,例如 SQL 注入、儲存的 XSS
  • 缺乏呼叫者身分記錄
  • TLS 傳輸加密設定錯誤
  • 生產環境中啟用設定錯誤的 graphQL 內省
  • 來自殭屍網路的網路層流量洪水
  • 無法防止經過驗證的使用者存取其他人的詳細資料
  • 缺乏定期修補程式可能會導致遠端程式碼執行
後端服務→客戶服務
  • 「伺服器到伺服器」驗證不存在或很弱
  • 缺乏呼叫者身分記錄
  • 過於寬鬆的安全群組允許從網際網路存取客戶服務
  • 無法防止經過驗證的使用者存取其他人的詳細資料

請注意,許多威脅發生在資料流程從網際網路跨越授權邊界進入系統時。然而,瀏覽器為基礎的使用者介面和後端網路中也已識別出威脅。

優先處理並修正

現在,您將在小組建立的圖表上建立基礎,並註解威脅。

「您打算如何處理?」

軟體團隊有提供誘因,而且很少有無限頻寬可以解決並處理每個已識別的威脅。而且有些威脅可能會造成微不足道的風險。您需要過濾並優先處理一些最重要的動作,以便您可以有效地執行。

根據風險優先處理威脅

i. 分享有助於優先順序的知識

它有助於對我們對系統風險概況的了解達成共識。花費不超過 5 分鐘即可完成。大致而言,在優先處理威脅時,有兩種知識類型會有所幫助。產品所有人或安全團隊通常有極佳的見解可以分享。

  • 商業價值 - 哪種損失會讓組織的目標面臨危險?是客戶資料庫被竊嗎?由於業務損失而造成的聲譽影響嗎?
  • 更廣泛的威脅 - 對於這個組織而言,由於網路安全問題而導致損失的可能根本原因是什麼?我們擔心的是詐騙嗎?惡意內部人員嗎?特別有能力的黑客嗎?

如果小組中沒有人對更廣泛的風險有任何見解,那也沒關係。存取此知識並非先決條件。您可以僅根據技術風險進行優先順序排序,並仍然從威脅建模中獲得極大的好處。

ii. 每個人都投票選出風險最高的威脅!

對於之前在回顧或工作坊中進行過「點狀投票」的任何人來說,這應該很熟悉。每個人都會獲得一些選票,並將其投給風險最高的威脅。第一次會議時,或許可以從每人三票開始。但這取決於小組中有多少人,以及您發現了多少威脅。目標是逐步縮小範圍,找出最有價值的威脅。請記住,風險不僅與威脅的可能性有關,還與潛在損失的規模有關。

根據自己對風險的認知,每個人都使用點狀投票。

每個人都需要在便利貼上標記點狀投票。每個人都會獲得固定數量的選票。如果您認為這樣做是正確的,在同一個威脅上投票多次是可以的。

以這種方式投票將為低投資帶來良好的風險決策,反映小組中不同的觀點。人們對風險有直覺,並且能夠在最少的提示下投票。

iii. 找出風險最高的威脅

您需要計算每個威脅的得票數,並以某種方式標記得票數最高的威脅。或許可以用筆圈出風險最高的威脅。

我經常被問到我們應該在一個會議中找出多少威脅。第一次時,三個會是一個不錯的數字。這為投資的時間提供了良好的平衡。但請運用您的判斷力和進行實驗。可能有一項非常有風險的項目 - 現在解決該項目的時機恰到好處。同樣地,一個會議中可能會出現四或五個威脅。

iv. 拍攝註解圖表的相片,並記錄威脅

在此階段使用手機相機拍照,以捕捉腦力激盪和優先順序的輸出。如果您使用遠端工具,則可以截取螢幕畫面或匯出。將影像上傳到您的 Wiki 或將其儲存在某處的儲存庫中非常有意義。

將修正新增至待辦事項清單

團隊的投入時間對於後續工作至關重要。軟體團隊已經具備一種強大的方式來表示和排序活動以交付軟體:積壓工作。現在是時候找出您實際上需要哪些修正來降低風險。使用團隊現有的流程和工作方式來支援這一點(請參閱側欄)。

v. 在積壓工作中捕捉安全性修正

對於每個優先威脅,定義具體的後續步驟。在安全性的語言中,您可以將這些稱為「控制項」、「緩解措施」、「防護措施」或僅僅是安全性修正。這些修正可能採取各種形式。讓這些修正具體化,以便在修正「完成」時清楚,因此風險已經降低。

  • 驗收標準是最常見的威脅建模安全性修正類型。這些將被新增以反映現有故事的額外範圍。例如,可能有一個執行動作的故事,而額外的驗收標準可能是授權檢查。驗收標準應該是可測試的。
  • 如果對業務分析師和團隊有意義,故事可能會出現以實施特定控制項,或從現有故事中分割出來。例如,將單一頁面應用程式與身分系統整合可能會形成「驗證使用者」的故事。
  • 如果我們不確定我們是否實際上容易受到攻擊(後端呼叫可能是自動清除的嗎?),或者如果我們不確定問題的最佳解決方案,並且值得投資一些開發人員時間來找出答案,那麼時間限制的探索非常有用。
  • 完成定義是團隊必須滿足的一組條件和驗收標準,才能考慮完成一項功能。如果您確定所有 API 呼叫都需要經過驗證、授權和記錄,那麼您應該在完成定義中反映這一點。這樣您才能在簽署故事之前一致地測試它。
  • 史詩是安全架構中的重要部分,在威脅建模中被識別出來。範例可能是引入身分提供者、安全事件系統,或以特定方式設定網路。預期威脅建模會在專案早期產生史詩。

vi.總結並結束會議

如果你在會議中將修正寫在卡片或紙上,請確保有人負責將它們新增到專案追蹤工具或敏捷看板中。理想情況下,產品負責人會參與威脅建模會議。如果沒有,請採取行動,與負責根據威脅優先順序安排工作的人員溝通,以便你適當地設定優先順序。

確保威脅建模產生影響的最佳方法是交付修正,然後再次進行威脅建模。

實際範例:待辦事項中的範圍

在投票時,團隊決定三個威脅風險最高,值得修正。

直接繞過授權至 API

雖然使用者必須登入才能看到頁面(已驗證),但團隊發現沒有任何機制可以阻止未驗證的請求直接傳送至 API。如果這個漏洞進入生產環境,後果將不堪設想!團隊在會議之前沒有發現這個漏洞。

他們將下列驗收標準新增至故事中,以便在故事簽核過程中明確地進行測試。

假設單一頁面應用程式向 API 發出 API 請求

當請求中不包含目前使用者的有效授權令牌時

則 API 請求會被拒絕,並標示為未授權

透過使用者輸入進行 XSS 或注入

使用者個人資料功能允許使用者輸入個人詳細資料、地址和配送偏好。這些詳細資料會由各種舊式後端系統進行詮釋,這些系統可能容易受到 SQL 和 XML 注入攻擊。

團隊知道他們會在接下來的迭代中實作許多功能,這些功能會接受使用者的輸入並將其儲存在後端。他們沒有將這些類型的檢查新增至每個故事中,而是將下列內容新增至團隊的完成定義中。這表示可以在故事簽核過程中持續檢查。

所有 API 變更都經過 XSS、SQL 和 XML 注入的清除測試

來自網際網路的拒絕服務

來自網路風險團隊的與會資安專家建議,他們的工作中已強調線上犯罪者發動分散式拒絕服務攻擊所造成的收入損失。

由於此需求涉及將軟體與第三方安全服務整合,在本例中為內容傳遞網路,因此團隊撰寫了一個特定故事來捕捉所需的工作。安全專家同意與團隊合作實作。

作為網路風險專家

我需要所有面向網路的 UI 和 API 要求都通過內容傳遞網路

這樣我們才能減輕因犯罪者拒絕服務而造成的收入損失

在工作定義完成並準備新增到待辦事項清單後,威脅建模會議就完成了。下次見!

擴展您的實務

「我們做得夠好了嗎?」

在本指南的開頭,我介紹了三個問題的結構。但實際上有四個問題,因為我們總是需要取得回饋並改進。

反思並持續改進

回饋和持續改進是風險管理的核心。正如我在本指南開頭所強調的,我們建構的系統和它們所面臨的威脅都不是簡單的。而且每個團隊都不同,具有不同的技能、工具、限制和個性。威脅建模沒有單一的方法,本指南僅提供一些基礎知識讓您入門。就像測試驅動開發或持續傳遞一樣,威脅建模會帶來投資回報。

一旦執行了一些會議,改善方法之一就是對威脅建模工作進行回顧。詢問哪些地方進行得很好,哪些地方可以改進。時機是否正確?範圍是否過於詳細?不夠詳細?您使用的位置或遠端工具如何?會議後出現了哪些問題?範圍需要多長時間才能傳遞?透過詢問這些問題,團隊將會適應並隨著時間建立精通,加倍努力於有效的工作,並捨棄價值不大的工作。

隨著時間推移,您可以發展出最適合您的團隊或組織的最佳實務。以下僅提供一些後續步驟的想法

  • 嘗試使用不同類型的圖表。對於 OAUTH2 驗證流程之類的東西,UML 順序圖可能比簡單的元件圖更好。
  • 使用特定於網域的威脅函式庫。有許多資源可以幫助您集思廣益威脅。OWASP 有一些關於行動裝置或 API 的絕佳資源。最近對使用 ATT&CK 架構產生了濃厚的興趣。
  • 沒有萬靈丹。威脅建模並非找出基本編碼或依賴關係問題的有效方法。在軟體傳遞管線中使用自動化工具來補充威脅建模。
  • 就像軟體中的其他所有事物一樣,如果不進行測試,就無法認為它已完成。使用威脅建模來找出要測試的失敗條件。
  • 針對系統的風險概況執行一個階段。這種分析通常著重於您正在處理的資料類型以及您的服務對他人的價值,在安全術語中,深入探討您「資產」的商業價值。
  • 針對您的系統執行一個階段,以找出更廣泛的威脅。根據最佳可用資訊(例如威脅情報、實際攻擊技術的文件和類似系統的實際事件)來分析潛在攻擊者的能力和動機是很常見的。
  • 加入威脅建模社群,例如 OWASP Slack 上的威脅建模頻道,或關注威脅建模 SubReddit。在 Twitter 上關注其他從事威脅建模的人。

結論

安全中的許多「解決方案」似乎旨在讓開發人員遠離安全。這並不表示它們是糟糕的解決方案。管線中的自動化檢查對於找出漏洞非常有效,您應該使用它們。滲透測試可以找出您自己無法發現的問題。具有安全預設值的平台可以消除許多常見威脅。然而,每個「解決方案」只針對有限類型的威脅。雖然網路風險並非簡單的事物,但它具有多面性且不斷變化。了解此風險是有效管理風險方法的核心。

威脅建模的殺手級應用程式是促進整個團隊對安全的了解。這是讓安全成為人人有責的第一步。就像業務成果、品質、整合和基礎架構一樣,安全可以成為團隊思考軟體傳遞方式的核心。而不是在最後才加上去。根據我的經驗,具備威脅建模肌肉記憶的團隊是一個主動管理網路風險的團隊。

我記得有人告訴我,威脅建模對大多數開發團隊來說太難了。我根本不願意接受這種說法。我了解如何改善開發人員處理安全的方法。從那時起,我幫助許多團隊開始使用威脅建模,並踏上正確了解安全的旅程。我從未遇過認為威脅建模或安全太難的團隊。特別是當以平易近人的方式解釋時。這正是我試圖在本指南中所做的。

我相信威脅建模是軟體開發團隊的一種變革性實務。一種協作且基於風險的實務,可以持續應用。如果您是軟體團隊的一員,請將本文寄給您的團隊,並建議進行威脅建模階段。或轉發給貴組織負責軟體安全的任何人。透過撥出一些時間來執行一個階段,您可以開始著手進行。透過開始了解系統所需的威脅、風險和安全修復,您正在朝著有效的網路安全邁進一步。

我希望本指南能幫助您的團隊開始威脅建模。至少一個階段應該可以立即提供價值,並將良好的安全故事和驗收標準新增到您的待辦事項中。此方法已幫助 Thoughtworks 客戶的許多開發團隊採用全面的網路安全方法。我希望對您也有幫助。


致謝

感謝 Martin Fowler、Adam Shostack、Charles Weir 和 Avi Douglan 提供詳細、周到的回饋,協助撰寫本文的早期草稿。任何精緻或細微之處,都歸功於他們。

感謝 Thoughtworks 的 Nalinikanth Meesala、Mona Fenzl 和 Sarah Schmid,他們協助我提供有關遠端執行威脅建模會議的指導方針 - 指南中的該部分應歸功於他們!

感謝英國國家網路安全中心社會技術小組(以及 RISCS 旗下的開發人員中心安全研究組合)的各位,讓我了解到威脅建模並非「簡單」的事。

感謝參與 OWASP 威脅建模專案的每個人,提供所有意見回饋和智慧的公開分享。

感謝 Katie Larson 出色的校對,協助從我的意識流中提取可讀的句子。

感謝 Thoughtworks 行銷部門的 Pete Staples 和 Jeni Oglivy,讓 STRIDE 提示卡看起來很棒。也感謝 Matt Pettitt 協助將它們格式化為此網頁。本指南中的所有圖片均來自 Unsplash.com 的攝影師,在此致謝。

最後,非常感謝 Thoughtworks 中與我合作,改善我們的威脅建模方法和指導方針的每個人。特別是 Harinee Muralinath、Jaydeep Chakrabarty、Fulvio Meden、Neelu Tripathy 和 Robin Doherty。

腳註

1: 一些值得一提的結構化方法:PASTAOCTAVE。此類方法旨在由全職安全專家實施。它們適用於偏好前期進行大型設計的環境。儘管有許多有用的部分,但敏捷環境中的軟體開發人員將難以有意義地採用這些技術。遵循這些指南時,通常會出現大量製作成品(通常是攻擊樹!)的模式。然後,在「預算用盡」後,團隊無法繼續執行可降低風險的軟體變更。

2: 廣泛撰寫威脅建模並提供本指南回饋的 Adam Shostack 提出三問結構。他還補充了第四個問題「我們做得夠好嗎?」我同意 Adam 的觀點,即我們需要反思並改善威脅建模的成果。然而,我從基本結構中省略了這個問題,因為我相信它可以在其他地方解決。根據回饋進行反覆運算和改善應是敏捷軟體開發中隱含的,特別是當我們「少量且頻繁」進行威脅建模時。我在本指南中加入了最後一節,說明如何反思、改善和提升團隊的威脅建模成果。

重大修訂

2020 年 5 月 28 日:發布最終分期付款

2020 年 5 月 27 日:發布優先處理和修復

2020 年 5 月 26 日:發布集思廣益威脅

2020 年 5 月 20 日:發布說明和探索

2020 年 5 月 19 日:發布準備開始

2020 年 5 月 18 日:發布第一部分