實(shí)用教程 | 云原生安全平臺(tái) NeuVector 部署

作者簡(jiǎn)介
萬(wàn)紹遠(yuǎn),CNCF 基金會(huì)官方認(rèn)證 Kubernetes CKA&CKS 工程師拦盹,云原生解決方案架構(gòu)師。對(duì) ceph舍哄、Openstack宴凉、Kubernetes誊锭、prometheus 技術(shù)和其他云原生相關(guān)技術(shù)有較深入的研究表悬。參與設(shè)計(jì)并實(shí)施過(guò)多個(gè)金融、保險(xiǎn)丧靡、制造業(yè)等多個(gè)行業(yè) IaaS 和 PaaS 平臺(tái)設(shè)計(jì)和應(yīng)用云原生改造指導(dǎo)蟆沫。

前 言

NeuVector 是業(yè)界首個(gè)端到端的開(kāi)源容器安全平臺(tái),唯一為容器化工作負(fù)載提供企業(yè)級(jí)零信任安全的解決方案温治。本文將從以下 5 個(gè)方面詳細(xì)介紹如何部署 NeuVector:

1. NeuVector 概覽

2. NeuVector 安裝

  1. 高可用架構(gòu)設(shè)計(jì)

  2. 多云安全管理

  3. 其他配置

1.NeuVector 概覽

NeuVector 致力于保障企業(yè)級(jí)容器平臺(tái)安全饭庞,可以提供實(shí)時(shí)深入的容器網(wǎng)絡(luò)可視化、東西向容器網(wǎng)絡(luò)監(jiān)控熬荆、主動(dòng)隔離和保護(hù)舟山、容器主機(jī)安全以及容器內(nèi)部安全,容器管理平臺(tái)無(wú)縫集成并且實(shí)現(xiàn)應(yīng)用級(jí)容器安全的自動(dòng)化卤恳,適用于各種云環(huán)境累盗、跨云或者本地部署等容器生產(chǎn)環(huán)境。

2021年突琳, NeuVector 被 SUSE 收購(gòu)若债,并在 2022 年 1 月完成開(kāi)源,成為業(yè)界首個(gè)端到端的開(kāi)源容器安全平臺(tái)拆融,唯一為容器化工作負(fù)載提供企業(yè)級(jí)零信任安全的解決方案蠢琳。

項(xiàng)目地址:https://github.com/neuvector/neuvector

本文主要基于 NeuVector 首個(gè)開(kāi)源版 NeuVector:5.0.0-preview.1 進(jìn)行介紹。

1.1. 架構(gòu)解析

NeuVector 本身包含 Controller镜豹、Enforcer傲须、Manager、Scanner 和 Updater 模塊趟脂。

  • Controller :整個(gè) NeuVector 的控制模塊躏碳,API 入口,包括配置下發(fā)散怖,高可用主要考慮 Controller 的 HA 菇绵,通常建議部署 3 個(gè) Controller 模塊組成集群。
  • Enforcer :主要用于安全策略部署下發(fā)和執(zhí)行镇眷,DaemonSet 類型會(huì)在每個(gè)節(jié)點(diǎn)部署咬最。
  • Manager:提供 web-UI(僅HTTPS) 和 CLI 控制臺(tái),供用戶管理 NeuVector 欠动。
  • Scanner :對(duì)節(jié)點(diǎn)永乌、容器惑申、Kubernetes 、鏡像進(jìn)行 CVE 漏洞掃描
  • Updater :cronjob 翅雏,用于定期更新 CVE 漏洞庫(kù)

1.2.主要功能概覽

  • 安全漏洞掃描
  • 容器網(wǎng)絡(luò)流量可視化
  • 網(wǎng)絡(luò)安全策略定義
  • L7 防火墻
  • CICD 安全掃描
  • 合規(guī)分析

本文重點(diǎn)介紹安裝部署圈驼,具體功能將在后續(xù)文章中深入介紹。

2.NeuVector 安裝

