掌桥专利:专业的专利平台
掌桥专利
首页

一种镜像成分的分析方法、系统及存储介质

文献发布时间:2023-06-19 16:04:54



技术领域

本申请涉及软件分析的领域,尤其是涉及一种镜像成分的分析方法、系统及存储介质。

背景技术

容器是新时代发展的趋势下所出现的产物,容器具有高可用低成本的特点。容器基于镜像创建的, 即容器中的进程依赖于镜像中的文件。而在开源风险和安全风险横行的当下,针对容器目前的主要风险,在于使用第三方组件存在安全风险以及容器自身组件存在缺陷。因此,需要对容器进行分析以获知其组件。

目前,常用的检测技术是sca(软件成分分析),然而sca的检测对象一般是代码或者文件,其通过对代码和文件做解压缩,然后通过源于语义的模型训练得到的对象,作为代码或者文件特征,进行提取。而针对容器实际上需要获取的是其容器整体,即由多个组件构成的一个虚拟环境中的完整组件信息而非代码,使用传统SCA对容器进行分析,会出现传统sca将容器拆分成一个个单独的个体,再对个体进行分析的情况,导致无法进行完整和准确地检测容器组件。

发明内容

为了获取镜像中的组件信息,本申请提供一种镜像成分的分析方法、系统及存储介质。

第一方面,本申请提供一种镜像成分的分析方法,采用如下的技术方案:

一种镜像成分的分析方法,包括以下步骤:

获取镜像文件;

查询出多个按照预设顺序排列在镜像文件中的哈希值,每个哈希值对应镜像文件中的一个镜像层级,且按照哈希值所排列的预设顺序将对应的镜像层级分别定义为0层、1层、...、M层,其中,M为正整数且至少为1;

依次从镜像文件中匹配出与哈希值一一对应的镜像层级的层级信息;

在0层中添加预设脚本,其中,所述预设脚本包含用于查询层级中组件信息的第一查询脚本;

将0层分别与其他层级两两挂载以分别形成多个临时镜像,其中,临时镜像中0层为底层,并命名处在0层上方的层级为新增层;

通过第一查询脚本调用包管理器以获取临时镜像中新增层的组件信息,并将组件信息添加到新增层,其中,组件信息包括组件名称、组件许可证、版本;

取消层级挂载后从新增层中读取组件信息;

将组件信息作为结果信息并输出结果信息。

通过采用上述技术方案,通过将层级信息重新组合两两挂载的镜像,通过内部查询的方式获取组件信息并存储到层级目录中,然后在通过外部读取以获取到组件信息,实现对于镜像的成分分析。

可选的,获取临时镜像中新增层的组件信息,包括以下步骤:

获取临时镜像的所有数据集合;

从临时镜像的所有数据集合中去除预设的基础数据,剩余的数据作为新增层的软件信息,其中,所述预设的基础数据存储在查询脚本中。

可选的,输出结果信息前,还包括以下步骤:

比较n层的组件信息与n+1层的组件信息,以得到n+1层对应的组件增减信息,其中初始时n=0;

获取n+1层的组件增减信息后,判断n+1是否等于L,

若n+1不等于L,则n=n+1,并再次比较n层的组件信息与n+1层的组件信息以获取当前n+1层对应的组件增减信息;

若n+1等于L,则将所有层级所对应的组件增减信息添加到结果信息中。

可选的,所述查询脚本还包括用于根据所输入的变量来查询该变量所对应的依赖关系的第二查询脚本;

从新增层中读取组件信息后,还包括以下步骤:

将组件名称作为变量输入到第二查询脚本中,并通过第二查询脚本获取与各个组件名称所对应的依赖关系;

将各个组件名称对应的依赖关系添加到结果信息中。

可选的,将组件名称作为变量输入到第二查询脚本中,并通过第二查询脚本获取与各个组件名称所对应的依赖关系,包括以下步骤:

在取消挂载后,将用于表征组件名称的变量传输到0层的预设脚本中;

再次将0层和新增层两两联合挂载,第二查询脚本通过调用包管理器获取与变量所表征的组件名称相对应的依赖关系,并将依赖关系存储在新增层中;

再次取消挂载后,读取出新增层中的依赖关系。

可选的,获取镜像文件,包括以下步骤:

获取镜像名称,判断本地镜像仓库中是否存在名称与输入的镜像名称一致的镜像文件,

