實用教程 | 雲原生安全平臺 NeuVector 部署

作者簡介
萬紹遠,CNCF 基金會官方認證 Kubernetes CKA&CKS 工程師,雲原生解決方案架構師。對 ceph、Openstack、Kubernetes、prometheus 技術和其他雲原生相關技術有較深入的研究。參與設計並實施過多個金融、保險、製造業等多個行業 IaaS 和 PaaS 平臺設計和應用雲原生改造指導。

前 言

NeuVector 是業界首個端到端的開源容器安全平臺,唯一爲容器化工作負載提供企業級零信任安全的解決方案。本文將從以下 5 個方面詳細介紹如何部署 NeuVector:

  1. NeuVector 概覽

  2. NeuVector 安裝

  3. 高可用架構設計

  4. 多雲安全管理

  5. 其他配置

1.NeuVector 概覽

NeuVector 致力於保障企業級容器平臺安全,可以提供實時深入的容器網絡可視化、東西向容器網絡監控、主動隔離和保護、容器主機安全以及容器內部安全,容器管理平臺無縫集成並且實現應用級容器安全的自動化,適用於各種雲環境、跨雲或者本地部署等容器生產環境。

2021年, NeuVector 被 SUSE 收購,並在 2022 年 1 月完成開源,成爲業界首個端到端的開源容器安全平臺,唯一爲容器化工作負載提供企業級零信任安全的解決方案。

項目地址:https://github.com/neuvector/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/neuvector-helm/tree/master/charts/core

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 產品更好地融合。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章