如何用CRD實(shí)現(xiàn)自動(dòng)化容器安全
譯文【51CTO.com快譯】長久以來,安全一直是困擾著許多DevOps團(tuán)隊(duì)(包括我自己供職的加拿大保險(xiǎn)和金融服務(wù)合作社)的癥結(jié)所在。盡管在各種工具的幫助下,我們的CI/CD管道的絕大部分都已經(jīng)實(shí)現(xiàn)了自動(dòng)化,而且基于容器的自動(dòng)化應(yīng)用部署也是我們的常態(tài),但是在安全方面的自動(dòng)化程度仍然比較落后。與大多數(shù)DevOps團(tuán)隊(duì)一樣,我們實(shí)施了自動(dòng)化的漏洞掃描,但是在手動(dòng)構(gòu)建安全策略,以保護(hù)生產(chǎn)環(huán)境中的應(yīng)用程序、及其工作負(fù)載方面仍存在著一定的問題。
可喜的是,如今Kubernetes的自定義資源類型(custom resource definitions,CRDs),卻能夠使我們的團(tuán)隊(duì)通過自己的管道,盡早地將應(yīng)用程序的安全策略聲明融入代碼,并將此類安全策略自動(dòng)化地部署到生產(chǎn)環(huán)境中。
目前,我們通過CRD引入了各種全局安全策略。這些策略預(yù)定義了應(yīng)用程序的允許行為,并在多個(gè)Kubernetes集群之間實(shí)施了不同的防護(hù)措施。通過使用CRD來自動(dòng)化且集中化地管理安全策略即代碼(security policy as code),我們既可以加強(qiáng)與簡化策略的執(zhí)行,又能夠以高效、容錯(cuò)且安全的方式部署和更新各種應(yīng)用程序。
下面,我們將分享本企業(yè)是如何實(shí)現(xiàn)應(yīng)用安全策略的自動(dòng)化:
CRD的優(yōu)勢(shì)
為了利用容器工具所提供的各項(xiàng)優(yōu)勢(shì),我們的團(tuán)隊(duì)使用了NeuVector CRD,并在NeuVector容器安全平臺(tái)內(nèi)定義了各種安全策略。
- 首先通過CRD,我們讓這些策略能夠捕獲應(yīng)用程序最初的正常與合法行為,并以此建立一個(gè)完整的配置檔案(profile)。
- 接著,CRD將這些行為列入白名單,其中包括:與應(yīng)用程序的標(biāo)準(zhǔn)操作相一致的所有網(wǎng)絡(luò)規(guī)則、流程、協(xié)議、以及文件活動(dòng)。
- 最后,在應(yīng)用程序的容器環(huán)境內(nèi),CRD通過只允許那些獲批的網(wǎng)絡(luò)連接(使用ISO第7層的應(yīng)用協(xié)議,進(jìn)行識(shí)別與檢查)來提供安全性,并拒絕任何異常的外部連接。
據(jù)此,我們的策略便能夠防止攻擊者試圖利用內(nèi)部或外部的通信連接,進(jìn)入應(yīng)用程序所在的生產(chǎn)環(huán)境。
CRD既允許我們基于全局或每一個(gè)服務(wù),來定義不同的規(guī)則;又通過支持RBAC,使我們能夠利用本地的Kubernetes服務(wù)帳戶與角色,來實(shí)施各項(xiàng)安全策略。同時(shí),它的版本控制功能也有助于我們跟蹤每一個(gè)應(yīng)用程序修訂版的策略。另外,諸如Open Policy Agent之類的安全策略管理工具,也能夠按需支持各類集成。
創(chuàng)建NeuVector CRD
NeuVector CRD允許您使用Kubernetes的本地YAML文件來創(chuàng)建各項(xiàng)安全規(guī)則。
首先,您需要?jiǎng)?chuàng)建一個(gè)NeuVector CRD。如下圖所示,我們使用YAML代碼創(chuàng)建了一個(gè)CRD。同時(shí),我們?yōu)镹vSecurityRule定義了一個(gè)namespaced域,并將NvClusterSecurityRule的域范圍定義為能夠跨集群進(jìn)行操作。
我們通過運(yùn)行如下命令來創(chuàng)建CRD:
- 有了NeuVector CRD之后,所有由NvSecurityRule類型調(diào)用的自定義資源,現(xiàn)在都可以交由CRD來處理。因此,您可以繼續(xù)創(chuàng)建各種自定義的資源,來定義更多的安全策略。不過在此之前,請(qǐng)參考NeuVector的相關(guān)文檔,以添加所有必需的clusterroles和clusterrolebindings。
另外,CRD可以在Kubernetes內(nèi)部部署原生的、啟用了RBAC的NeuVector安全規(guī)則。那些由CRD為特定的名稱空間所聲明的安全策略,只能由具備部署到工作區(qū)權(quán)限的服務(wù)帳戶來執(zhí)行。同樣地,服務(wù)帳戶必須具有適當(dāng)?shù)娜杭芾韱T權(quán)限,才能夠跨名稱空間部署那些群集范圍的CRD定義。
以下是demo-security-v1.yaml文件的代碼片段。它使用HTTP協(xié)議,來限制demo名稱空間中的nginx-pod容器,去連接同一名稱空間中的node-pod容器。
除了上述代碼段,yaml文件還應(yīng)該繼續(xù)指定demo名稱空間中各個(gè)容器所允許的所有網(wǎng)絡(luò)連接,使用Redis協(xié)議的網(wǎng)絡(luò)連接,以及每個(gè)容器允許的進(jìn)程與文件活動(dòng)。在部署應(yīng)用程序之前,您可以通過將它們部署到NeuVector中,以提前準(zhǔn)備好安全規(guī)則。此舉可讓應(yīng)用程序在開始運(yùn)行之時(shí),就已經(jīng)激活了相應(yīng)的安全屬性。
請(qǐng)參照如下命令部署您的安全策略:
- NeuVector會(huì)在新創(chuàng)建的自定義資源中解析安全策略,并繼續(xù)對(duì)NeuVector Controller進(jìn)行REST API的調(diào)用。該Controller會(huì)按需在NeuVector中通過創(chuàng)建規(guī)則和配置,以實(shí)施各項(xiàng)策略。
安全策略即代碼的用例
我個(gè)人認(rèn)為:CRD和安全策略即代碼的定義能力,應(yīng)該能夠?yàn)镈evOps、DevSecOps、以及開發(fā)團(tuán)隊(duì)帶來更好的安全性。我們可以從如下四個(gè)方面著手進(jìn)行實(shí)踐:
將開發(fā)和測(cè)試清單盡早導(dǎo)入應(yīng)用的生命周期中
通過為應(yīng)用程序創(chuàng)建部署與安全清單,開發(fā)人員能夠在開發(fā)的初期盡早的利用CRD來保障安全性。在完成鏡像的構(gòu)建、自動(dòng)化漏洞掃描、以及DevOps的審查之后,DevOps人員可以通過測(cè)試這兩份清單,來為開發(fā)人員提供有效的安全性反饋。
因此,從最初到被部署到生產(chǎn)環(huán)境中,有效的安全策略始終伴隨著新的應(yīng)用程序。
使用行為學(xué)習(xí)來創(chuàng)建安全策略。
DevOps團(tuán)隊(duì)可以在測(cè)試環(huán)境中使用NeuVector的行為學(xué)習(xí)功能,來定義安全策略,并創(chuàng)建針對(duì)NeuVector CRD的YAML格式文件。通過如下的工作流(從圖的右下角開始),DevOps和QA團(tuán)隊(duì)就能夠?qū)?yīng)用程序順利地部署到測(cè)試與QA環(huán)境之中。也就是說,應(yīng)用程序在此將完成全部與行為相關(guān)的配置文件,其中包括:產(chǎn)生適當(dāng)?shù)木W(wǎng)絡(luò)、流程、以及文件訪問的安全性規(guī)則等。
在部署到生產(chǎn)環(huán)境之前,開發(fā)人員可以將新創(chuàng)建的規(guī)則導(dǎo)出為YAML格式,以便進(jìn)行檢查、編輯、以及開展DevOps的相關(guān)測(cè)試。
定義全局的安全策略
值得注意的是:通過啟用全局安全策略的定義方式,NeuVector CRD既可以為那些未連接到任何特定應(yīng)用的負(fù)載,又可以不針對(duì)集群中的某個(gè)特定負(fù)載予以分組。例如:安全、合規(guī)或運(yùn)營團(tuán)隊(duì)可能需要定義網(wǎng)絡(luò)出、入口的全局安全規(guī)則,以阻止某些進(jìn)程橫跨各個(gè)容器,或是允許某些進(jìn)程對(duì)于整個(gè)集群中的監(jiān)控與診斷。
因此,通過結(jié)合使用全局策略,和那些特定于某個(gè)應(yīng)用的策略,整個(gè)團(tuán)隊(duì)就可以制定出本組織真正所需的精確規(guī)則。如下圖所示,我們用如下規(guī)則來拒絕來自容器的SSH連接。
將策略從研發(fā)階段遷移到生產(chǎn)環(huán)境。
通過使用NeuVector CRD,您可以將全部或是某些選定的安全策略,從研發(fā)階段自動(dòng)化遷移到生產(chǎn)環(huán)境中。在NeuVector控制臺(tái)中,您可以通過配置“New Services Mode”,來發(fā)現(xiàn)、監(jiān)視或保護(hù)各種設(shè)置。通過選擇“Monitor”或“Protect”,您可以確保所有新部署的、或更新的服務(wù),在激活之前,都必須包含必需的安全規(guī)則。
綜上所述,通過利用Kubernetes CRD、以及安全策略即代碼,開發(fā)團(tuán)隊(duì)和DevOps團(tuán)隊(duì)能夠確保從開發(fā)伊始到生產(chǎn)部署,都能夠得到安全自動(dòng)化的“加持”,進(jìn)而為應(yīng)用程序提供更好的保護(hù)。
原文標(biāo)題:How to Automate Container Security by Using CRDs to Get Security Policy as Code,作者:Niteen Kole
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】