CRD實現自動化容器安全方法

安全劍客發表於2020-06-27
長久以來,安全一直是困擾著許多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實現自動化容器安全方法CRD實現自動化容器安全方法

    CRD實現自動化容器安全方法CRD實現自動化容器安全方法

    我們透過執行如下 來建立CRD:

    CRD實現自動化容器安全方法CRD實現自動化容器安全方法

  • 有了NeuVector CRD之後,所有由NvSecurityRule型別呼叫的自定義資源,現在都可以交由CRD來處理。因此,您可以繼續建立各種自定義的資源,來定義更多的安全策略。不過在此之前,請參考NeuVector的相關文件,以新增所有必需的clusterroles和clusterrolebindings。
  • 另外,CRD可以在Kubernetes內部部署原生的、啟用了RBAC的NeuVector安全規則。那些由CRD為特定的名稱空間所宣告的安全策略,只能由具備部署到工作區許可權的服務帳戶來執行。同樣地,服務帳戶必須具有適當的群集管理員許可權,才能夠跨名稱空間部署那些群集範圍的CRD定義。

    以下是demo-security-v1.yaml檔案的程式碼片段。它使用HTTP協議,來限制demo名稱空間中的nginx-pod容器,去連線同一名稱空間中的node-pod容器。

    CRD實現自動化容器安全方法CRD實現自動化容器安全方法

    除了上述程式碼段,yaml檔案還應該繼續指定demo名稱空間中各個容器所允許的所有網路連線,使用Redis協議的網路連線,以及每個容器允許的程式與檔案活動。在部署應用程式之前,您可以透過將它們部署到NeuVector中,以提前準備好安全規則。此舉可讓應用程式在開始執行之時,就已經啟用了相應的安全屬性。

    請參照如下 部署您的安全策略:

    CRD實現自動化容器安全方法CRD實現自動化容器安全方法

  • NeuVector會在新建立的自定義資源中解析安全策略,並繼續對NeuVector Controller進行REST API的呼叫。該Controller會按需在NeuVector中透過建立規則和配置,以實施各項策略。
  • 另外,CRD可以在Kubernetes內部部署原生的、啟用了RBAC的NeuVector安全規則。那些由CRD為特定的名稱空間所宣告的安全策略,只能由具備部署到工作區許可權的服務帳戶來執行。同樣地,服務帳戶必須具有適當的群集管理員許可權,才能夠跨名稱空間部署那些群集範圍的CRD定義。

    以下是demo-security-v1.yaml檔案的程式碼片段。它使用HTTP協議,來限制demo名稱空間中的nginx-pod容器,去連線同一名稱空間中的node-pod容器。

    CRD實現自動化容器安全方法CRD實現自動化容器安全方法

    除了上述程式碼段,yaml檔案還應該繼續指定demo名稱空間中各個容器所允許的所有網路連線,使用Redis協議的網路連線,以及每個容器允許的程式與檔案活動。在部署應用程式之前,您可以透過將它們部署到NeuVector中,以提前準備好安全規則。此舉可讓應用程式在開始執行之時,就已經啟用了相應的安全屬性。

    請參照如下命令部署您的安全策略:

    CRD實現自動化容器安全方法CRD實現自動化容器安全方法

  • NeuVector會在新建立的自定義資源中解析安全策略,並繼續對NeuVector Controller進行REST API的呼叫。該Controller會按需在NeuVector中透過建立規則和配置,以實施各項策略。
  • 安全策略即程式碼的用例

    我個人認為:CRD和安全策略即程式碼的定義能力,應該能夠為DevOps、DevSecOps、以及開發團隊帶來更好的安全性。我們可以從如下四個方面著手進行實踐:

    將開發和測試清單儘早匯入應用的生命週期中

    透過為應用程式建立部署與安全清單,開發人員能夠在開發的初期儘早的利用CRD來保障安全性。在完成映象的構建、自動化漏洞掃描、以及DevOps的審查之後,DevOps人員可以透過測試這兩份清單,來為開發人員提供有效的安全性反饋。

    CRD實現自動化容器安全方法CRD實現自動化容器安全方法

    因此,從最初到被部署到生產環境中,有效的安全策略始終伴隨著新的應用程式。

    使用行為學習來建立安全策略。

    DevOps團隊可以在測試環境中使用NeuVector的行為學習功能,來定義安全策略,並建立針對NeuVector CRD的YAML格式檔案。透過如下的工作流(從圖的右下角開始),DevOps和QA團隊就能夠將應用程式順利地部署到測試與QA環境之中。也就是說,應用程式在此將完成全部與行為相關的配置檔案,其中包括:產生適當的網路、流程、以及檔案訪問的安全性規則等。

    CRD實現自動化容器安全方法CRD實現自動化容器安全方法

    在部署到生產環境之前,開發人員可以將新建立的規則匯出為YAML格式,以便進行檢查、編輯、以及開展DevOps的相關測試。

    定義全域性的安全策略

    值得注意的是:透過啟用全域性安全策略的定義方式,NeuVector CRD既可以為那些未連線到任何特定應用的負載,又可以不針對叢集中的某個特定負載予以分組。例如:安全、合規或運營團隊可能需要定義網路出、入口的全域性安全規則,以阻止某些程式橫跨各個容器,或是允許某些程式對於整個叢集中的監控與診斷。

    CRD實現自動化容器安全方法CRD實現自動化容器安全方法

    因此,透過結合使用全域性策略,和那些特定於某個應用的策略,整個團隊就可以制定出本組織真正所需的精確規則。如下圖所示,我們用如下規則來拒絕來自容器的SSH連線。

    將策略從研發階段遷移到生產環境。

    透過使用NeuVector CRD,您可以將全部或是某些選定的安全策略,從研發階段自動化遷移到生產環境中。在NeuVector控制檯中,您可以透過配置“New Services Mode”,來發現、監視或保護各種設定。透過選擇“Monitor”或“Protect”,您可以確保所有新部署的、或更新的服務,在啟用之前,都必須包含必需的安全規則。

    綜上所述,透過利用Kubernetes CRD、以及安全策略即程式碼,開發團隊和DevOps團隊能夠確保從開發伊始到生產部署,都能夠得到安全自動化的“加持”,進而為應用程式提供更好的保護。

原文地址:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2700711/,如需轉載,請註明出處,否則將追究法律責任。

相關文章