关于kubernetes:实用教程-云原生安全平台-NeuVector-部署

39次阅读

共计 9770 个字符,预计需要花费 25 分钟才能阅读完成。

作者简介
万绍远,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: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 产品更好地交融。

正文完
 0