若本地镜像仓库中存在名称与输入的镜像名称一致的镜像文件,则调用该镜像文件;

若本地镜像仓库中不存在名称与输入的镜像名称一致的镜像文件,则判断远程镜像仓库中是否存在名称与输入的镜像名称一致的镜像文件,

若远程镜像仓库中存在名称与输入的镜像名称一致的镜像文件,则将对应镜像文件的信息拉取到本地镜像仓库中;

若远程镜像仓库中不存在名称与输入的镜像名称一致的镜像文件,则报错。

可选的,若本地镜像仓库存在名称一致的镜像文件,或远程镜像仓库存在名称一致的镜像文件,还包括以下步骤:

获取名称一致的镜像文件的标识码;

判断标识码是否与预设码一致,

若标识码与预设码不一致,则认为对应的镜像仓库中不存在名称一致的镜像文件;

若标识码与预设码一致,则认为对应的镜像仓库中存在名称一致的镜像文件。

可选的,将预设脚本置入0层后,还包括以下步骤:

通过预设脚本中预设的多个关键词在0层系统基础信息中进行匹配,并根据存在匹配一致的关键词确定当前镜像的操作系统,其中,预设脚本中所预设的关键词分别对应一个操作系统;

预设脚本在联合挂载时调用该操作系统所对应的包管理器。

第二方面,本申请提供一种镜像成分的分析系统,采用如下的技术方案:

一种镜像成分的分析系统,包括以下模块:

匹配模块,用于根据用户输入的镜像名称从镜像仓库中匹配出对应的镜像文件;

分层模块,用于从镜像文件中查询出与层级一一对应的哈希值,并根据哈希值获取对应层级的层级信息;其中,处在镜像文件最底层的层级为0层。

置入模块,用于将预设脚本添加到0层中;

挂载模块,用于将0层的层级信息与其他层级的层级信息两两组合挂载到一起以形成临时镜像,

运行模块,用于运行临时镜像形成的容器;

解体模块,用于取消运行过的临时镜像的挂载,以输出新增层和0层;

处理模块,用于对解体模块中输出的新增层进行数据读取及处理,输出组件信息。

输出模块,用于将组件信息作为结果信息输出。

第三方面,本申请提供一种计算机可读存储介质,存储有能够被处理器加载并执行上述任一种镜像成分的分析方法的计算机程序。

综上所述,本申请包括以下至少一种有益技术效果:通过将层级信息重新组合两两挂载的镜像,通过内部查询的方式获取组件信息并存储到层级目录中,然后在通过外部读取以获取到组件信息,实现对于镜像的成分分析。

附图说明

图1是本申请实施例的步骤流程图。

图2是本申请实施例的获取镜像文件的逻辑图。

具体实施方式

以下结合附图1至图2对本申请作进一步详细说明。

一种镜像组件的检测方法,参见图1,包括以下步骤:

S100、获取镜像文件。

获取镜像文件的方式包括直接获取和间接获取。

其中,直接获取方式则是由用户直接将需要检测的镜像文件通过上传、拖动等方式存放到本地镜像仓库中。

间接获取方式是获取用户所输入的镜像名称,再基于镜像名称匹配出预存的镜像文件。

实际中,用户输入的内容不局限于镜像名称,用户也可以输入镜像的标签或是将镜像标签和镜像名称一同输入。但无论哪一种输入内容,其所对应的匹配方式是类似的,在本实施例中,仅以镜像名称作为输入内容为例进行具体介绍。

基于镜像名称匹配出预存的镜像文件这一操作是由Docker守护进程进行的。

Docker守护进程在获取用户输入的镜像名称后,根据镜像名称在镜像仓库中匹配名称一致的镜像文件。

在一个实施例中,基于镜像名称匹配出预存的容器镜像,参见图2,包括以下步骤:

S110、判断本地镜像仓库中是否存在名称与输入的镜像名称一致的镜像文件。

S120、若本地镜像仓库中存在名称与输入的镜像名称一致的镜像文件,则对本地镜像仓库中名称与输入的镜像名称一致的镜像文件执行步骤200。

S130、若本地镜像仓库中不存在名称与输入的镜像名称一致的镜像文件,则判断远程镜像仓库中是否存在名称与输入的镜像名称一致的镜像文件。