安裝環(huán)境
軟件版本:
OS:Ubuntu18.04
Kubernetes:1.20.14
Rancher:2.5.12
Docker:19.03.15
NeuVector:5.0.0-preview.1

2.1. 快速部署

創(chuàng)建 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 對(duì)象

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(對(duì)于 k3s 和 rke2 可以使用此 yaml 文件)

kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.0.0/neuvector-containerd-k8s.yaml

1.21 以下的 Kubernetes 版本會(huì)提示以下錯(cuò)誤望几,將 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 版本開(kāi)始 cronjob 才正式 GA 啦逆。

默認(rèn)部署web-ui使用的是loadblance類型的Service恕洲,為了方便訪問(wèn)修改為NodePort,也可以通過(guò) Ingress 對(duì)外提供服務(wù)

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}]'

訪問(wèn) https://node_ip:30888
默認(rèn)密碼為 admin/admin

點(diǎn)擊頭像旁的 My profile 頁(yè)面進(jìn)入設(shè)置頁(yè)面盐碱,設(shè)置密碼和語(yǔ)言

2.2. Helm 部署

添加 repo

helm repo add neuvector https://neuvector.github.io/neuvector-helm/
helm search repo neuvector/core

創(chuàng)建 namespace

kubectl create namespace neuvector

創(chuàng)建 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 參數(shù)查看:
https://github.com/neuvector/neuvector-helm/tree/master/charts/core

3. 高可用架構(gòu)設(shè)計(jì)

NeuVector-HA 主要需要考慮 Controller 模塊的 HA楼誓,只要有一個(gè) Controller 處于打開(kāi)狀態(tài)玉锌,所有數(shù)據(jù)都將在 3 個(gè)副本之間之間同步。

Controller 數(shù)據(jù)主要存儲(chǔ)在 /var/neuvector/ 目錄中疟羹,但出現(xiàn) POD 重建或集群重新部署時(shí)主守,會(huì)自動(dòng)從此目錄加載備份文件,進(jìn)行集群恢復(fù)榄融。

3.1.部署策略

NeuVector 官方提供四種 HA 部署模式

方式一:不進(jìn)行任何調(diào)度限制参淫,由 Kubernetes 進(jìn)行自由調(diào)度管理管理。

方式二:NeuVector control 組件 (manager,controller)+enforce剃袍、scanner組件配置調(diào)度 label 限制和污點(diǎn)容忍黄刚,與 Kubernetes master 節(jié)點(diǎn)部署一起。

方式三:給 Kubernetes 集群中通過(guò) Taint 方式建立專屬的 NeuVector 節(jié)點(diǎn)民效,只允許 Neuvector control 組件部署憔维。

方式四:NeuVector control 組件 (manager,controller)配置調(diào)度 label 限制和污點(diǎn)容忍,與 Kubernetes master 節(jié)點(diǎn)部署一起畏邢。k8s-master 不部署 enforce 和 scanner 組件业扒,意味著 master 節(jié)點(diǎn)不在接受掃描和策略下發(fā)。

以方式二為例舒萎,進(jìn)行部署

給 master 節(jié)點(diǎn)打上特定標(biāo)簽

kubectl label nodes nodename nvcontroller=true

獲取節(jié)點(diǎn) Taint

kubectl get node nodename -o yaml|grep -A 5 taint

以 Rancher 部署的節(jié)點(diǎn) master 節(jié)點(diǎn)為例

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.數(shù)據(jù)持久化

配置環(huán)境變量啟用配置數(shù)據(jù)持久化

- env:
  - name: CTRL_PERSIST_CONFIG

配置此環(huán)境變量后臂寝,默認(rèn)情況下 NeuVector-Controller 會(huì)將數(shù)據(jù)存儲(chǔ)在 /var/neuvector 目錄內(nèi)章鲤,默認(rèn)此目錄是 hostpath 映射在 POD 所在宿主機(jī)的 /var/neuvector 目錄內(nèi)。

