近日, 云原生安全检测器 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 提出。
同时也欢迎对这个开源项目进行贡献。