镜像仓库包括本地镜像仓库和远程镜像仓库,在根据镜像名称获取相应的镜像文件时,Docker守护进程优先在本地镜像仓库中检索是否存在名称一致的镜像文件。而当本地镜像仓库中不存在名称一致的镜像文件时,Docker守护进程再在远程镜像仓库中检索是否存在名称一致的镜像文件。

远程镜像仓库默认为公有的Docker仓库(Docker hub)。当然,用户也可以根据实际情况将远程镜像仓库定义为其他的Docker仓库。

S140、若远程镜像仓库中存在名称与输入的镜像名称一致的镜像文件,则将对应镜像文件的信息拉取到本地镜像仓库中。

当远程镜像仓库中存在名称与输入的镜像名称一致的镜像文件时,Docker守护进程会将对应的镜像文件的信息拉取到本地镜像仓库中。

S150、若远程镜像仓库中不存在名称与输入的镜像名称一致的镜像文件,则报错。

若Docker守护进程从两个镜像仓库中均无法检索出名称一致的镜像文件,则Docker守护进程报错以提醒用户注意输入的镜像名称是否有误。

另外,由于镜像文件在完成创建后,若对镜像文件的内容做了改动而镜像名称未变化,那么直接以镜像名称来匹配镜像文件,最终得到的镜像文件很可能并不是用户实际所需要的,因此,在以镜像名称进行匹配的基础上还可以进一步对镜像文件是否被篡改进行检验。

具体的,若本地镜像仓库存在名称一致的镜像文件,或远程镜像仓库存在名称一致的镜像文件,包括以下步骤:

S131、获取名称一致的镜像文件的标识码。

标识码是指整个镜像文件所对应的哈希值,具体的,标识码可以是通过MD5/MD4算法对整个镜像文件进行计算而得出的MD值,也可以是通过SHA-1算法对整个镜像文件进行计算而得出的sha值,本实施例中以标识码值为sha值为例。

需注意的是,获取存储在本地镜像仓库的镜像文件的标识码的方式,和获取存储在远程镜像仓库中的镜像文件的标识码的方式是不同的。对于本地镜像仓储中的镜像文件,Docker守护进程会记录该镜像文件是否被更改,只要Docker守护进程不提示该镜像文件被修改,那么在该镜像文件创建时所记录的sha值可以直接被当成标识码来进行使用。而对于存储在远程镜像仓库的镜像文件,其是否被修改并不一定得到有效监控,因此,在名称匹配一致的情况下,先将镜像文件拉取到本地镜像仓库后,计算出其对应的sha值,并将该sha值作为标识码。也正是由于检验存储在远程镜像仓库的镜像文件是否被篡改这一步骤更加繁琐,因此设定Docker守护进程会优先在本地镜像仓库中匹配镜像文件。

S132、判断标识码是否与预设码一致。

预设码是指镜像文件在本地创建完成后所记录的sha值。

当镜像文件的内容发生任何改变的时候,其对应的sha值就会出现对应的调整,因此将标识码与预设码做比较,就可以判断出镜像文件是否发生改变。

S133、若标识码与预设码不一致,则认为对应的镜像仓库中不存在名称一致的镜像文件。

当认为对应的镜像仓库中不存在名称一致的镜像文件,根据镜像仓库的不同执行不同的步骤。当镜像仓库为本地镜像仓库时,则执行步骤S140;当镜像仓库为远程镜像仓库时,则同步骤S150一样进行报错。

S200、查询出多个按照预设顺序排列在镜像文件中的哈希值,每个哈希值对应镜像文件中的一个镜像层级,且按照哈希值所排列的预设顺序将对应的镜像层级分别定义为0层、1层、...、M层,其中,M为正整数且至少为1。

本实施例中的哈希值是指镜像文件中各个层级中所对应文件的sha值。不同层级对应不同的sha值。

查询哈希值的方式是通过Docker守护进程查询镜像文件的main文件以获取记录镜像中各个层级对应的哈希值的清单文件。

该清单文件中存储有各个层级的哈希值,且这些哈希值的排列方式与哈希值所对应的层级在镜像中的排列方式有关,例如,镜像中,0层是最底层,1层叠加在0层上方,2层叠加在1层上方,那么在清单文件中,0层对应的哈希值就排在1层对应的哈希值的前面,2层对应的哈希值排在1层对应的哈希值的后面。

