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