基于DevOps的容器安全優(yōu)秀實(shí)踐
雖然云和容器的崛起,容器成了日常。容器的安全要求也隨之而來,如何確定一個(gè)最適合業(yè)務(wù)的容器安全保障是大家最關(guān)注的問題。本文我們就來通過DevOps生命周期來全面考慮容器安全和各階段的安全策略,更詳細(xì)的工具介紹可以參考蟲蟲之前的文章從DevOps到DevSecOps,貫穿始終的安全棧。
DevOps生命周期
每個(gè)安全計(jì)劃都會(huì)受到可實(shí)施安全控制措施的限制,DevOps生命周期是以下各項(xiàng)的無限迭代:計(jì)劃、編碼、構(gòu)建、測(cè)試、發(fā)布、部署、運(yùn)維、監(jiān)控
在應(yīng)用程序中容器以Dockerfiles的形式來表達(dá),但實(shí)際上Dockerfiles并不是容器的一部分(計(jì)劃和編碼)。從安全性的角度來看,容器安全主要涉及以下三部分,六個(gè)階段:
- 構(gòu)建時(shí):構(gòu)建,測(cè)試和發(fā)布
- 容器基礎(chǔ)架構(gòu):部署和運(yùn)維
- 運(yùn)行時(shí):監(jiān)控
每個(gè)安全策略只有在可以實(shí)施的情況下才有效。每個(gè)部分中的各個(gè)步驟可以實(shí)施安全控制措施:
- 構(gòu)建時(shí):CI/CD基礎(chǔ)結(jié)構(gòu),容器注冊(cè)表
- 容器基礎(chǔ)設(shè)施:容器編排器
- 運(yùn)行時(shí):生產(chǎn)環(huán)境
構(gòu)建時(shí)安全
在容器構(gòu)建時(shí),輸入了一堆源文件和一個(gè)Dockerfile,輸出為Docker鏡像。該階段有很多安全和云廠商提供了很多安全方案和鏡像安全掃描工具。容器安全掃描非常重要,是的,光鏡像掃描還遠(yuǎn)遠(yuǎn)不夠。本部分的安全目標(biāo)是最小化供應(yīng)鏈攻擊的風(fēng)險(xiǎn)。
1. 基礎(chǔ)鏡像的安全
首先,檢查鏡像的基礎(chǔ),重點(diǎn)是檢查要引入的依賴項(xiàng):
- 允許開發(fā)人員使用的基本鏡像。
- 固定軟件依賴性,依賴所要拉取的源。
- 是否需要通過標(biāo)簽來簡(jiǎn)化治理和合規(guī)性?
- 整理Dockerfile。
所有這些檢查都是靜態(tài)的,可以很容易在構(gòu)建管道編寫檢查語實(shí)現(xiàn)。
2. 容器鏡像掃描
然后,下一步就是掃描容器鏡像。
不要在構(gòu)建管道中掃描鏡像,而是在容器注冊(cè)表中設(shè)置連續(xù)掃描。
漏洞可能早就存在,如果在構(gòu)建時(shí)才檢查有點(diǎn)遲了。其次,構(gòu)建是疊加的:每個(gè)構(gòu)建都會(huì)生成一個(gè)新鏡像。因此,通過掃描信任注冊(cè)表,發(fā)布的每個(gè)標(biāo)簽都可以信任,而無需重復(fù)在每次構(gòu)建時(shí)候都檢查。最后由于鏡像掃描需要時(shí)間,如果在構(gòu)建時(shí)候掃描會(huì)影響構(gòu)建的性能。
也可以考慮定義補(bǔ)丁程序管理和保質(zhì)期流程:
- 補(bǔ)丁程序管理:掃描結(jié)果提供補(bǔ)丁程序,從而產(chǎn)生新版本的鏡像
- 保質(zhì)期:對(duì)于超過期限未修補(bǔ)/舊/不安全的鏡像從注冊(cè)表中予以刪除。
- 本階段可參考的工具:開源工具有Anchore,Clair,Dagda,商業(yè)化軟件有Atomic和Docker Cloud。
Docker基礎(chǔ)設(shè)施安全
容器基礎(chǔ)結(jié)構(gòu)由所有移動(dòng)部件組成,這些部件負(fù)責(zé)從注冊(cè)表中提取鏡像并將其作為容器在生產(chǎn)環(huán)境中運(yùn)行。
主要是容器編排器有 kubernetes,Swarm。
本部分的目標(biāo)有兩個(gè):避免由于平臺(tái)配置錯(cuò)誤帶來安全隱患;最小化來自受感染容器的攻擊擴(kuò)展。
1. 配置錯(cuò)誤
容器編排器非常復(fù)雜,特別是K8S。截至目前,它們還沒有實(shí)現(xiàn)DevOps的承諾。每個(gè)復(fù)雜的平臺(tái)都容易配置錯(cuò)誤,這是我們要關(guān)注的部分。
必須對(duì)基礎(chǔ)架構(gòu)進(jìn)行威脅建模,以確保其不會(huì)被濫用。這個(gè)特定的線程模型應(yīng)該專注于每個(gè)角色,但容器除外。取決于運(yùn)行情況。對(duì)于K8S而言,這進(jìn)行威脅建模的一個(gè)很好的起點(diǎn)。
也可以使用托管平臺(tái),可以與(受信任的)供應(yīng)商一起使用共享責(zé)任模型,則可以降低復(fù)雜性。
2. 橫向擴(kuò)展
接下來,我們要將討論容器被破壞時(shí)會(huì)發(fā)生什么。我們希望最大程度地減少攻擊者橫向擴(kuò)展的能力,重點(diǎn)是兩個(gè)方面:網(wǎng)絡(luò)和身份和訪問管理。
容器網(wǎng)絡(luò)圖省事而放通設(shè)置。可以先將所有內(nèi)容嚴(yán)格劃分為子網(wǎng),然后逐步發(fā)展為完整的服務(wù)網(wǎng)絡(luò)。
在IAM層上,朝著每個(gè)容器具有單一標(biāo)識(shí)的方向進(jìn)行操作,以微調(diào)授權(quán)授權(quán)。這在多租戶平臺(tái)中尤其重要:沒有精細(xì)的身份,就不可能獲得最低特權(quán)。
容器基礎(chǔ)不變的,可以通過周期性關(guān)閉舊容器,新起容器的方法,避免長(zhǎng)期運(yùn)行的容器來減少攻擊者橫向擴(kuò)展并獲得持久性注入點(diǎn)。
本部分可以使用的開源工具有Habitat.sh,firejail等。
3. 運(yùn)行時(shí)安全
最后一方面是正在運(yùn)行的工作負(fù)載的安全性。本階段目標(biāo)是盡量減少?gòu)氖軗p的容器的攻擊。
4. 檢測(cè)和事件響應(yīng)
控制攻擊影響的最佳方法是最大程度地減少?gòu)穆┒窗l(fā)生到安全團(tuán)隊(duì)收到警報(bào)的時(shí)間。
檢測(cè)到持續(xù)的違規(guī)行為是有大量供應(yīng)商大量解決方案的領(lǐng)域。有許多方法,其中大多數(shù)將需要邊緣節(jié)點(diǎn)和守護(hù)程序集來主動(dòng)監(jiān)視pod的流量和系統(tǒng)調(diào)用。
建議是快速開始并反復(fù)進(jìn)行迭代完善:使用現(xiàn)有的SIEM,提取平臺(tái),應(yīng)用程序和審核日志。
肯定會(huì)有事件發(fā)生,然后對(duì)其進(jìn)行響應(yīng)處理,積累經(jīng)驗(yàn):
時(shí)常考慮這樣的問題:"下次如何更快地檢測(cè)到這種況?"這能使我們識(shí)別盲點(diǎn),然后將其用于了解缺失的環(huán)節(jié)以及建立更完善的策略。
本部分可以使用的開源工具有Sysdig falco, OpenSCAP,Grafeas等。
結(jié)論
容器安全性是一個(gè)廣泛的問題,而不僅僅是掃描鏡像。通過建立并用于推理容器風(fēng)險(xiǎn)和解決方案的模型才能全面完整的考慮到所有方面,當(dāng)然和所有模型一樣,需要不斷實(shí)踐迭代完善,才能建立完善的容器安全模型。