一种镜像安装包信息的扫描方法及设备与流程

文档序号:17992732发布日期:2019-06-22 00:56阅读:427来源:国知局
一种镜像安装包信息的扫描方法及设备与流程

本发明涉及计算机技术领域,具体的,涉及一种镜像安装包信息扫描方法及设备。



背景技术:

自2013年发布至今,docker已逐渐成为当前最主流的开源应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的linux机器上,从而实现一次创建、任意运行的目的。docker还提供了dockerhub可以让用户上传创建的镜像,以便其他用户下载,快速搭建环境,但同时也带来了一些安全问题:在容器运行环境下,所有服务程序均被打包到容器镜像中,随着镜像包一起发布,由于镜像打包发布过程中存在不规范的操作,不合法的安装包下载源,导致镜像引入漏洞,早在2015年的一次调查中,研究者就曾发现取样的dockerhub上有30%-40%的镜像存在安全性的问题。这样就需要提供一种机制扫描并发现镜像安装包中存在的各种风险(cve),由于镜像安装包在cicd(持续集成/发布)过程中处于信息源的地位,因此需要从源头控制风险的扩散。

clair是目前常用的镜像扫描工具,主要模块分为detector、fetcher、notifier和webhook,其首先对镜像进行特征的提取,然后再将这些特征匹配cve漏洞库,若发现漏洞则进行提示及修补。然而,clair并没有针对本地镜像特点优化层的访问顺序、数据下载方式、解压方法,导致cpu、内存、网络性能消耗巨大,扫描速度慢。

有鉴于此,提出本发明。



技术实现要素:

有鉴于此,本发明的目的在于提供一种镜像安装包信息的扫描方法及设备,以解决现有技术中的至少一项技术问题。

具体的,本发明的第一方面,提供了一种镜像安装包信息的扫描方法,包括如下步骤:

指定镜像仓库中存在的repo:tag列表;

对repo:tag列表中的镜像进行遍历;

其中,所述对repo:tag列表中镜像进行遍历的步骤包括:

下载与repo:tag列表对应的镜像manifest文件到本地;

解析镜像manifest文件;

核对manifest文件;

下载镜像文件;

对镜像文件的数据进行扫描。

采用上述技术方案,避免了镜像的重复扫描和重复下载,提高了镜像安装包的扫描效率,减少了网络流量。

优选的,通过api指定镜像仓库中存在的repo:tag列表。

优选的,通过api下载与repo:tag列表对应的镜像manifest文件到本地。

优选的,镜像manifest文件储存在本地的缓存目录中。

优选的,所述解析镜像manifest文件的步骤包括:

解析镜像manifest文件;

获取镜像层的id列表;

排序组成层链表;

判断层链表中是否为多层,

若为是,则进行下载镜像文件步骤,

若为否,则执行对未扫描过的镜像的安全扫描,即下载repo:tag列表中的另一个对应的镜像manifest文件到本地。

优选的,所述核对manifest文件的步骤包括:

判断层的安装包信息记录是否存在于缓存数据库中,

若为是,从缓存数据库中获取层的安装包信息,并执行对未扫描过的镜像的安全扫描,即下载repo:tag列表中的另一个对应的镜像manifest文件到本地,

若为否,则下载镜像文件。

优选的,所述下载镜像文件的步骤包括:

下载镜像层的压缩包到本地;

判断是否下载成功,

若为否,则继续下载镜像层的压缩包,

若为是,则对压缩包进行解压。

更优选的,对镜像层的压缩包下载不成功的次数进行判定,

若不成功次数超过3次,则执行对未扫描过的镜像的安全扫描,即下载repo:tag列表中的另一个对应的镜像manifest文件到本地,

若不成功次数少于3次,则继续下载镜像层的压缩包。

更优选的,所述镜像层的压缩包保存到本地的临时目录。

更优选的,所述对压缩包进行解压的步骤包括:

判断被解压的指定文件是否存在,

若为是,则对解压后的文件进行扫描,

若为否,则执行对未扫描过的镜像的安全扫描,即下载repo:tag列表中的另一个对应的镜像manifest文件到本地。

优选的,所述对镜像文件的数据进行扫描的步骤包括:

逐行扫描解压后的文件,

执行对未扫描过的镜像的安全扫描,即下载repo:tag列表中的另一个对应的镜像manifest文件到本地。

