近年來,各大軟件公司都開始依賴DevOps方法,來增強(qiáng)軟件交付的敏捷性和協(xié)作能力。CI/CD管道使得軟件開發(fā)生命周期(SDLC)中的各個流程更加自動化,進(jìn)而實(shí)現(xiàn)了新功能的無縫集成和交付。
雖然CI/CD管道能夠通過自動化和敏捷性,來增強(qiáng)軟件的開發(fā),但是它們往往需要集成大量的工具和服務(wù),而這極有可能會引入新的安全漏洞??梢?,識別和修復(fù)這些安全漏洞是確保CI/CD安全實(shí)踐的關(guān)鍵。本文將和您討論如何安全加固CI/CD管道。
CI/CD安全性簡介
雖然CI/CD管道是通過自動化來提高軟件開發(fā)和交付的效率,但是管道的核心階段在默認(rèn)情況下并不包含安全性。實(shí)際上,CI/CD的安全性是一組旨在識別和修復(fù)漏洞的實(shí)踐,而不會顯著地減慢管道中的各項流程。CI/CD的安全實(shí)踐主要涉及到:注入滲透測試和主動安全審計,并據(jù)此減少因延遲交付,給安全和QA團(tuán)隊造成的瓶頸。因此,安全的CI/CD管道會讓軟件團(tuán)隊能夠自動化多個部署環(huán)境,提高SDLC(軟件開發(fā)生命周期)的安全性,從而增強(qiáng)敏捷性。
CI/CD管道的常見安全威脅
一個組織的CI/CD管道往往具有基于所使用的業(yè)務(wù)案例、工作負(fù)載、以及技術(shù)棧的獨(dú)立特征。因此,CI/CD的安全性在實(shí)現(xiàn)上也會因用例的不同而有所差異。對此,我們應(yīng)當(dāng)首先認(rèn)識那些幾乎在所有管道中都存在的安全風(fēng)險類型:
未經(jīng)授權(quán)訪問的代碼存儲庫
CI/CD的各種操作主要依賴共享存儲庫,來實(shí)現(xiàn)協(xié)作、配置管理、更新和版本控制。所有源代碼和配置文件都被保存在Git存儲庫中,并作為單一的來源。公共存儲庫在CI/CD管道中備受歡迎的原因是,它們降低了開發(fā)的成本和時間。
但是,由于開發(fā)人員將源代碼從其私有主機(jī)發(fā)布到公共的共享文件夾中,因此給存儲庫帶來了安全威脅。攻擊者可以搜索開源注冊表作為一種偵察技術(shù),并利用獲得的數(shù)據(jù),進(jìn)行有針對性的網(wǎng)絡(luò)釣魚、逆向工程、以及遠(yuǎn)程代碼執(zhí)行攻擊。
不安全的代碼
CI/CD管道中快速開發(fā)和交付的要求,導(dǎo)致了越來越多的開源使用、以及與第三方的集成。一些團(tuán)隊可能會在沒有核查源代碼的安全漏洞的情況下,將第三方代碼集成并導(dǎo)入部署環(huán)境。顯然,這是由于開發(fā)人員未能遵循代碼安全的最佳實(shí)踐,而增加了CI/CD管道的攻擊面。常見的代碼漏洞包括格式字符串漏洞、緩沖區(qū)溢出、錯誤處理不當(dāng)、以及規(guī)范化問題等。
密鑰管理不當(dāng)
密鑰管理有助于合理化對CI/CD管道中數(shù)據(jù)和資源的訪問。其中包括:密碼、令牌、API密鑰、以及其他身份驗證憑據(jù),它們可以在管道中被用于驗證訪問敏感系統(tǒng)的用戶。因此,密鑰的曝露會讓攻擊者獲取CI/CD進(jìn)程的部分、甚至全部控制權(quán)。常見的密鑰管理環(huán)節(jié)中的錯誤配置包括:對密鑰進(jìn)行硬編碼、在公共云環(huán)境中存儲密鑰、以及手動進(jìn)行密鑰管理等。
左移安全
在較舊的管道中,由于安全性往往是最后一步,因此導(dǎo)致了部署過程中的瓶頸。如今的最佳實(shí)踐理論是:在SDLC的早期集成安全控制,也被稱為“轉(zhuǎn)移安全”。此類左移會涉及在CI/CD管道的每個層面上實(shí)施安全檢查,從而在每個步驟中,實(shí)現(xiàn)更加準(zhǔn)確的威脅檢測。顯然,其目標(biāo)就是為了消除DevOps和安全團(tuán)隊之間的摩擦,提高軟件開發(fā)的效率,并確保穩(wěn)健的安全實(shí)踐。
采用CI/CD安全工具的關(guān)鍵注意事項
在選擇保護(hù)CI/CD管道的工具時,我們應(yīng)當(dāng)考慮如下因素:
- 掃描覆蓋率
- 擁有成本和許可條款
- 需要維護(hù)和配置的工作量
- 可擴(kuò)展性
- 與現(xiàn)有開發(fā)和安全棧的集成
在CI/CD管道上管理安全性
隨著威脅態(tài)勢的不斷變化,管理安全性已經(jīng)成為了CI/CD管道的最重要環(huán)節(jié)之一。保護(hù)DevOps工作流的第一步便是評估如何將DevSecOps的原則應(yīng)用于CI/CD管道。在評估的過程中,我們需要確定管理安全性的工具和策略。
保護(hù)CI/CD管道的最佳實(shí)踐
為了充分體現(xiàn)將安全性直接集成到軟件生命周期中的好處,開發(fā)團(tuán)隊?wèi)?yīng)該:
避免在配置文件和CI/CD構(gòu)建工具中使用硬編碼的密鑰
SDLC的各個階段都會用到密鑰。而提供這些密鑰的一種簡單方法是,將它們作為環(huán)境變量引用到配置文件和清單中。任何可以訪問這些模板和文件的人員,都將能夠從此類文件中提取憑證信息,這便可能導(dǎo)致數(shù)據(jù)的泄露。因此,軟件團(tuán)隊?wèi)?yīng)當(dāng)使用加密存儲或啟用密鑰集中管理的工具,以使得密鑰數(shù)據(jù)能夠遠(yuǎn)離惡意用戶。為了安全地管理和分發(fā)密鑰,管理員應(yīng)該在將密鑰存儲在ETCD服務(wù)器之前,就執(zhí)行靜態(tài)加密。
首先,如下代碼段所示,將密鑰編碼為Base64格式:
$ username=$(echo -n "admin" | base64)
$ password=$(echo -n "a62fjbd37942dcs" | base64)
在YAML文件中定義密鑰:
echo "apiVersion v1
> kind Secret
> metadata
> name test-secret
> type Opaque
> data
> username $username
> password $password" >> secret.yaml
接著,一旦創(chuàng)建了密鑰,您就可以將它們應(yīng)用到Kubernetes的pod中。這可以通過創(chuàng)建一個.yaml文件來完成。文件secret-env.yaml的環(huán)境變量中存放了源自密鑰的數(shù)據(jù)。該文件的規(guī)范,如下代碼段所示:
apiVersion v1
kind Pod
metadata
name secret-env-pod
spec
containers
name mycontainer
image alpine latest
command"sleep" "9999"
env
name SECRET_USERNAME
valueFrom
secretKeyRef
name test-secret
key username
name SECRET_PASSWORD
valueFrom
secretKeyRef
name test-secret
key password
restartPolicy Never
如上述代碼段所示,在填充環(huán)境變量時,Kubernetes會解碼Base64值。這些環(huán)境變量可被用于所有的Kubernetes API對象,且無需對密鑰數(shù)據(jù)進(jìn)行硬編碼。
對CI/CD的構(gòu)建工具實(shí)施訪問控制
DevOps團(tuán)隊?wèi)?yīng)實(shí)施身份驗證和授權(quán)機(jī)制,以管控那些可以訪問CI/CD管道中特定流程和工具的實(shí)體。團(tuán)隊?wèi)?yīng)貫徹最小權(quán)限原則,以確保僅將資源的訪問權(quán)限,授予絕對需要的角色。同時,CI/CD管道中的數(shù)據(jù)還應(yīng)該使用令牌、訪問密鑰和密碼等方式予以保護(hù),以防止惡意負(fù)載被添加到管道中。
為源代碼管理建立身份驗證機(jī)制
帶版本控制的存儲庫(通常在Git中)是CI/CD管道的必備工具。它們能夠促進(jìn)協(xié)作并實(shí)現(xiàn)新功能的持續(xù)部署。不過,由于Git存儲庫包含著應(yīng)用程序的源代碼、基礎(chǔ)設(shè)施即代碼(Infrastructure-as-Code)清單、以及知識產(chǎn)權(quán),因此源代碼控制中的漏洞將會允許攻擊者訪問到應(yīng)用程序的設(shè)計和實(shí)現(xiàn)邏輯。
鑒于它們往往是黑客逐利的目標(biāo),因此我們應(yīng)該使用多因素身份驗證,來對Git存儲庫的訪問予以安全加固。同時,開發(fā)團(tuán)隊還可以通過Git的最佳實(shí)踐,來防止意外的分支、以及提交.gitignore文件。
確保管道中所有環(huán)境配置的一致性
DevOps團(tuán)隊?wèi)?yīng)確保開發(fā)、測試、生產(chǎn)等所有環(huán)境的配置具有一致性。通過配置奇偶校驗,QA團(tuán)隊可以在測試期間準(zhǔn)確地檢測出安全問題,特別是那些普遍存在于所有環(huán)境配置中的問題。同時,團(tuán)隊也可以使用容器和基礎(chǔ)設(shè)施即代碼的聲明等虛擬化和抽象技術(shù),來實(shí)現(xiàn)一致性的檢測。
配置回滾功能
安全和QA團(tuán)隊通常會在應(yīng)用程序更新或部署后發(fā)現(xiàn)安全問題。這往往需要管理員將相應(yīng)的部署回滾(或稱恢復(fù))到早期的版本。此類部署配置的回滾應(yīng)當(dāng)十分謹(jǐn)慎,以消除安全問題,直至開發(fā)團(tuán)隊對其進(jìn)行妥善的處理。在實(shí)踐中,我們最好通過保留舊版本的工件,直至新的部署被批準(zhǔn)用于生產(chǎn)環(huán)境的回滾。
實(shí)施持續(xù)的漏洞掃描和監(jiān)控
監(jiān)控和測試CI/CD管道中的每個資源也是非常必要的。我們可以使用漏洞掃描工具利用已知漏洞的數(shù)據(jù)庫,去測試應(yīng)用代碼、環(huán)境配置、以及部署腳本,進(jìn)而消除潛在的受攻擊媒介。此類掃描和監(jiān)控工具應(yīng)當(dāng)被部署在整個SDLC中,以便在漏洞發(fā)生時,及時發(fā)現(xiàn)漏洞,進(jìn)而避免漏洞被利用。
持續(xù)清理冗余資源
CI/CD管道通常使用不可變的基礎(chǔ)架構(gòu)來構(gòu)建,這些基礎(chǔ)架構(gòu)在運(yùn)行了特定的進(jìn)程之后就會終止。由于攻擊者可以使用臨時資源的開放端口,來作為跳板進(jìn)入已部署的環(huán)境,因此我們有必要合理地管理這些資源,以減少安全漏洞。在實(shí)踐中,DevOps團(tuán)隊?wèi)?yīng)確保在資源被終止后,及時清理包括容器、服務(wù)和虛擬機(jī)在內(nèi)的所有臨時資源。
CI/CD的安全層
管理CI/CD安全通常需要一種全面的、多層次的方法,以加強(qiáng)管道上每個節(jié)點(diǎn)的防御能力。下圖展示了該安全層的邏輯結(jié)構(gòu):
安全CI/CD管道中的安全層
漏洞掃描
如前所述,漏洞掃描涉及到使用已知的威脅數(shù)據(jù)庫,來識別和修復(fù)整個CI/CD管道中的安全漏洞。自動化的測試可以掃描指定的應(yīng)用程序和部署環(huán)境,以識別和分類代碼、基礎(chǔ)設(shè)施、以及第三方服務(wù)中的弱點(diǎn)。
靜態(tài)安全測試
此類軟件組合分析技術(shù),旨在識別內(nèi)部開發(fā)團(tuán)隊編寫出的代碼中的潛在漏洞。安全團(tuán)隊可以經(jīng)常使用這些工具,來開發(fā)測試用例,進(jìn)而在部署新的應(yīng)用程序構(gòu)建之前,查明不安全的代碼漏洞。
運(yùn)行時安全
該層面主要依賴運(yùn)行時應(yīng)用自我保護(hù)(runtime application self-protection,RASP)工具,來實(shí)時檢測生產(chǎn)環(huán)境中應(yīng)用所面臨的安全威脅。此類工具會掃描配置模板,并持續(xù)測試已部署的環(huán)境狀態(tài),進(jìn)而通過比較,來識別和響應(yīng)任何運(yùn)行時威脅。
審計和監(jiān)控
應(yīng)用和基礎(chǔ)設(shè)施的日志,會持續(xù)跟蹤和存儲應(yīng)用與部署的相關(guān)數(shù)據(jù)。審計主要涉及到通過分析日志,以推斷出可用于改善應(yīng)用安全態(tài)勢的模式。我們可以通過部署診斷工具,來監(jiān)控和分析指標(biāo),以獲悉與目標(biāo)系統(tǒng)相關(guān)的問題。
持續(xù)的審計和監(jiān)控可幫助開發(fā)團(tuán)隊,構(gòu)建出對應(yīng)的應(yīng)用場景,并預(yù)測基線用戶的行為。安全團(tuán)隊可以通過分析那些偏離已有基線的用戶行為,來識別安全威脅。
結(jié)論
眾所周知,任何有權(quán)訪問源代碼存儲庫或容器注冊表的人,都可以在CI/CD管道中運(yùn)行代碼,因此DevOps工作流帶有固有的安全隱患。根據(jù)最近的一項調(diào)查預(yù)計,大約55%的組織出于安全考慮,推遲了??其應(yīng)用程序的推出??。雖然DevOps框架可以增強(qiáng)協(xié)作和自動化,但組織必須采用帶有高級策略和工具的持續(xù)安全模型,來確保CI/CD管道在所有層面上都有統(tǒng)一的安全態(tài)勢。
譯者介紹
陳峻 (Julian Chen),51CTO社區(qū)編輯,具有十多年的IT項目實(shí)施經(jīng)驗,善于對內(nèi)外部資源與風(fēng)險實(shí)施管控,專注傳播網(wǎng)絡(luò)與信息安全知識與經(jīng)驗;持續(xù)以博文、專題和譯文等形式,分享前沿技術(shù)與新知;經(jīng)常以線上、線下等方式,開展信息安全類培訓(xùn)與授課。
原文標(biāo)題:??Securing Your CI/CD Pipeline??,作者:Sudip Sengupta