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