雲原生安全檢測器 Narrows(CNSI)的部署和使用

語言: CN / TW / HK

近日, 雲原生安全檢測器 Narrows(Cloud Native Security Inspector,簡稱CNSI)釋出了0.2.0版本。(https://github.com/vmware-tanzu/cloud-native-security-inspector)

此專案旨在對K8s叢集中的工作負載進行動態(執行時)的安全檢測,並報告安全問題,從而彌補了現有靜態安全掃描技術的不足之處。

Harbor等雲原生映象倉庫提供了靜態掃描能力,例如映象CVE掃描,覆蓋的範圍主要是映象的應用層。當映象被部署到K8s集群后,在不同的配置條件下可能會出現新的漏洞。Narrows可以探測到這部分漏洞並報告給使用者,而且可以採取相應的措施(如網路隔離等)減少漏洞的影響。

本文的目的在於使用一個簡單的Demo來指導使用者在自己的K8s叢集中快速部署Narrows(CNSI)。我們將使用Minikube來部署一個簡單的K8s叢集,部署一個Prometheus工作荷載,並使用CNSI來檢查這個Prometheus負載的風險。


前置條件

 

1.需要準備一臺Linux機器,本文中我們使用了一臺“CentOS Linux release 7.9.2009 (Core)”型號的機器。

2.我們的機器擁有32核CPU和64GB記憶體,此配置不代表實現demo的最小配置。

3.在機器上需要安裝好Docker, 參考https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-centos-7

4.需要已經有一個版本為2.5.0以上的Harbor(https://goharbor.io/)例項。並且已經配置好Harbor的安全掃描功能(https://goharbor.io/docs/main/administration/vulnerability-scanning/)。CNSI會利用Harbor的安全掃描功能。

使用Minikube準備K8s叢集

 

部署一個簡單的K8s叢集有多種方式,例如使用Kind或者使用kubeadm。在本文中我們使用Minikube來部署一個單節點的K8s叢集。

執行下面三行命令,即可在Linux機器上部署K8s v1.23.0。

驗證K8s叢集部署成功:

在K8s叢集上部署CNSI

 

安裝依賴程式

執行以下四行命令來安裝git, wget, gcc和helm:

在K8s叢集上部署CNSI

執行以下三行命令來部署CNSI:

“./deploy.sh install” 命令會使用helm在K8s叢集上幫你自動部署一個Open Search服務(https://opensearch.org/)。CNSI支援使用Open Search或Elastic Search(https://www.elastic.co/)來儲存安全檢查報告。

在生產環境中使用者需要自己準備Open Search或Elastic Search服務。“deploy.sh”指令碼幫助安裝的Open Search僅限於POC使用。

驗證CNSI部署成功:

驗證Open Search部署成功:

現在我們可以通過節點IP:30150的來訪問CNSI的Portal服務了。因為我們將Portal服務部署成了NodePort的形式。Portal是CNSI的前端介面。

搭建Prometheus工作負載

 

在試用CNSI之前,首先我們要有一個待掃描的工作負載。

這裡我們使用VMware Application Catalog認證的Prometheus,執行兩行命令即可安裝到prometheus名稱空間下:

驗證安裝成功:

使用CNSI檢查工作負載執行時的漏洞

 

CNSI的0.2版本支援三種掃描器來檢查使用者負載:

1.映象掃描器: 用來掃描工作負載映象中的CVE,基於Harbor的漏洞掃描功能(https://goharbor.io/docs/main/administration/vulnerability-scanning/)

2.Kubebench掃描器:用來掃描整個K8s叢集中的配置問題,基於開源專案kube-bench實現的。(https://github.com/aquasecurity/kube-bench)

3.風險掃描器:基於映象掃描器的報告,以及工作負載的配置來進一步分析是否有潛在的安全隱患。功能程式碼由雅客雲團隊貢獻(https://arksec.cn)

為了讓CNSI能夠和Harbor例項建立網路連線,我們需要建立一個設定(Setting)來進行一寫配置。

建立設定

在本機的瀏覽器上輸入【K8s節點IP:30150】,將會看到CNSI的前端頁面:

點選新建Secret,來儲存Harbor的使用者名稱和密碼。我們的例子中使用者名稱和密碼是Harbor預設的admin,Harbor12345。

然後點選“設定”,按照截圖來配置必添項。其中的執行週期是指Harbor的靜態映象掃描器工作的週期。

點選”Next“,接下來是配置已知映象倉庫。這一部分是可選的,如果配置了,我們就可以不需要把待掃描的工作負載的映象上傳到Harbor上。假設映象來自於dockerhub,那如果在這裡配置dockerhub為已知映象倉庫的話,CNSI在掃描工作負載的時候,Harbor會從dockerhub自動複製一份映象到自己這裡。

我們選擇配置一個已知映象倉庫,和Harbor類似的是,在這之前需要建立一個dockerhub的Secret。

點選”Next“,跳過Cache的步驟,點選“建立”完成配置的建立。

驗證配置狀態為“Healthy”:

建立策略

配置定義了CNSI和一些外部元件的通訊資訊,而策略會定義CNSI內部的掃描器的工作方式。

在策略中需要定義掃描器掃描的週期,和配置進行繫結(未來會支援多配置)。以及配置匯出資料的端點,這裡我們使用的是前面部署好的OpenSearch。

單擊“Next”,接下來是配置“基線”,這個配置表示高於何種基準的漏洞需要被CNSI報告出來。這裡我們為了展示更多的漏洞,選擇“Medium”。

為了掃描到我們部署的Prometheus工作負載,我們還需要填寫prometheus這個名稱空間的標籤,如下圖所示:

對於檢查結果配置,目前不需要進行改動。“評估配置”是指是否在K8s叢集中留下一些映象掃描報告以及報告存活的時間,這部分未來會被取消並直接將報告發送到例如OpenSearch這樣的終端。“動作”是指發現高於“基線”的漏洞之後CNSI做出的反應,目前只支援隔離負載。

隔離負載是指CNSI會在K8s上面自動建立一個network policy資源,這個資源會對訪問Prometheus這個名稱空間的請求採取“deny-all”的處理,等問題解決之後,例如升級到一個沒有風險的映象,這個隔離措施會被撤回。

點選“建立”,來建立這樣一個policy,因為我們時間間隔選的是3分鐘一次,很快就會看到報告。

檢視檢查報告

映象掃描報告

可以檢視映象有漏洞的容器數量的變化趨勢。

點開其中一個歷史報告,可以檢視更具體的資訊,例如每一個工作負載是否存在映象掃描漏洞:

點開一個工作負載,可以檢視更加詳細的映象掃描結果。

 

當映象掃描報告的結果是某個工作負載存在CVE問題時,相應的pod會被隔離,其原理是cnsi會自動建立一個networkpolicy資源。

 

這個networkpolicy會阻止任何通過標籤“goharbor.io/controller=CNSI,goharbor.io/inspection=risk”找到的pod的網路流量, 即,以下這些pod:

kubebench報告

 

Kubebench報告的原理是,把叢集節點上的K8s相關的一些配置檔案掛載到一個cronjob pod中,在此pod中完成對這些檔案的檢查,並上傳結果到OpenSearch/ElasticSearch。

UI從OpenSearch/ElasticSearch上拉取資料並進行展示。

上面的五張餅圖代表五類K8s配置問題。這些問題需要對多節點進行檢查,例如"Worker node security config"需要檢查叢集中的所有worker node。所有的檢查報告會出現在下方列表中。而餅圖取的始終是一類K8s問題的最新的一次檢查(可能是隨機的一個node)。

如果關心某個節點的檢查結果,可以根據“節點名稱”這一列的提示,選擇感興趣的一個節點,點進去檢視細節:

我們去了“Control Plane Security Configuration”這一類問題作為例子。可以看到這一類問題又分為四個子類別,下方列表中可以看到四種問題的存在數量。

點開一個子類別,可以進一步檢視細節:

Kubebench掃描器是基於CIS Kubernetes Benchmark(https://www.cisecurity.org/benchmark/kubernetes/)實現的掃描器。

風險掃描報告

 

風險掃描報告首先提取映象掃描報告的內容,然後從叢集中獲取每個映象部署的方式,並計算出現有映象CVE是否有可能存在更大的潛在隱患。

首先可以看到總風險數量的時間變化趨勢:

點開一個報告,可以看到風險數量在不同的pod中的分佈情況:

進一步點開一個pod的詳細情況:

可以看到各種風險點。這裡麵包含映象掃描器掃描出來的比較嚴重的問題(>= Medium),嚴重程度分數會是從1-3,1代表Meduim,2代表High,3代表Critical。

此外,CNSI還會看pod所屬的工作負載是否有相應的K8s服務在叢集中,如果有的話,那這種配置可能會提高某些CVE的風險度。這類潛在風向的嚴重程度分數將會是2-5,2代表Low,3代表Medium,4代表High,5代表Critical。

檢視叢集的安全狀態

 

在0.2.0版本中,這一部分UI完全是關於映象掃描報告。

叢集檢視可以幫我們檢視叢集中有多少不合規的工作負載,以及他們在不同名稱空間的分佈情況。

名稱空間檢視可以幫我們檢視沒個名稱空間有哪些不合規的工作負載,以及他們在不同型別工作負載中的分佈情況。

工作負載檢視就是把所有不合規的工作負載列出來:

使用者可以點任意一個工作負載檢視詳情。

總結

 

以上就是CNSI專案0.2.0的安裝演示和功能簡介。歡迎下載並使用體驗,如果有任何寶貴的意見,請通過GitHub issue:https://github.com/vmware-tanzu/cloud-native-security-inspector/issues 提出。

同時也歡迎對這個開源專案進行貢獻。

「其他文章」