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