作者簡介
萬紹遠,CNCF 基金會官方認證 Kubernetes CKA&CKS 工程師,雲原生解決方案架構師。對 ceph、Openstack、Kubernetes、prometheus 技術和其他雲原生相關技術有較深入的研究。參與設計並實施過多個金融、保險、製造業等多個行業 IaaS 和 PaaS 平臺設計和應用雲原生改造指導。
前 言
NeuVector 是業界首個端到端的開源容器安全平臺,唯一為容器化工作負載提供企業級零信任安全的解決方案。本文將從以下 5 個方面詳細介紹如何部署 NeuVector:
- NeuVector 概覽
- NeuVector 安裝
- 高可用架構設計
- 多雲安全管理
- 其他配置
1.NeuVector 概覽
NeuVector 致力於保障企業級容器平臺安全,可以提供實時深入的容器網路視覺化、東西向容器網路監控、主動隔離和保護、容器主機安全以及容器內部安全,容器管理平臺無縫整合並且實現應用級容器安全的自動化,適用於各種雲環境、跨雲或者本地部署等容器生產環境。
2021年, NeuVector 被 SUSE 收購,並在 2022 年 1 月完成開源,成為業界首個端到端的開源容器安全平臺,唯一為容器化工作負載提供企業級零信任安全的解決方案。
專案地址:https://github.com/neuvector/...
本文主要基於 NeuVector 首個開源版 NeuVector:5.0.0-preview.1 進行介紹。
1.1. 架構解析
NeuVector 本身包含 Controller、Enforcer、Manager、Scanner 和 Updater 模組。
- Controller :整個 NeuVector 的控制模組,API 入口,包括配置下發,高可用主要考慮 Controller 的 HA ,通常建議部署 3 個 Controller 模組組成叢集。
- Enforcer :主要用於安全策略部署下發和執行,DaemonSet 型別會在每個節點部署。
- Manager:提供 web-UI(僅HTTPS) 和 CLI 控制檯,供使用者管理 NeuVector 。
- Scanner :對節點、容器、Kubernetes 、映象進行 CVE 漏洞掃描
- Updater :cronjob ,用於定期更新 CVE 漏洞庫
1.2.主要功能概覽
- 安全漏洞掃描
- 容器網路流量視覺化
- 網路安全策略定義
- L7 防火牆
- CICD 安全掃描
- 合規分析
本文重點介紹安裝部署,具體功能將在後續文章中深入介紹。
2.NeuVector 安裝
安裝環境
軟體版本:
OS:Ubuntu18.04
Kubernetes:1.20.14
Rancher:2.5.12
Docker:19.03.15
NeuVector:5.0.0-preview.1
2.1. 快速部署
建立 namespace
kubectl create namespace neuvector
部署 CRD( Kubernetes 1.19+ 版本)
kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/crd-k8s-1.19.yaml
部署 CRD(Kubernetes 1.18或更低版本)
kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/crd-k8s-1.16.yaml
配置 RBAC
kubectl create clusterrole neuvector-binding-app --verb=get,list,watch,update --resource=nodes,pods,services,namespaces
kubectl create clusterrole neuvector-binding-rbac --verb=get,list,watch --resource=rolebindings.rbac.authorization.k8s.io,roles.rbac.authorization.k8s.io,clusterrolebindings.rbac.authorization.k8s.io,clusterroles.rbac.authorization.k8s.io
kubectl create clusterrolebinding neuvector-binding-app --clusterrole=neuvector-binding-app --serviceaccount=neuvector:default
kubectl create clusterrolebinding neuvector-binding-rbac --clusterrole=neuvector-binding-rbac --serviceaccount=neuvector:default
kubectl create clusterrole neuvector-binding-admission --verb=get,list,watch,create,update,delete --resource=validatingwebhookconfigurations,mutatingwebhookconfigurations
kubectl create clusterrolebinding neuvector-binding-admission --clusterrole=neuvector-binding-admission --serviceaccount=neuvector:default
kubectl create clusterrole neuvector-binding-customresourcedefinition --verb=watch,create,get --resource=customresourcedefinitions
kubectl create clusterrolebinding neuvector-binding-customresourcedefinition --clusterrole=neuvector-binding-customresourcedefinition --serviceaccount=neuvector:default
kubectl create clusterrole neuvector-binding-nvsecurityrules --verb=list,delete --resource=nvsecurityrules,nvclustersecurityrules
kubectl create clusterrolebinding neuvector-binding-nvsecurityrules --clusterrole=neuvector-binding-nvsecurityrules --serviceaccount=neuvector:default
kubectl create clusterrolebinding neuvector-binding-view --clusterrole=view --serviceaccount=neuvector:default
kubectl create rolebinding neuvector-admin --clusterrole=admin --serviceaccount=neuvector:default -n neuvector
檢查是否有以下 RBAC 物件
kubectl get clusterrolebinding | grep neuvector
kubectl get rolebinding -n neuvector | grep neuvector
kubectl get clusterrolebinding | grep neuvector
neuvector-binding-admission ClusterRole/neuvector-binding-admission 44h
neuvector-binding-app ClusterRole/neuvector-binding-app 44h
neuvector-binding-customresourcedefinition ClusterRole/neuvector-binding-customresourcedefinition 44h
neuvector-binding-nvadmissioncontrolsecurityrules ClusterRole/neuvector-binding-nvadmissioncontrolsecurityrules 44h
neuvector-binding-nvsecurityrules ClusterRole/neuvector-binding-nvsecurityrules 44h
neuvector-binding-nvwafsecurityrules ClusterRole/neuvector-binding-nvwafsecurityrules 44h
neuvector-binding-rbac ClusterRole/neuvector-binding-rbac 44h
neuvector-binding-view ClusterRole/view 44h
kubectl get rolebinding -n neuvector | grep neuvector
neuvector-admin ClusterRole/admin 44h
neuvector-binding-psp Role/neuvector-binding-psp 44h
部署 NeuVector
底層 Runtime 為 Docker
kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.0.0/neuvector-docker-k8s.yaml
底層 Runtime 為 Containerd(對於 k3s 和 rke2 可以使用此 yaml 檔案)
kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.0.0/neuvector-containerd-k8s.yaml
1.21 以下的 Kubernetes 版本會提示以下錯誤,將 yaml 檔案下載將 batch/v1 修改為 batch/v1beta1
error: unable to recognize "https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.0.0/neuvector-docker-k8s.yaml": no matches for kind "CronJob" in version "batch/v1"
1.20.x cronjob 還處於 beta 階段,1.21 版本開始 cronjob 才正式 GA 。
預設部署web-ui使用的是loadblance型別的Service,為了方便訪問修改為NodePort,也可以通過 Ingress 對外提供服務
kubectl patch svc neuvector-service-webui -n neuvector --type='json' -p '[{"op":"replace","path":"/spec/type","value":"NodePort"},{"op":"add","path":"/spec/ports/0/nodePort","value":30888}]'
訪問 https://node_ip:30888
預設密碼為 admin/admin
點選頭像旁的 My profile 頁面進入設定頁面,設定密碼和語言
2.2. Helm 部署
新增 repo
helm repo add neuvector https://neuvector.github.io/neuvector-helm/
helm search repo neuvector/core
建立 namespace
kubectl create namespace neuvector
建立 ServiceAccount
kubectl create serviceaccount neuvector -n neuvector
helm 安裝
helm install neuvector --namespace neuvector neuvector/core --set registry=docker.io --set
tag=5.0.0-preview.1 --set=controller.image.repository=neuvector/controller.preview --
set=enforcer.image.repository=neuvector/enforcer.preview --set
manager.image.repository=neuvector/manager.preview --set
cve.scanner.image.repository=neuvector/scanner.preview --set cve.updater.image.repository=neuvector/updater.preview
Helm-chart 引數檢視:
https://github.com/neuvector/...
3. 高可用架構設計
NeuVector-HA 主要需要考慮 Controller 模組的 HA,只要有一個 Controller 處於開啟狀態,所有資料都將在 3 個副本之間之間同步。
Controller 資料主要儲存在 /var/neuvector/ 目錄中,但出現 POD 重建或叢集重新部署時,會自動從此目錄載入備份檔案,進行叢集恢復。
3.1.部署策略
NeuVector 官方提供四種 HA 部署模式
方式一:不進行任何排程限制,由 Kubernetes 進行自由排程管理管理。
方式二:NeuVector control 元件 (manager,controller)+enforce、scanner元件配置排程 label 限制和汙點容忍,與 Kubernetes master 節點部署一起。
方式三:給 Kubernetes 叢集中通過 Taint 方式建立專屬的 NeuVector 節點,只允許 Neuvector control 元件部署。
方式四:NeuVector control 元件 (manager,controller)配置排程 label 限制和汙點容忍,與 Kubernetes master 節點部署一起。k8s-master 不部署 enforce 和 scanner 元件,意味著 master 節點不在接受掃描和策略下發。
以方式二為例,進行部署
給 master 節點打上特定標籤
kubectl label nodes nodename nvcontroller=true
獲取節點 Taint
kubectl get node nodename -o yaml|grep -A 5 taint
以 Rancher 部署的節點 master 節點為例
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/controlplane
value: "true"
- effect: NoExecute
key: node-role.kubernetes.io/etcd
編輯部署的 yaml 給 NeuVector-control 元件(manager,controller)新增 nodeSelector 和 tolerations 給 enforce、scanner 元件只新增 tolerations 。
例如以 manager 元件為例:
kind: Deployment
metadata:
name: neuvector-manager-pod
namespace: neuvector
spec:
selector:
matchLabels:
app: neuvector-manager-pod
replicas: 1
template:
metadata:
labels:
app: neuvector-manager-pod
spec:
nodeSelector:
nvcontroller: "true"
containers:
- name: neuvector-manager-pod
image: neuvector/manager.preview:5.0.0-preview.1
env:
- name: CTRL_SERVER_IP
value: neuvector-svc-controller.neuvector
restartPolicy: Always
tolerations:
- effect: NoSchedule
key: "node-role.kubernetes.io/controlplane"
operator: Equal
value: "true"
- effect: NoExecute
operator: "Equal"
key: "node-role.kubernetes.io/etcd"
value: "true"
3.2.資料持久化
配置環境變數啟用配置資料持久化
- env:
- name: CTRL_PERSIST_CONFIG
配置此環境變數後,預設情況下 NeuVector-Controller 會將資料儲存在 /var/neuvector 目錄內,預設此目錄是 hostpath 對映在 POD 所在宿主機的 /var/neuvector 目錄內。
若需要更高階別資料可靠性也可以通過 PV 對接 nfs 或其他支出多讀寫的儲存中。
這樣當出現 NeuVector-Controller 三個 POD 副本同時都銷燬,宿主機都完全不可恢復時,也不會有資料配置資料丟失。
以下以 NFS 為例。
部署 nfs
建立 pv 和 pvc
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:
name: neuvector-data
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
path: /nfsdata
server: 172.16.0.195
EOF
cat <<EOF | kubectl apply -f -
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: neuvector-data
namespace: neuvector
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
EOF
修改 NeuVector-Controller 部署 yaml,新增 pvc 資訊,將 /var/neuvector 目錄對映到 nfs 中(預設是hostpath對映到本地)
spec:
template:
spec:
volumes:
- name: nv-share
# hostPath: // replaced by persistentVolumeClaim
# path: /var/neuvector // replaced by persistentVolumeClaim
persistentVolumeClaim:
claimName: neuvector-data
或直接在 NeuVector 部署 yaml 中掛載 nfs 目錄
volumes:
- name: nv-share
nfs:
path: /opt/nfs-deployment
server: 172.26.204.144
4.多雲安全管理
在實際生產應用中,會存在對多個叢集進行安全進行管理,NeuVector 支援叢集聯邦功能。
需要在一個叢集上暴露 Federation Master 服務,在每個遠端叢集上部署 Federation Worker 服務。為了更好的靈活性,可以在每個叢集同時啟用 Federation Master 和 Federation Worker 服務。
在每個叢集部署此 yaml
apiVersion: v1
kind: Service
metadata:
name: neuvector-service-controller-fed-master
namespace: neuvector
spec:
ports:
- port: 11443
name: fed
nodePort: 30627
protocol: TCP
type: NodePort
selector:
app: neuvector-controller-pod
---
apiVersion: v1
kind: Service
metadata:
name: neuvector-service-controller-fed-worker
namespace: neuvector
spec:
ports:
- port: 10443
name: fed
nodePort: 31783
protocol: TCP
type: NodePort
selector:
app: neuvector-controller-pod
將其中一個叢集升級為主叢集
將其中一個叢集升級為主叢集,配置連線遠端暴露 ip 和對 remot cluster 可達的埠。
在主叢集中,生成 token,用於其他 remote cluster 連線。
在 remote cluster 中配置加入主叢集,配置 token 和連線端子
在介面可以對多個 NeuVector 叢集進行管理
5.其他配置
5.1.升級
若是採用 yaml 檔案方式部署的 NeuVector 直接更新對應的元件映象 tag 即可完成升級。如
kubectl set imagedeployment/neuvector-controller-podneuvector-controller-pod=neuvector/controller:2.4.1 -n neuvector
kubectl set image -n neuvectords/neuvector-enforcer-pod neuvector-enforcer-pod=neuvector/enforcer:2.4.1
若是採用 Helm 部署的 NeuVector,則直接執行 helm update 配置對應引數即可。
5.2.解除安裝
刪除部署的元件
kubectl delete -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.0.0/neuvector-docker-k8s.yaml
刪除配置的 RBAC
kubectl get clusterrolebinding | grep neuvector|awk '{print $1}'|xargs kubectl delete clusterrolebinding
kubectl get rolebinding -n neuvector | grep neuvector|awk '{print $1}'|xargs kubectl delete rolebinding -n neuvector
刪除對應的 CRD
kubectl delete -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.0.0/crd-k8s-1.19.yaml
kubectl delete -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.0.0/waf-crd-k8s-1.19.yaml
kubectl delete -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.0.0/admission-crd-k8s-1.19.yaml
總結:
SUSE 此次開源的 NeuVector 是一個成熟穩定的容器安全管理平臺,未來 NeuVector 會和 Rancher 產品更好地融合。