云原生安全检测器 Narrows(CNSI)的部署和使用
近日, 云原生安全检测器 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 提出。
同时也欢迎对这个开源项目进行贡献。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
源创存储加入openKylin,为存储国产化进程贡献力量!
近日,深圳源创存储科技有限公司(以下简称“源创存储”)签署openKylin社区CLA(Contributor License Agreement 贡献者许可协议),正式加入openKylin开源社区。 源创存储成立于2014年,专注于半导体领域,致力于高端存储产品的技术研发和制造。源创存储公司集设计、研发、制造、销售、服务为一体,于 2017 年获评国家高新技术企业。源创存储主营行业级自主品牌的固态硬盘、内存条等数据存储模组,于 2020 年推出“百芯微”品牌,致力于安全可信存储方案,与客户一起打造存储可靠供应链,为存储国产化进程贡献自己的力量。 目前已与多个国产化平台、国产操作系统及整机厂商展开配合,通过了与 CPU 厂商、操作系统等的互认证,并已实现了在政务办公主机、一体机、OPS 等产品领域的量产。 在加入openKylin后,源创存储将与社区携手开展基于SSD、内存条、操作系统升级换代的驱动适配优化和研发工作,推动产业化进程;并解决关键软硬件兼容性问题,完善公司产品在openKylin操作系统上的适配优化。 社区会员持续招募中 目前,openKylin社区会员招募正在火热进行...
- 下一篇
vivo版本发布平台:带宽智能调控优化实践-平台产品系列03
vivo 互联网平台产品研发团队 - Peng Zhong 随着分发规模地逐步增长,各企业对CDN带宽的使用越来越多。并且,各类业务使用CDN的场景各式各样,导致带宽会不断地出现骤增骤降等问题。基于成本考虑,国内CDN厂商的计费模式主要用峰值点的带宽来计费,就算不用峰值点的带宽,也会因为峰值问题所产生的成本而抬高带宽单价。基于此,控制CDN带宽的峰谷具有重要意义,降低峰值就意味着成本节省。 《平台产品》系列文章: vivo平台化实践探索之旅-平台产品系列01 vivo霍金实验平台设计与实践-平台产品系列02 一、背景 伴随着互联网地兴起,很多企业都经历过互联网野蛮生长的一段岁月。然而,在互联网市场逐步成熟稳定之后,各大企业在业务上的增长速度逐渐放缓,也纷纷开始“对内挖掘成本方面”的产出,对成本做更加精细化的管控,提升企业的竞争力。 特别是随着“互联网寒冬”的来临,“冷气”传导到各行各业,“降本增效”的概念也纷纷被重新提起。有拉闸限电的,扣成本扣细节;也有大规模裁员一刀切的,淘汰部分业务,压缩人力;还有些团队直接组建横向团队,通过顶层思维,在不影响团队运作的情况下,专攻核心成本技术难题,...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- CentOS7安装Docker,走上虚拟化容器引擎之路