云原生安全检测器 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 数据分析绝对绕不过的四个…...
积水内涝监测——埋入式积水终端设备介绍
一、设备概述 埋入式积水终端是针对城市内涝推出的积水信息监测采集设备,采用超声波传感技术,对积水的深度进行精确的测量。产品能够在低温、腐蚀环境下可靠运行本产品特别适用于智慧城市中,对城市道路、社区低洼处的积水进行实时监测上报到…...
Kafka的日志同步
首先介绍下LEO和HW LEO: 即LogEndOffset,表示该副本下次日志记录的偏移量HW:即HighWatermark,高水位线,是所有ISR副本集合中的LEO最小值上图中,如果此时三个副本都在ISR集合中,那么此时他们的LE…...
【Mybatis源码解析】mapper实例化及执行流程源码分析
文章目录简介环境搭建源码解析基础环境:JDK17、SpringBoot3.0、mysql5.7 储备知识:《【Spring6源码・AOP】AOP源码解析》、《JDBC详细全解》 简介 基于SpringBoot的Mybatis源码解析: 1.如何对mapper实例化bean 在加载BeanDefinition时&a…...
分布式文件管理系统(MinIO)
1.去中心化,每个点是对等的关系,通过Ngix对负载做均衡工作。 好处: 能够避免单点故障,将多块硬盘组成一个对象存储服务。 2. 使用纠删编码技术来保护数据,是一种回复丢失和损坏的数据的数学算法,他将数据分…...
Springcloud-配置中心config
一、添加依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId&…...
[项目篇] 音乐播放器开发报告
文章目录1. 项目描述:2. 项目上线展现:3. 项目具体实现:1. 登录2. 注册3.退出系统4.添加音乐4.1前后端交互约定4.2上传文件业务逻辑:4.3创建model包中的music类4.4在MusicMapper接口中,声明insertMusic抽象方法4.5在mybatis包中添…...
Spring Cloud Alibaba--gateway微服务详解之网关(二)
1、网关介绍 上篇对微服务中的nacos注册中心进行集成讲解。nacos主要作用是管理多服务之间复杂关系的组件。微服务是非常庞大且问题突出的架构,HTTP协议具有跨源资源共享 (CORS) Cross- Origin Resource Sharing机制,而处于安全考虑往往前端架构都会对跨…...
Zynq非VDMA方案实现视频3帧缓存输出,无需SDK配置,提供工程源码和技术支持
目录1、前言2、VDMA的不便之处3、FDMA取代VDMA实现视频缓存输出4、Vivado工程详解5、上板调试验证并演示6、福利:工程代码的获取1、前言 对于Zynq和Microblaze的用户而言,要想实现图像缓存输出,多半要使用Xilinx推荐的VDMA方案,该…...
血液透析过滤芯气密性检测装置中的高精度多段压力控制解决方案
摘要:针对目前血液过滤芯气密性检测过程中存在的自动化水平较低、多个检测压力之间需人工切换和压力控制精度较差的问题,为满足客户对高精度和自动化气密性检测的要求,本文提出了相应的解决方案。解决方案的主要特点是全过程的可编程压力控制…...
PDF加密如何批量解除?快来了解下这个方法
在现代办公环境中,PDF文档的使用非常普遍。然而,由于一些安全需求,有时候PDF文档会被加密,使得只有授权人员可以查看或修改它。但是,如果您需要对许多加密PDF文档进行操作,逐个解密这些文档可能非常费时费力…...
go语言做的网站/北京出大大事了
如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html .focus() 命令 聚焦 DOM 元素 语法格式 .focus() .focus(options) 正确写法 cy.get(input).first().focus() 重点 必须是 DOM 元素才能调用 .focus() 方法&am…...
做速卖通代码的网站/黑帽seo排名
2019独角兽企业重金招聘Python工程师标准>>> 一、Aggregate简介 db.collection.aggregate()是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能&#…...
网站如何做301转向/广州外包网络推广公司
如果想了解更多的知识,可以去我的机器学习之路 The Road To Machine Learning通道 多元函数的泰勒展开Talor以及黑塞矩阵 在学最优化的时候,会遇到很多多元函数的泰勒展开,且很多都是以矩阵形式写的,为了理解更好一点࿰…...
ftp怎么重新上传网站/重庆镇海seo整站优化价格
Spring Boot 介绍及项目搭建(核心功能、起步依赖分析,自动配置解析)。 1. Spring Boot 介绍 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配…...
软件开发外包交易平台/淘宝怎么优化关键词排名
前言 Android开发前几年火爆一时,市场饱和后Android程序员每一名程序员都想成为架构师,但这期间,需要付出的辛苦和努力远超过我们的想象。 我对Android工程师的调研发现:97% 的Android开发 技术人都会面临这些困境(可…...
网络营销薪酬公司/seo优化网站的手段
Git更新远程仓库代码到本地分支 一句代码解决 今天原本用的电脑被拿去维修了 换了另外一台电脑 刚好遇到这样一个问题 需要在新的这台电脑上把远程仓库上的代码拉下来 看了官方文档说用 git fetch 来实现 觉得挺麻烦的 发现了只用写一句命令就可以解决的方法 解决方案 使用 gi…...