若需要更高級(jí)別數(shù)據(jù)可靠性也可以通過(guò) PV 對(duì)接 nfs 或其他支出多讀寫(xiě)的存儲(chǔ)中咆贬。

這樣當(dāng)出現(xiàn) NeuVector-Controller 三個(gè) POD 副本同時(shí)都銷毀败徊,宿主機(jī)都完全不可恢復(fù)時(shí),也不會(huì)有數(shù)據(jù)配置數(shù)據(jù)丟失掏缎。

以下以 NFS 為例皱蹦。

部署 nfs

創(chuàng)建 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 中(默認(rèn)是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.多云安全管理

在實(shí)際生產(chǎn)應(yīng)用中沪哺,會(huì)存在對(duì)多個(gè)集群進(jìn)行安全進(jìn)行管理沈自,NeuVector 支持集群聯(lián)邦功能。

需要在一個(gè)集群上暴露 Federation Master 服務(wù)辜妓,在每個(gè)遠(yuǎn)端集群上部署 Federation Worker 服務(wù)枯途。為了更好的靈活性,可以在每個(gè)集群同時(shí)啟用 Federation Master 和 Federation Worker 服務(wù)嫌拣。

在每個(gè)集群部署此 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

將其中一個(gè)集群升級(jí)為主集群

將其中一個(gè)集群升級(jí)為主集群柔袁,配置連接遠(yuǎn)程暴露 ip 和對(duì) remot cluster 可達(dá)的端口呆躲。

在主集群中异逐,生成 token,用于其他 remote cluster 連接插掂。

在 remote cluster 中配置加入主集群灰瞻,配置 token 和連接端子

在界面可以對(duì)多個(gè) NeuVector 集群進(jìn)行管理

5.其他配置

5.1.升級(jí)

若是采用 yaml 文件方式部署的 NeuVector 直接更新對(duì)應(yīng)的組件鏡像 tag 即可完成升級(jí)。如

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辅甥,則直接執(zhí)行 helm update 配置對(duì)應(yīng)參數(shù)即可酝润。

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

刪除對(duì)應(yīng)的 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

總結(jié):

SUSE 此次開(kāi)源的 NeuVector 是一個(gè)成熟穩(wěn)定的容器安全管理平臺(tái),未來(lái) NeuVector 會(huì)和 Rancher 產(chǎn)品更好地融合璃弄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末要销,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子夏块,更是在濱河造成了極大的恐慌疏咐,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脐供,死亡現(xiàn)場(chǎng)離奇詭異浑塞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)政己,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)酌壕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人歇由,你說(shuō)我怎么就攤上這事卵牍。” “怎么了沦泌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵糊昙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我赦肃,道長(zhǎng)溅蛉,這世上最難降的妖魔是什么公浪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮船侧,結(jié)果婚禮上欠气,老公的妹妹穿的比我還像新娘。我一直安慰自己镜撩,他們只是感情好预柒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著袁梗,像睡著了一般宜鸯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上遮怜,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天淋袖,我揣著相機(jī)與錄音,去河邊找鬼锯梁。 笑死即碗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的陌凳。 我是一名探鬼主播剥懒,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼合敦!你這毒婦竟也來(lái)了初橘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤充岛,失蹤者是張志新(化名)和其女友劉穎保檐,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體裸准,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡展东,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炒俱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盐肃。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖权悟,靈堂內(nèi)的尸體忽然破棺而出砸王,到底是詐尸還是另有隱情,我是刑警寧澤峦阁,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布谦铃,位于F島的核電站,受9級(jí)特大地震影響榔昔,放射性物質(zhì)發(fā)生泄漏驹闰。R本人自食惡果不足惜瘪菌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嘹朗。 院中可真熱鬧师妙,春花似錦、人聲如沸屹培。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)褪秀。三九已至蓄诽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間媒吗,已是汗流浹背仑氛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蝴猪,地道東北人调衰。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓膊爪,卻偏偏與公主長(zhǎng)得像自阱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子米酬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容