根据获取到的哈希值的个数即可确定该镜像中的层级数量,并且这些哈希值也具有对镜像层级之间的位置关系起到定位的作用。

S300、依次从镜像文件中匹配出与哈希值一一对应的镜像层级的层级信息。

分别以不同层级的哈希值从容器镜像中确定对应层级的压缩包,再将层级的压缩包分别进行解压还原,以输出多个层级信息,每个层级信息包含该层级所对应镜像层的所有文件。

S400、在0层中添加预设脚本。

预设脚本包含用于查询层级中组件信息的第一查询脚本以及用于确定镜像对应操作系统的第三查询脚本。

并且在预设脚本植入到0层后,第三查询脚本对0层etc目录下os-release文件中所存储的系统基本信息进行查询,第三查询脚本通过以关键字检索的方式从os-release文件中确定镜像对应的操作系统,关键字为特定的系统名称,如centos,redhat等。

而第一查询脚本则是在步骤S500中用于查询各个层级的组件信息。

S500、将0层分别与其他层级两两挂载以分别形成多个临时镜像。

其中,临时镜像中0层为底层,并命名处在0层上方的层为新增层。

通过将新增层挂载到0层上方形成临时镜像,运行临时镜像就形成相应的容器。而根据容器特性,处在容器最上方的层级,也就是新增层,是具有读写功能,而处在新增层下方的0层是处在只读模式。

S600、通过第一查询脚本调用包管理器以获取临时镜像中新增层的组件信息,并将组件信息添加到新增层。

组件信息包括组件名称、组件的许可证、组件的版本。

包管理器需要在镜像运行过程中才能查询容器中的信息,而容器运行时与外部环境隔离,导致信息在容器外部和容器内部无法传递。

因此,在临时镜像运行过程中,需要由预设在0层中的第一查询脚本来调动包管理器,并在包管理器查询到新增层的组件信息后,将组件信息存储到新增层中。在取消联合挂载后,读取新增层即可获取组件信息。

具体的,获取临时镜像中新增层的组件信息,包括以下步骤:

S510、获取临时镜像的所有数据集合。

通过步骤S400中确定的操作系统运行临时镜像,添加到0层的第一查询脚本调用该操作系统中的包管理器。通过包管理器进行软件管理,获取到临时镜像的所有数据集合。

S520、从临时镜像的所有数据集合中去除预设的基础数据,剩余的数据作为新增层的软件信息。

预设的基础数据预先存储在查询脚本中。预设的基础数据为0层的组件信息,由于0层的构建基本固定,其软件信息属于已知的。

另外,若0层的软件信息是未知或是不确定的,还可以在构建临时镜像时,选择使用预设的基础层来替代从镜像中识别出的0层,从而确保临时镜像中0层的软件信息无误。

需注意的是,从获取的所有数据集合中去除原本0层的软件信息所得到的是新增层的软件信息,而软件信息并不是新增层的组件信息。从软件信息到组件信息,还需要进一步对软件信息进行处理。并且在对软件信息进行处理前,为了方便后续读取软件信息,预设脚本将软件信息存储在新增层的原始目录中。

S700、取消层级挂载后从新增层中读取组件信息。

在取消挂载后,从新增层中读取出相应的软件信息,并将软件信息传递给到预设的脚本处理,以从中获取组件名称、组件版本、组件许可证等组件信息。

需注意的是,当操作系统是非rpm管理类系统时,例如ubuntu、debian,无法直接查询到组件许可证。那么在获取组件名称后,通过组件名称定位对应许可证的位置,从而将许可证信息存放到新增层的目录中以便于后续从新增层中读取许可证信息,该操作与其余组件信息的获取方法相同。

S800、将组件信息作为结果信息并输出结果信息。

结果信息以预设的显示方式向用户显示,预设的显示方法可以是显示在指定显示屏上、传输到指定邮箱中、以短信息发送到指定手机上等等方法中的一种或多种。

进一步的,该检测方法还能够查询层级所对应组件的增减信息,以清楚展示整个镜像的形成过程。

查询层级所对应组件的增减信息的具体方法为:

S710、依次比较n层的组件信息与n+1层的组件信息,以得到n+1层对应的组件增减信息,其中n=0。

比较方法是由预设脚本以n层的组件信息和n+1层的组件信息作为输入来调用包管理器,包管理器输出n+1层所对应的组件增减信息。

