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

云原生安全检测器 Narrows(CNSI)的部署和使用
近日, 云原生安全检测器 Narrows(Cloud Native Security Inspector,简称CNSI)发布了0.2.0版本。 (https://github.com/vmware-tanzu/cloud-native-security-inspector) 此项目旨在对K8s集群中的工作负载进…...

【并发编程】【3】Java线程 创建线程与线程运行
并发编程 3.Java线程 本章内容 创建和运行线程 查看线程 线程 API 线程状态 3.1 创建和运行线程 方法一,直接使用 Thread // 创建线程对象 Thread t new Thread() {public void run() {// 要执行的任务} }; // 启动线程 t.start();例如: // 构…...

Ambire 最新消息——2023 年 1 月
大家好,这里是我们在过去几周所做的一切的快速回顾。 发展 整个钱包的交易模拟和余额预测 我们推出了一项真正改变加密钱包 UX 游戏规则的功能:Ambire 现在向用户显示他们的钱包余额将如何更新,甚至在签署交易之前。 这项新功能可以分解为 Am…...
【kubeflow | 镜像源的解决方法——脚本】
20230214 方式一:获取所有镜像列表,自行外网拉取下载 获取KF所需镜像列表脚本 Offical docs for getting all kubeflow images curl https://gist.githubusercontent.com/Jason-CKY/7d7056ce261c6d606585f05218230037/raw/5c27297efdf6424cd9679b9f7…...
function calling convention(函数调用约定)
函数调用约定 函数调用约定,是指当一个函数被调用时,函数的参数会被传递给被调用的函数和返回值会被返回给调用函数。函数的调用约定就是描述参数是怎么传递和由谁平衡...

errgroup 原理简析
golang.org/x/sync/errgroup errgroup提供了一组并行任务中错误采集的方案。 先看注释 Package errgroup provides synchronization, error propagation, and Context cancelation for groups of goroutines working on subtasks of a common task. Group 结构体 // A Gro…...
Centos7.6 下 Docker 安装
Docker的自动化安装 官方的一键安装方式: curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 国内 daocloud一键安装命令: curl -sSL https://get.daocloud.io/docker | sh Docker手动安装 手动安装Docker分三步:卸…...

C++11--lambda表达式
目录 lambda表达式的概念 lambda表达式语法 lambda表达式的书写格式 捕捉列表 参数列表 mutable 返回值类型 函数体 lambda表达式交换两个数 函数对象与lambda表达式 lambda表达式的概念 lambda表达式是一个匿名函数 它能让代码更加地简洁 提高了代码可读性 首先定义…...

四【Spring框架】
目录一 Spring概述二 .Spring 的体系结构三 Spring的开发环境3.1 配置pom.xml文件四 项目案例:4.1 创建实体类4.2 在pom.xml中引入依赖4.3 配置Spring-config.xml文件4.4 Test✅作者简介:Java-小白后端开发者 🥭公认外号:球场上的…...

树与二叉树 总复习
一、树的定义 树是一个有n个(n>0)结点的有限集合。 如果n0,称为空树; 如果n>0,称为非空树,有且仅有一个特定的称为根Root的结点(无直接前驱) 如果n>1,除了根节点外&…...

window10安装MySQL数据库
准备好软件MySql的下载参考:(1137条消息) mysql下载与安装过程_weixin_40396510的博客-CSDN博客_mysql数据库下载安装(1137条消息) 安装MySQL的常见问题_二木成林的博客-CSDN博客_sc不是内部或外部命令,也不是可运行的程序解压要C盘(自定义,本…...

羊了个羊游戏开发教程3:卡牌拾取和消除
本文首发于微信公众号: 小蚂蚁教你做游戏。欢迎关注领取更多学习做游戏的原创教程资料,每天学点儿游戏开发知识。嗨!大家好,我是小蚂蚁。终于要写第三篇教程了,中间拖的时间有点儿长,以至于我的好几位学员等…...
SHA1详解
目录 一、介绍 二、与MD5的区别 1、对强行攻击的安全性 2、对密码分析的安全性 3、速度 三、应用 1、文件指纹 2、Git中标识对象 四、算法原理 1、填充消息 2、消息处理 3、数据运算 (1)链接变量 (2)步函数 一、介绍…...
Go并发介绍及其使用
1. goroutine Go语言通过go关键字来启动一个goroutine。注意:go关键字后面必须跟一个函数,不能是语句或者其他东西,函数的返回值被忽略。 goroutine有如下特性: go的执行是非阻塞的,不会等待。go后面的函数的返回值…...

小米手机屏幕解锁技巧精选
手机锁是一种保护存储的用户数据和信息的方法。存储在锁定手机中的所有信息比任何人都可以访问的手机安全得多。但有时,如果用户忘记了这些屏幕锁定,可能会造成麻烦。在此博客中,我们将帮助用户了解如何解锁小米手机。 什么时候需要解锁小米手…...
「SDOI2009」HH去散步
HH去散步 题目限制 内存限制:125.00MB时间限制:1.00s标准输入标准输出 题目知识点 动态规划 dpdpdp矩阵 矩阵乘法矩阵加速矩阵快速幂 思维 构造 题目来源 「SDOI2009」HH去散步 题目 题目背景 HH 有个一成不变的习惯,喜欢在饭后散步…...

用上Visual Studio后,我的世界游戏的构建时间减少了一半
今天我们讲述一个使用 Visual Studio 提升工作效率的案例。 我的世界(Minecraft) 游戏开发商 Mojang Studios 近日联系了 Visual Studio C 团队,因为他们需要将 C 开发扩展到新平台(Linux),同时还希望保留他们现有的技术基础&…...

34、基于51单片机锂电池电压电流容量检测仪表LCD液晶显示 原理图PCB程序设计
方案选择 单片机的选择 方案一:AT89C52是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元…...
【Java基础】泛型(一)-基础使用
本文以Java的官方文档为参考,辅以代码示例,尽可能详尽的叙述泛型的每一个特性 什么是泛型 泛型(Generics)也称为参数化类型(parameterized types),也就是将类型本身作为接口、类、方法中的参数…...

学Python不会不知道NumPy计算包吧,带你五分钟看懂NumPy计算包
从今天我们就开始进入 Python 数据分析工具的教程。 前段时间数据分析和Python都讲了一点点,但是Python的数据库,讲的少了点,所以接下来就讲讲这些重要的常用数据库吧!!! Python 数据分析绝对绕不过的四个…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...