孫子兵法:知彼知己,百戰不殆;不知彼知己,一勝一負;不知彼不知己,每戰必殆。html
微軟:威脅建模實踐使開發團隊能夠在計劃的運行環境的背景下,以結構化的方式思考、記錄並討論系統設計的安全影響。威脅建模是幫助保護系統、應用程序、網絡和服務的有效方法。這是一種工程技術,用於識別潛在的威脅和建議,以幫助下降風險並在開發生命週期的早期實現安全目標。前端
OWASP: identifying, communicating, and understanding threats and mitigations within the context of protecting something of value.git
計算機發明後不久,人們就發現須要爲這些信息系統處理威脅。早在1994年,NSA和DARPA就提出了攻擊樹、威脅樹等概念。1999年微軟內部發表了題爲《The threats to our products》的文章,爲定義Windows全系產品面臨的安全威脅正式提出了STRIDE助記符。隨着2002年比爾·蓋茨著名的《可信任計算備忘錄》宣言發佈,微軟承諾改善軟件產品的安全性,隨即正式在SDL(安全開發生命週期)中採用了威脅建模。github
威脅建模數十年來不斷取得你們的承認,在業內也有STRIDE、Trike、OCTAVE等多種方法論實踐。安全行業的從業人員廣泛認識到,在研發團隊的安全例行活動中,對於一些擁有重要數據資產、安全事件影響力大的系統除了要進行常規的滲透測試、黑白盒代碼掃描以外,更應該系統地按期開展威脅建模活動並對業務賦能。算法
對美團安全團隊來講,引入領先的安全技術設計能力,構建全方位、多維度智能防護體系,是咱們不懈追求的目標。美團有衆多基礎設施,核心業務系統也須要以成熟的方法論進行威脅評審。本文將着重分享威脅建模是如何幫助美團安全團隊評估、發現大量安全設計的風險,以及在互聯網企業,應該如何大範圍地實施威脅建模並完整地進行落地。數據庫
普及威脅建模流程和技術能夠有效提高企業的安全建設水平,做爲互聯網企業,要實施敏捷的軟件開發流程,威脅建模活動也應儘可能便捷,但實際工做起來並不簡單,落地過程當中也會遇到很多挑戰。按優先級排序,挑戰包括如下幾個方面:後端
在進行復雜的威脅分析時,並非SDL一個團隊就能夠獨立完成的,還須要數據安全、IT安全、風控合規等安全團隊協做,評審活動也涉及到內容、網絡、隱私保護、法務、運維各個領域。各參與者最好提早創建對公司基礎設施、安全分工的認知,相對清楚各個產品的做用、特色、接入辦法、適用場景。建議實施威脅建模的參與人員都瞭解有關產品的設計、接入文檔材料,看不懂不用擔憂,多瀏覽幾遍,逐步熟悉便可。安全
對於實施威脅建模的負責人有四個層面的基本技術能力要求,包括:服務器
威脅評審,重點是評和審,對參與威脅評審的人員軟實力要求,包括:網絡
準備
實施威脅評估時,首先要取得業務團隊負責人的認同:無論有沒有事件驅動,安全團隊的參與都將爲業務系統提供產品競爭力。哪怕現階段安全並不能徹底賦能給業務,但長期來看,威脅建模應該在業務技術迭代的每一個環節都去自助實施。隨着技術的積累,業務團隊獨立完成威脅技術安全分析是有可能的。
團隊
參與團隊以「Two-Pizza Teams」團隊爲最佳,創建工做團隊後,按需引入相關人,之後這個工做組聚焦爲業務提供安全能力。保持溝通是構建產品安全的訣竅,實施威脅建模的效果深受團隊如何組織和交流的影響。
週期
實施這項活動的整個週期除了解決風險的階段稍長,從問卷調查到給出威脅評估報告,建議持續時間爲1到2周;如時間過短,團隊成員之間不能創建足夠的信任,不能充分給出安全評估的結果;如時間太長,會忘記以前討論的結果,耗費雙方團隊精力。威脅評估迭代的週期保持靈活,在人力充足的狀況下以重大變動、功能模塊迭代的數月、半年一輪爲佳,人力不足的時候應儘可能把評審過程由人力到工具化、自動化、服務化。
流程
安全架構評審的核心是威脅建模,詳細參考能夠參考 《安全架構評審實戰》 一文。固然,傳統的建模流程過重了,雖然尊重業務的設計過程很複雜,威脅分析也沒有理由取巧走捷徑,是改善安全必須付出的成本,但應儘可能在複用現有流程的同時針對敏捷開發作出適當精簡——經過問卷簡化核心安全要素的分析、經過組織流程優化溝通方式、經過融入研發流程快速閉環。總結出比較適合互聯網企業的評估工做流程以下:
同業務的訪談要反覆進行屢次,安全團隊的風格要麼過於強硬,要麼容易臉皮薄,以爲和業務打交道要對方屢次配合,很差意思打擾業務,這是錯的,須要糾正。
繪製數據流圖,識別定義威脅、處置威脅、驗證風險獲得正確處理是威脅建模的四個經常使用步驟。
爲何咱們須要建模?由於實施威脅建模時每每系統並未完整構建,模型會幫助思考系統的設計,以攻擊者和防守方的方式思考對應的安全威脅。
通過初步問卷和訪談後,安全團隊也收集到大量業務反饋的信息,產品和應用安全團隊聚在一塊兒討論軟件架構和潛在的安全問題。使用威脅建模工具、審查數據流圖、威脅模型的目標都是爲了達成更充分討論的目的而服務。建議安全團隊基於業務的流程圖、調用關係同業務一塊兒繪製DFD數據流圖。通常常見的數據流形式有:①白板上做爲會議隨堂討論的示意圖,輔助提升溝通效率,通常用於說明系統層級架構;②業務現有文檔中的時序圖、UML圖輔助理解複雜問題和技術細節。
畫系統架構的目標是解決利益相關者的關注點,業務實現安全功能,安全實現安全設計。你們廣泛反映實施威脅建模時都在畫架構圖時遇到最大的困難,糾結於用什麼工具。在繪製DFD圖的工具選擇上:
回過頭看早期的一些對威脅模型的判斷每每不許確的,沒有關係,畢竟你曾經「實施」過威脅建模了。繪製數據流的過程能夠理解業務、確保安全視角沒有遺漏。威脅建模徹底自動化基本是僞需求,沒有足夠多的業務產品須要持續進行建模評審、大量的原始信息來自於文檔、架構師的經驗、場景和知識極其複雜。建議儘快上手可使用系統自帶的流程圖,使用Visio和Draw.io最方便。
數據流的細粒度也難以抉擇,謹慎地選擇信息的層級和粒度並非一件容易的事情,初學者剛開始的時候老是以爲每一個功能都得拆分,每一個功能都要求加密,靈活程度取捨於所使用的架構模型、架構師的經驗和系統的複雜度。根據筆者的經驗,一種C4 Model結合微軟威脅模型圖例的方法容易取得合做方業務架構師的認同,如下給你們作個簡單的示例。
系統上下文圖(System Context Diagram)
在這一層級中細節並不重要,只顯示系統概況。 重點應該放在人員(角色)和軟件系統上,而不是技術,協議和其餘低層級細節上,從而使非技術人員也可以看得懂。這個圖也是明確需求的重要圖示。這表示一個應用和其餘系統的下轄有調用關係。不須要完整表示數據的流向,只要大體描述清楚系統的周邊關係,不遺漏關鍵步驟。
上述這個層級的示範是微軟Azure的威脅建模的數據流圖,優勢是經過數字表示了流程順序。
應用圖(Application Diagram)
應用是可單獨運行/可部署的單元(例如,單獨的進程空間)執行代碼或存儲數據。應用圖顯示了軟件體系結構的高層結構以及如何分配職責。它還顯示了主要的技術選擇以及容器之間的通訊方式。
一個應用包含多個服務,若是一個系統有多個子系統,應該對每一個子系統都進行分析。經過威脅建模應該嘗試瞭解總體狀況,包含應用自己、數據庫、交互、部署場景、雲服務、接入的基礎服務。下圖是模擬一個支付應用的示例。
服務圖(Service Component diagram)
服務圖顯示了服務如何由多個「組件」組成,每一個組件是什麼,它們的職責以及技術/實現接口(API)或者細節。這個細粒度的分解是建模最大的工做量,爲分解的各個通用組件建立的威脅模型結果能夠複用在其餘應用上。好比Kubernetes被分爲Kube-Proxy、ETCD、Kubelet、Kube-APIServer、Scheduler、Container、Pods等。
代碼層級
這一層是可選的,可使用UML類圖、實體關係圖、函數調用關係或相似的圖。對於分析特定代碼層級的漏洞很方便。推薦使用白盒掃描工具、IntelliJ IDEA的依賴矩陣、Diagrams、Flow插件進行分析。
數據流圖這項技術自己存在的不足是:關注組件的交付是仍是相對偏數據流動視角,很多人的交互場景如釣魚、敏感功能誤操做不能表示出來;不能徹底遍歷出程序的所有功能(除非圖足夠複雜);基於程序設計圖之上繪製卻又丟失了設計細節,沒法自動化;數據流會額外顯示出基礎設施引發的風險,並不只僅是業務自身的安全。
威脅建模是一種協做行爲,一類結構化的思惟方式,一項實踐的科學。以軟件程序爲中心的威脅建模、枚舉威脅、解決威脅、驗證來解決四個問題:具體業務是什麼?哪些地方可能出現風險?如何規避解決?是否覆蓋完整。
因此識別威脅的第一步是靈活定義攻擊者的目標,組織要保護的資產和信任級別,如:S3存儲、源代碼、主機、數據庫、憑據、行級數據,知識產權等。公有云、私有云不一樣的責任共擔模型就清晰給出了不一樣的業務須要關注哪些資產的示例,雲上資產的建模更關注安全的信任邊界。
第二步給出明確的攻擊路徑,定義攻擊者:好比惡意內部員工、外部攻擊者,競爭對手、好奇者等,攻擊路徑的抉擇直接影響攻擊面和信任邊界的劃定。
第三步即威脅評估的過程不能缺乏架構分類思惟。通常使用 ASTRIDE(隱私、欺騙、篡改、信息泄露、否定性、拒絕服務和特權提高)和攻擊樹模型做爲經常使用的威脅建模技術指導原則。
| ASTRIDE (Advanced STRIDE )
微軟已經再也不維護STRIDE,採用ASTRIDE更符合面向消費者的網絡安全行業的發展。
將系統分解爲相關的組件,分析每一個組件對應的威脅。有個技巧是從外部實體逐次開始,關注有交互的進程,沒有交互的進程通常沒有威脅。
上圖中,數據存儲僅是保存日誌信息時纔有抵賴的威脅。
分析威脅模型和業務互動時,按照上面的兩張表考慮每一個元素對應的威脅,實施時要對照進行思考當作Checklist來分類。ASTRIDE是幫助認識歸類威脅的工具,而不是分類定義,某些威脅好比沒有啓用HTTPS,從中間人攻擊的角度分析實際的風險既是數據泄露,也屬於篡改、隱私分類,有的威脅如IoT設備的爆炸、丟失不屬於以上任一分類,沒有必要強行去分類,反正已經發現記錄威脅了。另外,信任邊界很重要,安全本質是信任問題,攻擊面的定義直接影響威脅的劃分。
幾個安全概念的區別
舉個例子:存在新冠肺炎病毒是「威脅」,沒帶口罩是「漏洞」,存在感染病毒多是「風險」,人體不能解決病毒是「Bug」,主動免疫是安全需求。
對於威脅的判斷來源,能夠參考:
以上舉個簡單的例子,場景是租戶經過第三方開放平臺登陸後經過微服務處理業務。
對於API網關,存在的威脅包括:
認證和受權
日誌和監控
對於IAM服務服務器,存在的威脅包括:
認證
可用性
對於MySQL服務,部分存在的威脅包括:
評估風險結果沒有列出來有些是自動承認忽略的,有些是放在基線等安全控制措施,大多數的威脅發現都是基於參與者的經驗,能夠從安全最佳實踐、加固指導、歷史案例造成知識庫積累下來。具體實施的過程目前沒有徹底的自動化工具,可是檢測項通常有共識:好比從域名系統查看是否啓用強制HTTPS、S3對象存儲查看是否啓用服務器端加密、硬編碼問題、是否加入FIDO等。
雖然威脅建模的一個要點是避免關注漏洞而不是威脅,但基本沒有一個系統是從零搭建的。新的項目也會大量引入框架、組件、第三方服務,適當的安全測試是必要,原則是聚焦發現設計方面高層次的風險,但若是參與人員具有一些實際攻防能力,能夠將其餘安全工具發現的問題歸入一塊兒解決,百利而無一害,自己建模的一個目標就是指導安全測試的方向。測試時要注意常見的攻防案例是影響機密性,也要考慮攻擊者破壞應用的可用性和完整性。
| 攻擊樹模型
安全專家大都熟悉實戰中經過哪些攻擊手段能夠損害資產。不少網絡上的滲透測試報告就是以攻擊鏈路造成的思惟導圖爲例,能夠據此細化出一個產品的攻擊樹。攻擊樹模型有兩種方法:自下而上和Use Case型。前者是所有覆蓋到實現目標的入口,後者基於前者的細節,在肯定攻擊的前提下展現出實際的攻擊,涉及大量用例的、業務邏輯複雜的、有交互過程的、系統已經設計完成的,經過攻擊樹很容易發現安全威脅。攻擊樹模型通常遵循如下的定義圖例:
經過下面舉個例子,攻擊者嘗試持久化在Kubernetes集羣內部執行命令,能夠經過部署惡意鏡像、容器內執行命令、提權控制宿主機多種方法。在部署惡意鏡像這一步,自下而上瀏覽首先要具有訪問Kubernetes API權限的認證信息或Kubelet工具的憑據,而後必須有鏡像倉庫操做寫的權限,而後部署惡意鏡像。
識別到威脅後對威脅進行幾個處理步驟:
通過上述的活動,咱們獲取了一個大的威脅列表,下一步就是處置評估出來的每一個風險,這方面的材料能夠參考ISO27001和ISO31000的系列指導。分爲四個應對措施。
緩解
採起措施加大攻擊者的利用時間。就像Google Project Zero的原則「Make 0-Day Hard」。好比發現密碼猜解的威脅,採用二次認證、風控驗證碼的技術,緩解和解決風險的界限每每並不清晰。仔細想一想大部分的平常安全工做都是緩解威脅,好比部署WAF、制定安全規章制度、監控和響應。
解決
徹底解決該威脅。解決是最樂觀的狀況,常見的安全方案是基於現有的代碼實現,好比防SQL注入組件,使用加密套件解決硬編碼問題。若是威脅建模是發生在編碼以前,可使用現有的安全方案如Security SDK、密鑰管理服務、身份認證方案,固然也能夠引用新的安全技術去建設。
轉移
轉移是將威脅承擔交由其餘系統去處理,好比用戶協議和隱私條款、免責聲明,變動管理的二次認證、外包、購買網絡安全保險。可是安全也不能對業務給個方案說你得買一份保險,這須要找到安全和業務的平衡感。
接受
接受風險也是面對安全成本的一個合理處理方式,不一樣層級的業務負責人對待安全的視角是有不一樣考慮的。好比在物理安全領域,咱們每每作得適度投入,背後的緣由是接受了戰爭、核武器等不可抗拒因素。
依據上述的威脅定義補充是等級、優先級、修復成本、負責人、排期、安全測試結果、解決方案記錄結果,報告文字要規範,避免使用安全特定術語、縮略語如PoC、RCE、SSRF、HIDS字樣。給出前瞻性的安全方案是區分安全測試和威脅建模的主要區別。對於共性問題創建孵化安全解決方案,有安全專項的也進行標記,後續能夠比對安全項目的效果。
解決威脅的抽象原則要區分出安全建設的原則縱深防護、最小權限原則、默認(強制)安全並不必定適用於業務系統,業務更熟悉安全架構設計的5A原則:
5A的劃分容易讓業務理解到開發架構、邏輯架構、數據架構、技術架構、業務架構中,從而避免由於安全緩解措施的影響致使本來的業務需求不能實現,或者性能、編碼、成本變動得太多。
完成威脅建模的標誌是雙方團隊對圖表沒有異議,能夠依據數據流圖,複述清楚數據流向、攻擊面如何、已經作了什麼、存在哪些風險、應該作到什麼。讓業務沒有安全知識的提高的建模是失敗的,業務方應當是下一個產品迭代中安全提高的主動貢獻者。
如下是威脅列表的結果示例模板:
修復問題就是安全團隊複查威脅獲得合理的處置,高標準就是合理。跟蹤威脅的解決不要拘泥於使用的安全內部的工單系統,在業務的研發管理系統記錄也是一個明智的選擇。同業務方制定單雙週的溝通會,確保每一個風險在跟進按時解決。威脅建模並非一次性活動,每次雙週溝通都簡短溝通,花5-10分鐘再一次實施建模:溝通下遇到什麼困難,有什麼安全需求,積累建模的習慣,經過反覆執行這個活動能夠從設計層面識別大量的安全風險。
咱們老是提安全要Shift Left(左移),建模給了產品團隊良好的「右移」機會。團隊之間的知識共享幫助你們理解安全的本質,知道安全這件事該如何作,從而逐步改善公司的安全情況。Security by Design要求安全前置介入到需求和設計階段,真正讓介入需求階段,安全又老是無從下手,其實需求階段的安全活動包括用例驗證、資產識別、安全基線,將權限、日誌、操做安全、加密需求、編碼規範、基礎服務歸入安全相關基線,設計階段主要有方案評審、安全特性設計,最重要的更是威脅建模。團隊互動的過程要以文檔的形式完整記錄,這種材料是給其餘團隊下一次威脅建模的有效輸入。
威脅建模不能立竿見影,建模沒有什麼特別的,對於業務方來講應該是同編碼、測試、交付同樣很普通的工做,安全也僅僅是平常工做的一部分。事情的主要目標是創建產品的安全屬性,能夠經過最終的安全缺陷改進狀況、評審覆蓋度、修復解決率做爲過程指標,安全成熟度、安全事故數做爲結果指標。實施投入威脅建模自己已是一件技能很複雜的事情了,對參與人員引導作正確的事,不須要設置發現威脅數等硬性指標。
威脅建模在於對評估可能的風險、分析潛在攻擊者的手法、攻擊路徑,提高產品的抗攻擊韌性方面有獨特的優點。這項方法論根本沒有什麼最佳實踐,沒有單一的「最好」或執行威脅建模的「正確」方法,而是爲了知足解決這些威脅而實施的一系列複雜和多維度的權衡,惟有不斷修正迭代才能完善。但若是沒有威脅建模過程參與,組織不會清楚現有系統的安全現狀。無論怎樣,一旦你取得階段性的成果,組織內部就認識到這樣的協做能夠對改善整體安全情況產生較大的做用,是高性價的投入,就能夠克服關於威脅建模耗費人力、週期長、難點大這些阻力的聲音,從而真正從事預防性的安全建設。
美團內部實施威脅建模時,首先就設立了以下的目標:
經過制定的威脅建模計劃同業務部門深刻開展合做,團隊完成了數十個項目的評估,發現了數百個高危設計缺陷,從而試圖解決兩類核心問題:①人爲操做致使的安全風險;②安全融入基礎架構。識別提煉出孵化出特權帳戶管理平臺、服務鑑權、執行沙箱、全程票據、安全知識庫等安全子項目。固然建模的效果有好有壞,咱們仍需學習、調整、迭代。咱們總結了以下的經驗教訓:
業界關於威脅建模的實施方法論在物聯網、機器學習、Serverless場景依舊頗有生命力,說明在軟件工程領域這會是識別威脅真正有效的辦法。相信Threat Modeling Application Security Testing(威脅模型驅動的應用安全測試)將成爲應用安全的又一主流安全測試方法。
閱讀美團技術團隊更多技術文章合集
前端 | 算法 | 後端 | 數據 | 安全 | 運維 | iOS | Android | 測試
| 在公衆號菜單欄對話框回覆【2020年貨】、【2019年貨】、【2018年貨】、【2017年貨】等關鍵詞,可查看美團技術團隊歷年技術文章合集。
| 本文系美團技術團隊出品,著做權歸屬美團。歡迎出於分享和交流等非商業目的轉載或使用本文內容,敬請註明「內容轉載自美團技術團隊」。本文未經許可,不得進行商業性轉載或者使用。任何商用行爲,請發送郵件至tech@meituan.com申請受權。