组件增减信息是指当前的n+1层级相较于n层级增加和减少的组件信息。

S720、获取n+1层的组件增减信息后,判断n+1是否等于L。

S730、若n+1不等于L,则n=n+1,并再次比较n层的组件信息与n+1层的组件信息。

判断n+1是否等于L,是为了判断是否所有层级都完成了组件增减信息的查询。若n+1不等于L,则表明还有其他的层级需要查询组件增减信息。则将n+1的值赋予n,再重复执行步骤S720至步骤S730。

S740、若n+1=L,则将所有层级对应的组件增减信息添加到结果信息中。

实际中,对于层级中组件增减信息的查询方法并不局限于上述的方式,也可以统一将所有层级以相邻且两两组合的方式先依次排列组合出来,然后在由Docker守护进程通过diff命令依次获取组件增减信息。只要最终能够获取所有层级对应的组件增减信息即可。

进一步的,在获取到各个层级的组件信息后,检测方法还可以根据组件信息获取组件之间的依赖关系,为了实现依赖关系的查询,查询脚本还包括用于根据所输入的变量来查询该变量所对应的依赖关系的第二查询脚本。

查询依赖关系的具体方法如下:

S750、将组件名称作为变量输入到第二查询脚本中,并通过第二查询脚本获取与各个组件名称所对应的依赖关系。

组件名称是在步骤S700中获取的,因此查询依赖关系必须在获取组件信息之后进行。每次只能选择一个组件名称作为变量输入到第二查询脚本中,再获取该组件名称对应的依赖关系后,再选择其他的组件名称以替换第二查询脚本中的变量,从而获取每个组件所对应的依赖关系。

S760、将各个组件名称对应的依赖关系添加到结果信息中。

在一个实施例中,将组件名称作为变量输入到第二查询脚本中,并通过第二查询脚本获取与各个组件名称所对应的依赖关系,包括以下步骤:

S751、在取消挂载后,将用于表征组件名称的变量传输到0层的预设脚本中。

取消临时容器中层级之间的挂载,使得0层重新独立,通过外界脚本将需要查询的组件名称传输到0层中的预设脚本中。

S752、再次将0层和新增层两两联合挂载,第二查询脚本通过调用包管理器获取与变量所表征的组件名称相对应的依赖关系,并将依赖关系存储在新增层中。

为了避免出现第一查询脚本重复查询的情况,预设脚本根据第二查询脚本中是否存在变量来决定当前执行的查询脚本。当第二查询脚本中不存在变量时,运行临时容器的过程中,执行第一查询脚本以获取组件信息;当第二查询脚本中存在变量时,运行临时容器的过程中,执行第二查询脚本以获取变量对应的依赖关系。

S753、再次取消挂载后,读取出新增层中的依赖关系。

本申请实施例还公开一种镜像成分的分析系统,包括以下模块:

匹配模块,用于根据用户输入的镜像名称从镜像仓库中匹配出对应的镜像文件;

分层模块,用于从镜像文件中查询出与层级一一对应的哈希值,并根据哈希值获取对应层级的层级信息;其中,处在镜像文件最底层的层级为0层。

置入模块,用于将预设脚本添加到0层中;

挂载模块,用于将0层的层级信息与其他层级的层级信息两两组合挂载到一起以形成临时镜像,

运行模块,用于运行临时镜像形成的容器;

解体模块,用于取消运行过的临时镜像的挂载,以输出新增层和0层。

输入模块,用于将组件信息作为变量传输到未进行挂载时的0层中的预设脚本内。

处理模块,用于对解体模块中输出的新增层进行数据读取及处理,输出组件信息、依赖关系、许可证信息以及组件增减信息中的一种或多种。

输出模块,用于将组件信息、依赖关系、组件增减信息等作为结果信息输出。

本申请实施例还公开一种计算机可读存储介质,存储有能够被处理器加载并执行上述一种镜像成分的分析方法的计算机程序。

以上均为本申请的较佳实施例,并非依此限制本申请的保护范围,故:凡依本申请的结构、形状、原理所做的等效变化,均应涵盖于本申请的保护范围之内。

相关技术
  • 一种镜像成分的分析方法、系统及存储介质
  • 一种镜像方法、系统、存储介质及镜像数据的处理方法
技术分类

06120114696161