优选的,对镜像文件的数据进行扫描后,执行对未扫描过的镜像的安全扫描之前,还包括如下步骤:

获取层的安装包信息,

在缓存数据库中存放层的安装包信息。

采用上述技术方案,通过更新缓存数据库中的层的安装包信息,使缓存数据库更为完善,提高了扫描效率。

本发明的另一方面,提供了一种镜像安装包信息的扫描设备,所述设备包括:处理器;

存储装置,用于存储一个或多个程序;

所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现上述的扫描方法。

本发明的另一方面,提供了一种存储介质,所述存储介质包括一个或多个程序,所述一个或多个程序可以执行上述的扫描方法。

综上所述,本发明具有以下有益效果:

1.采用上述技术方案,通过对相关镜像manifest文件的核对,避免镜像的重复扫描和重复下载,提高了镜像安装包的扫描效率,减少了网络流量。

2.采用上述技术方案,通过对相关镜像的遍历,提高了扫描的全面性,保证了镜像的使用安全。

3.采用上述技术方案,通过更新缓存数据库中的层的安装包信息,使缓存数据库更为完善,提高了扫描效率。

附图说明:

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明镜像安装包信息的扫描方法的执行流程图;

图2为对repo:tag列表中的镜像进行遍历的执行流程图;

图3为本发明镜像安装包信息的扫描方法的一种优选实施方式的流程图。

具体实施方式:

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有付出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

在本发明使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本发明。在本发明和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。

以下对本申请涉及的一些概念进行解释:

docker:是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

镜像仓库:docker镜像的集中存放仓库,不同主机可以从该仓库中下载docker镜像。

dockerhub:docker官方提供的镜像仓库。

dockerregistry:用户根据需要搭建的私有镜像仓库。

manifest文件:镜像文件的元数据文件。

层链表:std::list<layerlnfo>xxx形式的数据结构。

api:应用程序编程接口。是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

以下将通过实施例对本发明进行详细描述。

本申请实施例通过提供一种镜像安装包信息的扫描方法及设备,解决了现有技术中,镜像安装包在进行安全扫描时,cpu(中央处理器)、内存、网络性能消耗大,扫描速度慢等中的至少一项技术问题,提高了扫描效率。

本申请实施例的技术方案为解决上述技术问题,总体思路如下:

一种镜像安装包信息的扫描方法,包括如下步骤:指定镜像仓库中存在的repo:tag列表;对repo:tag列表中的镜像进行遍历;

其中,所述对repo:tag列表中镜像进行遍历的步骤包括:下载与repo:tag列表对应的镜像manifest文件到本地;解析镜像manifest文件;核对manifest文件;下载镜像文件;对镜像文件的数据进行扫描。

为了更好的理解上述技术方案,下面将结合说明书附图以及具体的实施方式对上述技术方案进行详细的说明。

在本发明的一个优选实施方式中,提供了一种镜像安装包信息的扫描方法,如图1-图3所示,包括如下步骤:

步骤s101:指定镜像仓库中存在的repo:tag列表;

在具体实施过程中,所述镜像仓库可以为公有镜像仓库如dockerhub,也可以为私有镜像仓库如dockerregistry。

在具体实施过程中,repo:tag列表中可以包括一个或多个镜像文件标签,所述镜像文件用于搭建相应的运行环境如java、python环境,或运行相关的程序。

作为一种可选的实施方式,通过api指定镜像仓库中存在的repo:tag列表,具体的,可以通过registryapi实现对repo:tag列表的指定。

步骤s102:对repo:tag列表中的镜像进行遍历,确认镜像的安全性;

其中,所述步骤s102中还包括:

步骤s1021:下载与repo:tag列表对应的镜像manifest文件到本地;

在具体实施过程中,镜像manifest文件储存在本地的缓存目录中,所述缓存目录可以为一个或多个。

在具体实施过程中,每次下载一个镜像的manifest文件,当所有的镜像manifest文件均下载完成后,所述遍历过程视为完成。

采用上述技术方案,镜像manifest文件数据量小,且与镜像文件具有一一对应的关系,因此下载镜像manifest文件可以提高镜像文件的扫描效率,减少网络流量的消耗。

作为一种可选的实施方式,通过api下载与repo:tag列表对应的镜像manifest文件到本地,具体的,可以通过registryapi实现对镜像manifest文件的下载。

