從SDL到DevSecOps:始終貫穿開發生命週期的安全
隨著雲端計算被普遍運用,微服務等基礎架構的成熟,同時企業業務高速發展帶來的對開發運維更高效的要求,企業開發運維模型也從傳統的瀑布模型演變到敏捷模型再到DevOps,而安全模型也隨之改變,但其核心一直都是貫穿始終以及更前置的安全。其中“DevSecOps”是Gartner在2012年也提出的DevOps模式下的安全概念,人人為安全負責,讓業務、技術和安全協同工作以生產更安全的產品。
從漏洞與威脅防禦說起
假如問大家“如何收斂產品中的安全漏洞”,可能得到的答案是安全測試;而如果問題改為“如何減少產品中漏洞產生”,那麼答案可能是“減少漏洞程式碼”。
其實兩個問題得到的答案對應的是兩種防禦理論,一個是漏洞防禦,一個是威脅防禦。
漏洞防禦體系從防禦角度是類似導彈防禦系統,針對性的防禦,面對的物件是可以識別的也就是已知、明確的安全漏洞進行修復和防禦,這種方式好處就是模式簡單,能夠快速、高效的起到效果,但問題也很明顯,就是這事一種單點的方式,其實是適合攻擊,所以會不夠全面,存在未知的風險。這事一種增加攻擊成本的方式,我把漏洞都補上了或者加上防禦措施,那麼一般的駭客想攻破我的系統就得突破導彈防禦系統,也就是找到防禦方沒有修復或者增加防護策略的安全問題,攻擊成本就變得更高;
而威脅防禦體系,其實講究的是基於軟體開發全生命週期甚至包含運維階段發掘潛在的安全威脅,透過威脅建模、安全設計、安全測試等多個角度消減威脅和建立防禦手段。相對比漏洞防禦體系,這裡的威脅不需要是明確的已經形成的安全問題,而是潛在的威脅都應該建立對應的手段進行識別和消減。優勢自然顯而易見,更系統化,更全面,但更系統更全面自然需要花費更多的時間,整體執行週期長,同時要求在各個階段都要有安全動作,操作複雜性高,要求安全覆蓋度更高。
過去我們在梳理騰訊雲相關安全落地的具體體系的時候,其實就是結合了兩種理論,參考SDL、IPDRR等模型制定:
更前置的安全
回到軟體安全開發,不管是SDL還是DevSecOps,其中主要強調的一個就是安全前置或者安全左移,就是更早的在軟體開發生命週期嵌入安全動作,就能更容易的收斂安全漏洞問題。
統計來自Forrester Analytics Global Business Technographics Security Survey, 2019,圖來自《SDL已死,應用安全路在何方?》
為什麼要關注應用安全?關注軟體開發安全?這是來自Forrester的一個調研統計,從圖中可以看出,企業的攻擊風險點依舊是以應用漏洞為首,攻擊者依舊是緊盯目標在軟體安全領域的安全漏洞持續滲透。
而這張圖描述了在開發運維不同階段的漏洞修復成本,可以發現越早成本越低,漏洞也更容器修復,所以這就是為什麼軟體安全需要更左移,更前置。
越早的收斂漏洞成本越低,而軟體安全開發模型就是用於解決的方案。
安全開發生命週期(SDL)
SDL由微軟提出並應用一個幫助開發人員構建更安全的軟體和解決安全合規要求的同時降低開發成本的軟體開發過程,側重於軟體開發的安全保證過程,旨在開發出安全的軟體應用。
SDL的核心理念就是將安全考慮整合在軟體開發的每一個階段:需求分析、設計、編碼、測試和維護。從需求、設計到釋出產品的每一個階段每都增加了相應的安全活動,以減少軟體中漏洞的數量並將安全缺陷降低到最小程度。
其實從表中我們就可以清晰的看到每個階段需要做的不同的安全活動,借用網上的一張圖,大概的執行流程是這樣的:
在SDL模型裡,有個比較核心的點是安全設計核心原則:
其他都好理解,重點說下攻擊面最小化和預設安全。攻擊面最小化其實主要是兩塊,一個維度是暴露的CGI等都可能是攻擊點,非必要的介面等要減少,另一個是即時暴露也應該限制訪問訪問範圍從而縮小攻擊面;而預設安全則指產品在設計的時候一些配置的預設項應該考慮是安全狀態,比如一些安全開關應該是預設開啟。
在SDL模型裡,還有個很重要的執行要點,那就是威脅建模,威脅建模是在需求設計階段的一項識別和消減威脅的重要手段。關於威脅建模,微軟提出的一個方法叫做“STRIDE”。
STRIDE威脅建模其實就是基於資料流圖去識別不同環節是否存在仿冒、篡改、抵賴、資訊洩露、拒絕服務、許可權提升幾個維度的安全威脅,並制定對應的消減措施,落實並驗證的一個過程。其中六個維度的威脅大家透過表格裡的安全屬性就可以看到它其實是基於資訊保安基本要素制定的。額外提下,由於隱私安全的關注的爆發,也成為了第七個安全威脅。具體這裡就不對威脅建模展開說明了,大家有興趣可以透過擴充套件閱讀內容進行學習。
經常有同學會對幾個關鍵詞混淆不清,SDL、S-SDLC、SDLC,這裡也額外做下解釋,好幫助大家理解。
透過英文全稱大家應該就可以看得出區別,前兩者都是安全開發生命週期,第三個是軟體開發生命週期。至於S-SDLC和SDL有什麼區別呢?S-SDLC是由開源Web安全組織OWASP推出的一個專案,它跟SDL的區別是它更關注的是SDL的落地化。
DevOps與DevSecOps
要講DevSecOps就必須先介紹下DevOps,就涉及到軟體開發模型的變更。
這是一個軟體開發運維的流程,一開始可能是一個角色負責所有階段,當系統變得複雜化後,於是幾個角色就被區分出來,分別是開發、測試、運維。
針對這樣一個流程,最經典的一個模型是瀑布模型:
就是一個階段做完再到下個階段,我們會發現這是一個很低效的過程,於是後來演變出了敏捷模型(其實還有其他的模型,不過相關性不大,就不做介紹了),我們用來自網上的兩張圖來體現敏捷模型與瀑布模型的區別:
透過對比可以看到,在敏捷模型裡開發和測試不是原來的完成全部開發再測試這樣的情況,而是類似下圖這種:
在敏捷模型裡,大家可以發現,運維階段的工作還是在最後,所以再之後演變出DevOps:
從圖中可以看到迭代過程中,開發測試部署是快速迭代同時進行,部署操作不再是等到最後。這就是一個簡單的開發運維模型的一個變更過程。
然後我們回過頭來看看DevOps:
第一段是來自AWS的解釋,DevOps集文化理念、實踐和工具於一身。可以提高組織交付應用程式和服務的能力。與使用傳統軟體和基礎設施管理流程相比,能夠幫助組織更快的發展和改進產品。這種速度使組織更好的服務其客戶,並在市場上高效的參與競爭。
對於DevOps來說,有個核心元素就是CI/CD,所以到DevSecOps,大家會發現在CI/CD嵌入安全也是一個重要環節。
DevOps的流水線大概是這樣的:
其實,DevOps早在九年前就有人提出來,為什麼這兩年才開始受到越來越多的企業重視和時間呢?因為DevOps的發展是獨木不成林的,現在有越來越多的技術支撐。微服務架構理念、容器技術使得DevOps的實施變得更加容易,計算能力提升和雲環境的發展使得快速開發的產品可以立刻獲得更廣泛的使用。
隨著開發運維模型的變更,SDL就不再是完全適用於新的模型,DevOps帶來的各種優勢和技術趨勢甚至成為了安全實施的難點:
所以早在2012年Gartner就提出了DevSecOps,並透過這麼多年的發展,逐漸成熟。
相對於SDL,DevSecOps不再是一個單純的安全開發模型,也不僅僅是關注開發階段,它所強調的是人人為安全負責,人人參與安全,安全嵌入到開發到運維的每個階段。
所以首先從角色角度,安全團隊不再置身於業務之外,也不再是安全團隊兜底安全,安全是一個開發、安全、運維、QA一起協作的過程。
然後我們可以簡單做下SDL和DevSecOps的對比,其中最明顯就是安全責任、安全關注的流程以及效率的區別。
但是其實是不是原來SDL的東西就沒法用到DevSecOps?需要推翻呢?不是的,需要做的是進一步的流程融入,更加自動化,更多前置,以及安全文化的塑造。
在DevSecOps裡有三個關鍵點,分別就是人和文化、流程以及技術。傳統安全裡業務發展優先,安全是“以後”才會發生的事情,甚至認定安全會阻礙業務的發展,而DevSecOps強調的是人人參與安全,人人為安全負責,安全是大家的事,其實也確實應該是這樣的;而流程方面更多要考慮整合流程,建立相關安全流程,加強不同團隊間的協作,以及安全需要低入侵柔和的嵌入開發和運維流程;技術方面更多是構建安全工具鏈,實現更多自動化安全檢測。
在具體落地和實踐方面,RSAC2019大會安全專家Larry Maccherone提出的實踐DevSecOps的九大關鍵因素文化融合的七個階段,也可以作為參考:
文化融合的七個階段
包含有文化意識維度的安全意識、安全編碼,在架構和設計維度的威脅建模,工具方面需要構建的第三方匯入程式碼分析(第三方元件安全)、程式碼編寫分析;然後是全漏洞管理要建立團隊工作協議,也就是強調協作,建立漏洞管理共識和處理流程,對安全問題優先進行高危漏洞清理。最後其他監督方式如安全同行的審閱,一些安全評估手段。
七個階段運用不同顏色直觀展示DecSecOps在組織中的實踐和接受程度。
這九大實驗要素基本覆蓋DevSecOps落地的一些關鍵點,包括說需要關注供應鏈安全,考慮第三方元件的安全,這也是我們現在在做的一些方向。
在落地DevSecOps過程中,其中很重要的一塊我覺得是構建工具鏈,在不同的DevOps階段需要進行不同的安全動作,都需要不同的工具支撐。
其中比較關鍵的工具是AST及SCA:
DAST就是動態應用測試,比如說我們常見的AWVS、APPSCAN等漏掃就是這個型別,SAST是靜態應用測試,通常就是程式碼審計工具,而IAST則是介於兩者之間的互動式應用測試工具,通常透過插樁的方式,既能像SAST定位具體問題程式碼位置也能像DAST能定位到具體CGI。這裡需要注意的是,通常流量代理測試的方式也有人歸類到IAST,但實際它不是真正意義上的IAST。
過去我們在做騰訊雲研發安全的過程中,也在構建相關工具鏈:
或者透過另外一個檢視可以看到我們過去在雲相關安全工作在DevSecOps中的情況:
除了工具鏈,上文也提到,DevSecOps的落地中很重要的一個部分也是我們一直做的一個點就是如何在CI/CD嵌入相關安全動作。
RSAC2018出現了一個新概念“Golden Pipeline”,叫做“黃金管道”,特指一套透過穩定的、可落地的、安全的方式自動化地進行應用CI/CD的軟體流水線體系,所以基於這樣圖將我們的工具鏈對應上,大概就包含這幾個部分的內容。
所以總結來看,DevSecOps的落地是有幾個關鍵點的:
我用一棵樹來表示,最基礎的部分是工具鏈的建設,然後核心的枝幹,也就是落地點就是在CI/CD中進行安全動作的嵌入,而枝葉部分,一些需要重點的安全動作就包含有自動化測試、軟體成分識別與檢查,以及對應一些在新的技術趨勢下需要特別關注的關注點就包含有容器安全、API安全、第三方元件安全。
過去在幾個關鍵點其實我們也在做一些落地,比如聯合公司內程式碼掃描平臺和其他團隊共同構建的靜態程式碼掃描:
基於公司統一源,以及與其他團隊合作及自研的第三方元件安全管理方案:
與IEG安全團隊共建包含現在開源協同作為公司統一容器基線安全解決方案的容器映象掃描能力:
還有與雲API、官網等團隊合作的一些API安全方面的嘗試:
以及未來更多展望,包含更完善的安全開發庫及自動化安全規範檢查,或者安全設計與需求階段的自動化檢查等。
寫在後面
作者張祖優為原知道創宇安全安全研究員,負責Seebug漏洞平臺、ZoomEye網路空間搜尋引擎為主的漏洞社群,Seebug創始人,多屆KCon駭客大會技術負責人,發起並策劃兵器譜環節。12年安全攻防經驗,長期進行Web漏洞的挖掘與研究,給國內外各大甲方安全公司解決過多個嚴重安全問題,獲得過微軟、阿里巴巴、騰訊、360、新浪等公司致謝; 曾在 KCon、WOT2014、ISF、QCon、BlackHat、國泰君安•信產峰會、網路安全創新大會等安全與技術會議上發表安全相關演講;曾受邀參加北京廣播電臺等訪談,接受過《人物》、雷鋒網、法制晚報等採訪,在《計算機文摘》等雜誌報刊發表過文章。喜歡的小夥伴趕緊pick一下我們噢,一起來打call~
注:文中部分圖來自 https://baijiahao.baidu.com/s?id=1649919009474612596
部落格原文:https://www.fooying.com/from_sdl_to_devsecops_security_in_dev/
擴充套件閱讀
· 微軟SDL https://www.microsoft.com/en-us/securityengineering/sdl/practices
· STRIDE威脅建模方法討論 https://www.freebuf.com/articles/es/205984.html
· 威脅建模工具入門 https://docs.microsoft.com/zh-cn/azure/security/develop/threat-modeling-tool-getting-started
· S-SDLC http://www.owasp.org.cn/owasp-project/S-SDLC/
· 應用安全測試技術DAST、SAST、IAST對比分析 https://www.aqniu.com/learn/46910.html
· 從RSAC看DevSecOps的進化與落地思考 https://www.freebuf.com/articles/neopoints/228886.html
相關文章
- 企業安全開發建設 | 軟體開發流程是主線,管控需貫穿全生命週期2021-01-27
- 安全的軟體開發生命週期2017-03-15
- 從零開始學React:二檔 React生命週期以及元件開發2019-02-13React元件
- 安全軟體開發生命週期簡介2021-12-02
- iOS開發-生命週期2016-07-26iOS
- 軟體安全開發生命週期讀書筆記2010-06-29筆記
- 開發方法---軟體生命週期2018-08-28
- 從馬里奧到只狼,“跳躍”何以貫穿遊戲史?2019-10-12遊戲
- 從零開始學 Web 之 Vue.js(三)Vue例項的生命週期2021-09-09WebVue.js
- 軟體開發的生命週期過程2021-10-29
- Vue從甜小白到皮大佬系列(三) 生命週期2019-08-28Vue
- mpvue小程式開發 - 生命週期梳理2018-11-02Vue
- Java開發學習(五)----bean的生命週期2022-06-15JavaBean
- View生命週期與Activity生命週期的關係2018-11-06View
- IOS開發之UIController生命週期2013-09-05iOSUIController
- Oracle 宣佈 Java 7 生命週期終結2015-05-09OracleJava
- 生命週期2024-09-20
- Flutter 的生命週期2019-06-25Flutter
- SQL的生命週期2021-09-01SQL
- Laravel的生命週期2021-01-14Laravel
- vue的生命週期2017-10-10Vue
- Fragment的生命週期2017-01-06Fragment
- App的生命週期2017-12-17APP
- View的生命週期2017-12-13View
- Servlet的生命週期2024-03-13Servlet
- bean的生命週期2024-07-06Bean
- Ixia為開發者重塑軟體開發生命週期2017-09-01
- iOS開發筆記(九):UIViewController的生命週期2019-03-03iOS筆記UIViewController
- PHP 生命週期2020-02-11PHP
- Flutter - 生命週期2019-09-26Flutter
- sessionStorag 生命週期2019-10-22Session
- Fragment生命週期2019-03-12Fragment
- Activity生命週期2021-09-09
- vue - 生命週期2019-01-10Vue
- React生命週期2020-12-05React
- ubuntu生命週期2023-10-12Ubuntu
- React 生命週期2017-11-06React
- vue生命週期2024-04-23Vue