【編者按】DevOps旨在幫助開發者與運維專家能更有效地溝通和一起工作,本文主要講解如何使用 DevOps最佳實踐來使您的信息安全更加健壯和有效。信息安全及質量保證和測試團隊,也同樣是應當在DevOps框架中被展現的關鍵利益相關者。利用DevOps方式來保證系統安全,防止系統事故,以及確保實現無中斷的服務。(推薦閱讀:2014年DevOps實踐調查報告)
DevOps是一組關注于改善開發與運維團隊之間的溝通與協作的原則與最佳實踐。這些實踐已經被希望開發健壯技術解決方案,以便其可靠性能得到確保并且可以被便捷升級的技術專家所廣泛接受。對于DevOps最初始的關注是幫助開發人員與運維專家能更有效地溝通和一起工作,但其他的利益相關人,例如質量保證、測試和信息安全(InfoSec)團隊也同樣重要。
為何信息安全是DevOps的關鍵組成部分之一
DevOps在確保開發人員與運維人員能一起工作并且更有效率方面非常成功。通過DevOps,運維團隊可以獲得他們所需要用于了解如何建立有效和可靠應用程序構建、打包和部署過程方面的信息。而信息安全組也同樣有許多與運維團隊一樣的需求。此外,InfoSec還需要獲得他們需要用于確保整個系統是安全和可靠方面的信息。正如DevOps幫助開發和運維團隊能更有效地一起工作一樣,DevOps也可以幫助開發和信息安全團隊更有效地一起工作。在DevOps中,持續部署已經成為DevOps的一個關鍵實踐,并且關注于通過自動化的構建、打包和部署來自動化部署流水線。通過提供一個平臺可以在開發生命周期里盡早訪問和定位安全問題,信息安全團隊也同樣能夠從部署流水線上得到顯著的獲益。只要一旦有風險評估被介入,有效的安全保障就應當永遠與之同步進行。
DevOps可以幫助定位安全風險
作為軟件或系統開發工作的一部分,風險需要被理解和定位。安全保障不能僅僅在開發過程的末尾才加入進來。系統需要在開發生命周期的最開始,就將安全保障與設計和開發一道同時得到關注。DevOps提供了必需的構造來幫助定位眾多安全風險,這是創建任何復雜技術系統的內在要求。
安全漏洞往往是各種事件的直接后果。例如,在C/C++系統中進行不恰當的編碼實踐就可能導致緩沖溢出條件有機會被惡意攻擊者用于實施越級程序權限。緩沖溢出攻擊經常被攻擊者所利用,來獲得系統的控制權,甚至可以很有效地獲得root權限。
運行時事件的發生也可能導致不恰當的安全控制,例如發生在不同組件之間的身份驗證與授權。一個常見的安全問題根源就是來自于由于某次部署所應用的不正確的訪問權限。
另外一個安全問題領域是確保所部署的是正確的代碼。在部署過程中所帶來的錯誤有可能會暴露給惡意攻擊者。
在不同接口之間的配置問題經常會曝露給攻擊者,以被其用于嘗試侵入系統。一旦系統缺乏防范措施,不恰當的安全控制問題就有可能導致非授權的變更變得非常難以識別,而且難于執行鑒定證明來查清到底有哪些變更是由于錯誤或是由于惡意目的所造成的。
InfoSec方面的技術專家非常罕有,而且在開發過程的早期也很難有足夠恰當的測試環境來實施有效的安全相關測試。許多組織甚至無法在最開始提供所需的服務器并且部署應用,這樣的條件限制意味著響應安全破壞通常都是一個極其嚴苛的工作,這項工作需要嘗試準確理解代碼存在什么問題以及安全威脅如何能夠被排除。
這些風險實在是太常見了。它們導致許多系統停機事故,這種情況影響了很多的銀行和交易系統,甚至交易活動本身都因此受到影響。如果我們無法在項目的末尾簡單地加入安全保障,那么我們又該如何在最開始就構建安全的系統呢?
通過有效的源代碼管理來構建安全的系統
質量管理大師W. Edwards Deming非常明智地指出,質量需要從最開始構建。DevOps依賴于有效的源代碼管理來創建自動化的構建、打包和部署腳本,從而構成部署流水線。
有效的源代碼管理包括:
版本控制系統
為代碼可靠建立基線的能力
使用流和組件進行軟件架構建模的技術
對代碼多重變體的支持
將所有的源代碼放入到版本控制系統中,使InfoSec可以掃描源代碼來發現安全漏洞。健壯的版本控制系統同樣使得安全分析師可以通過對組件結構、組件間的接口進行建模以理解系統是如何構建的,尤其是組件間的接口,它們經常是惡意攻擊所攻擊的目標。
DevOps及部署流水線幫助有效地創建和提供測試環境,以用于評估和測試在組件間接口上的安全漏洞。通過以及時到位的方式提供一個健壯的測試環境可以增強安全性,通過提供一個自動化的測試平臺可以用于識別需要被定位的安全問題。一旦代碼中的問題被找到,它們就能被定位作為缺陷或變更請求,從而在它們的整個生命周期中被追蹤到,以確保已被識別的風險可以被定位。
健壯的源代碼管理解決方案可以幫助管理應用的生命周期,通過提供一組工具和過程來幫助驅動整個開發,涵蓋從選擇正確的需求到管理在系統還處于產品階段的缺陷等各個方面。追蹤需求和缺陷是基于任務的開發(Task-based development)的核心方面。
開發、運維和信息安全團隊之間的協作
信息安全團隊通常非常缺乏足夠能理解復雜系統常見的內在自有安全漏洞方面的技術專家。正如DevOps能改善開發與運維之間的溝通,DevOps同樣能增強信息安全團隊的能力,它允許信息安全團隊完全理解整個應用以及它是如何構建、打包和部署的。這一知識可以幫助InfoSec維護一個相關的和有效的關注。通過理解系統的基礎架構,InfoSec同樣可以幫助理解何時安全會被突破以及應該采取什么樣的措施應對該安全漏洞,尤其在基礎設施自身缺乏安全免疫力的前提下。在許多案例中,這對使用自動化的過程重建服務器來說非常關鍵。
使用基于任務的方式開發軟件
基于任務的開發(Task-based development)涉及了對諸如任務、缺陷和需求等工作項的創建,以及在為開發相關代碼所創建的變更集中追蹤這些工作項。通過追蹤需求與任務和缺陷之間的聯系,通常由于一個核心需求的實現失敗而導致的安全問題就可以得到避免。
追蹤需求與測試案例之間的聯系也是基于任務開發一個重要的方面,因為它可以確保每一個需求可以得到驗證(verified)和檢驗(validated)。這一可追溯性對于避免由于缺陷而導致的安全漏洞來說非常關鍵。定義和追蹤工作項可以幫助管理開發工作的復雜性。代碼同樣可以被機制化以幫助建立安全測試。
自動化應用程序的構建、打包和部署
可以以多種方式來創建自動化過程來構建、打包和部署代碼來支持敏捷迭代開發。自動化構建過程是實現持續集成(continuous integration)和持續交付(continuous delivery)的一個前提條件。構建過程應當自動化地嵌入不可改變的版本ID到每一個由構建過程所使用或所創建的配置項(configuration item,CI)中。
這也是加密哈希值(hash)應當被創建的地方,以便在下文將要介紹的應用程序部署過程中用于驗證。沖刺里程碑發布版本(Sprint milestone release)可以被用于測試和驗證在項目啟動階段(inception)尚未被完全理解的需求。更加重要的是,關于如何構建每一個組件的技術細節可以被隱含性地文檔記錄,并可以被包括了信息安全方面的感興趣的利益相關者所審閱。在代碼中創建變體可以建立應用程序的測試,包括機制化代碼來建立與安全相關的測試。
使用代碼庫來機制化代碼
將代碼機制化涉及了結合代碼庫來運行代碼,以便可以更加容易地掃描運行時代碼的安全漏洞。DevOps在代碼被構建、打包和部署到一個以識別安全漏洞為目的的測試機器方面擔當了一個關鍵的角色。為了保持DevOps關注于盡早定位問題,對一個應用程序的安全分析需要在整個應用生命周期的過程中貫徹執行。嘗試在生命周期的后期修復一個安全問題會比在開發工作的前期及早期定位它更加困難。通過參與到整個應用生命周期當中,安全分析師可以更加有效地識別系統中存在的任何問題。
如同諺語所說的,“鏈條的堅固程度取決于它最薄弱的環節”("a chain is only as strong as its weakest link")。通過考察系統最全面的視圖,安全分析師可以識別出針對某一個特定組件或組件間接口所存在的問題。面向遺留系統的接口通常是必須的。它們也同樣是鏈條中最薄弱的環節。在漏洞被識別為風險之后,應用程序可以被測試來找到潛在的安全問題。可以采取相應的步驟用于減小風險,并定位安全漏洞。這些技術對于建立早期入侵測試來說非常有用。
執行入侵測試
部署流水線提供了一個有效的框架來創建所必須的測試環境來執行入侵測試。通過DevOps,入侵測試可以在整個軟件和系統生命周期中貫徹進行。通過改善開發和信息安全團隊之間的溝通,DevOps 及InfoSec都可以在通常專門為入侵測試所留出的短小時間片斷里設計和執行更加有效的入侵測試。部署流水線同樣可以使信息安全人員可以獲得對于有效評估安全漏洞來說非常關鍵的技術信息。
編程化地構建基礎設施
安全專家認為大多數的系統都是缺乏免疫力的,而且一旦環境被入侵,惡意代碼通常都可以隨之被卷入。通常黑客會入侵沒有恰當安全保護的系統,然后使用這些系統來攻擊其他更安全的機器。此類的攻擊通常都涉及到拒絕服務攻擊(denial of service attack),由此可以追溯到被用于攻擊的機器。在拒絕服務攻擊中,受信任的受害者會發現他們自身被告發參與發起對另外一個系統的攻擊,并被要求解釋為何他們的機器被用于惡意目的。
當一個系統缺乏免疫時,最佳的直接行動就是徹底清除和重新準備服務器。DevOps提供了許多智能的過程從包括操作系統和應用程序基礎等方面來通過完全自動化的流程構建服務器。這種通過編程化構建基礎設施的能力也被稱為基礎設施即代碼(Infrastructure as Code)。DevOps 中這一關鍵的實踐通常用于支持基于云的基礎設施。這些技術也被稱作敏捷系統管理(agile systems administration)一個引用自與 DevOps 在敏捷開發環境中所提供的價值相關的術語。
使用自動化系統來配置和驗證操作系統
基礎設施即代碼(Infrastructure as Code)通過提供自動化過程來配置和驗證操作系統符合已建立的行業安全標準,例如被廣泛遵從的互聯網安全中心安全標桿(Center for Internet Security (CIS) Security benchmark),可以被用于實現安全的系統。這些標桿精確定義了操作系統應當如何被配置。
對操作系統的準備和對安全配置的驗證這兩方面都可以使用由CIS規范所提供的指南被完全地腳本化。腳本使服務器可以通過一個自動化的過程被完全準備好和提供支持。為了確保一個可靠和安全的平臺,應當從一個完全安全并被正確配置的服務器開始。在您的服務器基礎設施被準備好和可以被驗證之后,就可以使用相同的原則以一個安全和可驗證的方式來部署應用程序基礎。通過嵌入版本ID到每一個配置項中,包括代碼組件、配置和屬性文件,這一自動化構建過程可以確保代碼一旦被部署就可以被驗證。
加密哈希值(Cryptographic hash)應當被創建用在應用程序部署的驗證當中。
部署應用程序本身與提供一個完全安全可信的應用程序基礎同樣非常重要,而且不僅僅只是驗證,還應進行安全漏洞的偵測,包括非授權的變更。為部署驗證構建包含嵌入版本ID的代碼,以及使用加密技術來識別非授權的變更,使得您可以創建一個安全可信的應用程序基礎。
提供安全可信的應用程序基礎
為了確保可信的應用程序基礎,應當使用可以安全識別準確二進制代碼以及所有其他配置項(包括 XML及屬性配置文件)的過程來構建應用程序代碼,以便您可以毫無疑問地證明正確的代碼確實被部署和確認沒有非授權的變更發生。
這些過程通常會使用在應用程序自動化構建和打包過程中就首先創建的加密哈希值。一旦代碼被部署,哈希值就可以被重新計算來驗證所有的代碼是否被正確部署。
這些相同的過程可以被用于建立可靠的基線和用于識別任何非授權的變更,通常這些變更會由于人為錯誤或惡意目的而潛在發生。
從一個安全可信的應用程序基礎開始工作,可以確保系統被可靠和準確地部署,并使之更加容易地識別和定位任何可能的安全缺口。當非授權的變更被實現之后,基線應當能被更新來進行記錄并追蹤變更。這些技術被描述在許多行業標準和框架當中,包括被廣泛遵從的ITIL v3框架,該框架提供了關于如何構建和維護可靠服務的指南。
依賴于標準和框架
標準和框架提供了關于如何實現安全可靠系統的專家指南。這當中許多功能和過程被描述在這些指南中,包括監控和追蹤代碼基線的能力。ITIL v3框架描述了服務資產配置管理(Service Asset &Configuration Management,SACM),可以捕獲基線并存儲在配置管理系統(configuration management system,CMS)。這些基線可以通過配置管理數據庫(configuration management database,CMDB)進行監控,并且將差異報告到CMS中。最終介質庫(Definitive Media Library,DML)包含了基線、正式發布版本可以作為一部分部署用于準備服務器。
這些技術,包括使用入侵預防系統(Intrusion Prevention System,IDS)來監控基線的最佳實踐,被作為業界最佳實踐而得到廣泛注重。DevOps 方式提供了自動化和框架來實現這些過程。但即使采用了最佳預防實踐,入侵仍然可能發生。偵測和響應事故的能力是非常關鍵的。
建立非授權變更的早期偵測
當非授權變更發生時,無論是因為人為錯誤還是惡意攻擊,它們都應被立即偵測到并觸發事故響應。DevOps方式提供了流程來讓非授權變更可以更容易被偵測和主動定位到,以實現對用戶最小的影響。它們還提供了準備服務器和立即部署系統來重建系統恢復到一個可靠的基線上的基本條件。這些技術需要在關鍵利益相關者之間的協作以及優異的溝通,這包括了開發、運維、質量保證、測試和信息安全等團隊。
結論
DevOps在關注于幫助開發人員與運維人員一起更加有效的工作方面非常知名。信息安全及質量保證和測試團隊,也同樣是應當在DevOps框架中被展現的關鍵利益相關者。DevOps幫助改善溝通,并幫助從編寫代碼的開發人員處傳遞核心技術知識給負責確保實現無中斷服務運維和安全專業人員。通過DevOps已有的結構,InfoSec可以決定明智的決策,以幫助保護系統基礎設施和應用程序免于發生任何有可能導致系統產生危險的非預期事件,無論這些事件是由于無意的錯誤或惡意攻擊。保持系統安全幫助避免系統災難,并確保無中斷的服務。DevOps方式以及部署流水線使得您的團隊可以產出既同時滿足您業務需求,又能提供安全可信應用程序基礎的功能特性。