步骤s1022:解析镜像manifest文件;

作为一种可选的实施方式,所述解析镜像manifest文件的步骤包括:

解析镜像manifest文件;

获取镜像层的id列表;

排序组成层链表;

判断层链表中是否为多层,

若为是,则进行下载镜像文件步骤,

若为否,执行步骤s1021,下载repo:tag列表中的另一个对应的镜像manifest文件到本地。

在具体实施过程中,镜像层的id直接从manifest文件的layers字段(层字段)获取。layers字段(层字段)是一个数组,数组的第一个元素是第一层,数组的第二个元素是第二层,依次类推,按照顺序组成层链表。

在具体实施过程中,通过解析镜像manifest文件得到镜像层的id信息,再通过镜像层id信息查询本地缓存,可以获取安装包信息。所述安装包信息为该系统中安装过的程序库(openssl,boost,curl,python2.7...)对应名称+版本的信息的集合。

步骤s1023:核对manifest文件;

作为一种可选的实施方式,所述核对manifest文件的步骤包括:

判断层的安装包信息记录是否存在于缓存数据库中,

若为是,从缓存数据库中获取层的安装包信息,执行步骤s1021,下载repo:tag列表中的另一个对应的镜像manifest文件到本地,

若为否,则下载镜像文件。

在具体实施过程中,所述缓存数据库可以设置在本地计算机或局域网服务器中,当安装包信息记录存在于缓存数据库时,根据安装包信息记录拉取该镜像到本地指定位置。

在具体实施过程中,当安装包信息记录未存在于缓存数据库时,则需要从镜像仓库下载相应镜像文件。

在具体实施过程中,根据层id的信息判断安装包信息记录是否存在于缓存数据库中。

采用上述技术方案,对在缓存数据库中记录过安装包信息的镜像,直接进行拉取,节约了网络流量,提高了扫描效率。

步骤s1024:下载镜像文件;

作为一种可选的实施方式,所述下载镜像文件的步骤包括:

下载镜像层的压缩包到本地;

判断是否下载成功,

若为否,则继续下载镜像层的压缩包,

若为是,则对压缩包进行解压。

在具体实施过程中,所述镜像层的压缩包包括镜像数据、各层的位置数据等。

在具体实施过程中,镜像层的压缩包保存到本地的临时目录。

作为一种可选的实施方式,对镜像层的压缩包下载不成功的次数进行判定,

若不成功次数超过3次,则执行步骤s1021,下载repo:tag列表中的另一个对应的镜像manifest文件到本地,

若不成功次数少于3次,则继续下载镜像层的压缩包。

在具体实施过程中,对下载不成功次数超过3次的镜像文件进行记录,并生成下载失败镜像的记录文件,便于用户查阅并对此类镜像进行手工添加。

采用上述技术方案,跳过不易下载或镜像仓库中不存在的镜像,避免扫描程序进入死循环,保证了扫描过程的稳定可靠,顺利运行。

作为一种可选的实施方式,所述对压缩包进行解压的步骤包括:

判断被解压的指定文件是否存在,

若为是,则对解压后的文件进行扫描,

若为否,则下载repo:tag列表中的另一个对应的镜像manifest文件到本地。

步骤s1025:对镜像文件的数据进行扫描。

作为一种可选的实施方式,所述对镜像文件的数据进行扫描的步骤包括:

逐行扫描解压后的文件,

执行步骤s1021,下载repo:tag列表中的另一个对应的镜像manifest文件到本地。

作为一种可选的实施方式,逐行扫描解压后的文件后,执行步骤s1021之前,还包括如下步骤:

获取层的安装包信息,

在缓存数据库中存放层的安装包信息,

采用上述技术方案,通过更新缓存数据库中的层的安装包信息,使缓存数据库更为完善,减少了镜像文件的重复下载,提高了扫描效率。

基于同一发明构思,本发明提供了一种镜像安装包信息的扫描设备,所述设备包括:

处理器;

存储装置,用于存储一个或多个程序;

所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现上述的扫描方法。

基于同一发明构思,本发明提供了一种存储介质,所述存储介质包括一个或多个程序,所述一个或多个程序可以被处理器执行以完成上述的扫描方法。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。

应当理解,本申请实施例中,从权、各个实施例、特征可以互相组合结合,都能实现解决前述技术问题。

所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。

对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1