一种Docker镜像安全性检测方法
文献发布时间:2023-06-19 12:14:58
技术领域
本发明涉及容器技术应用技术领域,特别是涉及一种用于检测用户端Dockerfile文件及镜像的安全性,及时发现存在问题的Dockerfile文件及存在高危漏洞的Docker镜像,保障用户待使用镜像的安全性,降低容器使用时面临的入侵风险的Docker镜像安全性检测方法。
背景技术
Docker是一个开源的基于轻量级虚拟化技术的容器引擎项目,目前Docker已经广泛应用到了云计算领域,随着Docker平台不断的完善和发展,已经出现了Docker生态圈。Docker轻量化的实现离不开镜像、容器和仓库这三个部分。其中,镜像是容器运行的基石,镜像中包含了用户需要的应用程序及其环境依赖。镜像是一种分层结构,一个Docker镜像通常由多个可读的镜像层组成。在Docker官方镜像仓库Docker Hub中存放着大量官方及个人发布的镜像文件供Docker用户使用。另外,镜像是一个只读文件,在使用中用户可以使用同一镜像创建出多个容器。Docker镜像的出现极大的简化了开发人员的工作,开发人员可以方便的通过Docker镜像快速搭建项目环境,也可以将自己的容器环境打包成镜像实现共享,极大的简化了项目环境的搭建和共享。
Docker构建镜像的方式有通过Dockerfile构建、基于已有容器构建和基于模板构建这三种方式,构建流程如图4所示。Dockerfile是由一组指令组成的文本文件,它的基本结构包括基础镜像信息、维护者信息、镜像操作指令和容器启动时执行命令四个部分。通过Dockerfile创建镜像的过程中每条指令的执行都会在本地创建出一个新的镜像层,新构建的镜像层会被自动缓存以备后续重复使用,只有生成镜像层的指令在Dockerfile中发生改变时缓存才会失效,对于整个镜像来说,一旦整个镜像中某层镜像缓存失效,那么此层之上的镜像层会全部失效,当Dockerfile中命令执行完毕后,镜像就完成了创建。基于已有容器的镜像构建过程需要保证已经从镜像库中下载镜像并且实例化出容器,然后通过dockercreate命令指定要创建镜像的容器,紧接着通过docker commit命令提交创建镜像的名称。最后,基于模板的构建方式是通过加载模板库中镜像对应的tar文件实现镜像的创建,Docker也支持通过docker save命令将镜像以tar包的方式保存为模板。其中,通过已有容器和模板构建的镜像安全性依赖原有镜像。
但是在使用Docker时,我们通常会选择从Docker官方镜像仓库中下载已有镜像,这些镜像可能来自于软件官方组织,也可能来自组织和个人,默认情况下,Docker官方并不会对从仓库中下载的镜像进行安全检测,这就使得用户无法确定下载的镜像中是否存在漏洞以及他人恶意植入的后门程序,使得恶意用户可以通过发布存在漏洞的镜像实现对使用者的攻击。以Docker官方提供的镜像仓库Docker Hub为例,2015年Banyan Security选取了仓库中75个官方镜像库共960个独立镜像的1600个版本进行实验。实验结果如附图5所示,在所有官方镜像中,超过三分之一的镜像具有高危漏洞,近三分之二具有中高危漏洞,并且这些镜像都具有较高的下载量。除官方镜像库外,他们还随机选取了Docker Hub中约十万个通用镜像库中的1700个镜像进行了漏洞扫描,实验结果如附图6所示,最终得出通用镜像库漏洞百分比明显高于官方镜像库的结论。
虽然作为现有技术的中国专利CN108958890A-容器镜像检测方法、装置及电子设备,公开了容器镜像检测和评估安全性,中国专利申请CN108154035A,名称为大规模网站漏洞扫描方法、装置及电子设备,公开了本地文件镜像用于漏洞检测,但是都难以克服从Docker官方镜像仓库中下载已有镜像,存在中、高风险的中危漏洞和高危漏洞。
发明内容
为了克服上述现有技术的不足,本发明提供了通过对创建Docker镜像的Dockerfile合法性进行检测以及对用户下载的Docker镜像进行漏洞检测与评估,及时发现存在安全问题的Dockerfile和Docker镜像,保障用户主机中镜像的安全性的一种Docker镜像安全性检测方法。
本发明所采用的技术方案是:一种Docker镜像安全性检测方法,包括如下步骤:
S1,生成初始检测对象文件:通过脚本获取用户主机中包含的Dockerfile文件及容器镜像信息生成初始检测对象文件;
S2,图结构数据样本组建,并且生成图节点样本:先提取初始检测对象文件中的Dockerfile文件结构信息,然后再提取各Dockerfile文件结构信息中代码样本的语义特征,并且将代码样本转化为图结构数据样本,随后生成图节点样本;
S3,从生成图节点样本中进行节点特征提取;
S4,将步骤S3中提取的节点特征与将提取的节点特征与安全docker镜像库内的安全docker镜像的Dockerfile文件的节点特征进行相似度匹配以及分类:
在分类时,若处于训练阶段,将从图节点提取的节点特征按照风险等级匹配并且分类,分类结果存储为风险Docker镜像特征库以及安全Docker镜像特征库;训练时的风险等级可以手动分类以及标记,也可以按照漏洞检测风险评价等级进行标记,可以按照用户需求手动或者预定自动标记;
在分类时,若处于检测阶段:
先将从图节点提取的节点特征与训练阶段得到的风险Docker镜像特征库以及安全Docker镜像特征库内的节点特征按照相似度分别进行对比;
如果与安全Docker镜像特征库内的节点特征按照相似度高的Dockerfile文件,则使用该Dockerfile文件生成安全Docker镜像,录入安全Docker镜像特征库,否则执行下一步;
如果与风险Docker镜像特征库内节点特征相似度达到预定要求的Dockerfile文件,提示是否删除对应不安全代码块,并且拒绝用户通过该Dockerfile文件生成对应镜像,形成安全Docker镜像特征库,否则录入安全Docker镜像特征库,保障新生成镜像的安全性。
进一步地,步骤S3和步骤S4在执行时,使用基于图卷积的深度神经网络模型处理Dockerfile文件的图节点样本,对图节点样本数据进行特征提取和分类;
并且深度神经网络模型通过图卷积得到每个图节点样本的固定数量维数的表示,然后通过池化图中所有节点得到整个图节点样本的表示。
进一步地,步骤S3中为了完整地获得Dockerfile文件中命令的结构信息,步骤S3采用Dockerfile文件命令的控制流图作为图神经网络的输入,同时对提取节点特征的基本命令块进行预先训练和初始化,最后将处理后的命令块放回到控制流图中,生成图结构数据样本。
进一步地,步骤S4在训练阶段的分类按照步骤S8执行,步骤S8是将从步骤S3中提取的节点特征进行风险分类;
风险分类标记为安全的Dockerfile文件,建立安全Docker镜像,并且存储在安全Docker镜像库供调用;
风险分类标记为安全的Dockerfile文件,建立安全Docker镜像,并且建立风险Docker镜像,并且存储在风险Docker镜像库供调用。
进一步地,所述Docker镜像安全性检测方法,还包括如下步骤:
S5,收集步骤S1的容器镜像信息,去除无用参数信息后使用镜像扫描工具Anchore获取容器镜像中包含的漏洞信息;
S6,将S5中收集的漏洞信息通过通用漏洞评分系统,得到每个漏洞的危险性评分和危险等级;
S7,计算平均危险性评分和各危险等级漏洞的占比,实现容器镜像危险性评估。
进一步地,所述Docker镜像安全性检测方法还依次包括:
获取镜像信息:从本地直接获取本地镜像或者获取安全Docker镜像库的镜像,并且提取得到镜像名和标签,作为输出镜像信息;
镜像漏洞扫描:从上述获取的输出镜像信息输入至镜像漏洞扫描工具进行扫描、漏洞信息查询,随后输出所有安全漏洞CVE_ID;
判断本地漏洞库是否存在漏洞:如果否,则依次执行计算漏洞评分、镜像整体评估,如果是则直接镜像整体评估;
判断镜像整体评估是否存在风险,如果是则删除镜像,并且提示是否删除代码。
进一步地,判断漏洞库是否存在漏洞步骤,需要先评估每一个安全漏洞,再进行整体评估,评估结束后输出至本地安全漏洞库;
本地安全漏洞库存储安全漏洞评估结果以及存储镜像评估结果。
进一步地,步骤S7中,若平均危险性评分大于0.5,则认为容器镜像危险;实际使用中用户也可以根据总危险性评分、各危险等级漏洞的占比等灵活配置评估策略。
与现有技术相比,本发明的有益效果是:
1、在使用Dockerfile构建Docker镜像前对Dockerfile文件进行检测,提高了新创建镜像的安全性。
2、将Dockerfile的合法性检测与Docker镜像漏洞检测与评估相结合,保障用户主机中镜像的安全。
3、有效解决了镜像传输过程中面临的中间人攻击问题,Docker镜像安全性检测技术通常用于Docker远程仓库中,在镜像上传和下载时检测镜像的安全性,并且解决了镜像在传输过程中可能被替换一些数据,即存在中间人攻击的可能性的问题,保证了Docker远程仓库的安全性能。
综上所述,本发明的Docker镜像安全性检测方法,针对Dockerfile的安全检测实现了在镜像生成前发现待生成镜像存在的安全风险,针对镜像的安全检测实现了已有镜像的安全性检测,增强了Docker镜像安全性。
附图说明
图1为Docker镜像安全性检测的镜像安全检测阶段流程图;
图2为Docker镜像安全性检测的镜像安全训练阶段流程图;图3为Docker镜像安全性检测用于评估安全性能的流程图;
图4为Docker镜像安全性检测和本地镜像漏洞检测联合用于评估安全性能的流程;
图5为Docker构建镜像的流程图;
图6为以Docker官方提供的镜像仓库Docker Hub的实验结果对比图;
图7为官方镜像和Docker Hub通用镜像库漏洞扫描实验对比图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。
在本发明的描述中,需要理解的是,术语“中心”、“上”、“下”、“前”、“后”、“左”、“右”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的组合或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。另外,本发明实施例的描述过程中,所有图中的“上”、“下”、“前”、“后”、“左”、“右”等器件位置关系,均以图1为标准。
如图1所示,一种Docker镜像安全性检测方法,包括如下步骤:
S1,生成初始检测对象文件:通过脚本获取用户主机中包含的Dockerfile文件及容器镜像信息生成初始检测对象文件;在实施时,通过脚本执行Docker ps命令获取容器镜像信息,按照需求去除无用信息,仅保留镜像名和标签,紧接着将镜像名和标签进行拼接并与本地镜像库文件进行比较,判断是否存在,如果不存在,则将其存储到本地镜像文件库,本次采集结束。同样,我们也通过脚本获取Dockerfile文件位置信息。
图结构数据样本组建前,可以先初始化图节点信息,具体的初始过过程为:
对步骤S1中收集的Dockerfile文件进行处理,首先根据Dockerfile文件所具有的特点(Dockerfile可以生成多个镜像层,每个镜像层在Dockerfile文件中都对应相应的基础镜像信息、维护者信息、镜像操作指令和启动时执行命令),提取Dockerfile文件的结构信息,将每个镜像层对应Dockerfile文件中的指令视为图结构中的一个数据节点,初始化图节点信息,当Dockerfile文件中所有镜像层对应指令初始化图节点信息完毕后,就得到了一个完整的图结构数据。
S2,图结构数据样本组建,并且生成图节点样本:先提取初始检测对象文件中的Dockerfile文件结构信息,然后再提取各Dockerfile文件结构信息中代码样本的语义特征,并且将代码样本转化为图结构数据样本,随后生成图节点样本;
S3,从生成图节点样本中进行节点特征提取;
S4,将步骤S3中提取的节点特征与将提取的节点特征与安全docker镜像库内的安全docker镜像的Dockerfile文件的节点特征进行相似度匹配以及分类:
在分类时,参见图2所示,若处于训练阶段,将从图节点提取的节点特征按照风险等级匹配并且分类,分类结果存储为风险Docker镜像特征库以及安全Docker镜像特征库;训练时的风险等级可以手动分类以及标记,也可以按照漏洞检测风险评价等级进行标记,可以按照用户需求手动或者预定自动标记;
在分类时,参见图1,若处于检测阶段:
先将从图节点提取的节点特征与训练阶段得到的风险Docker镜像特征库以及安全Docker镜像特征库内的节点特征按照相似度分别进行对比;
如果与安全Docker镜像特征库内的节点特征按照相似度高的Dockerfile文件,则使用该Dockerfile文件生成安全Docker镜像,录入安全Docker镜像特征库,否则执行下一步;
如果与风险Docker镜像特征库内节点特征相似度达到预定要求的Dockerfile文件,提示是否删除对应不安全代码块,并且拒绝用户通过该Dockerfile文件生成对应镜像,形成安全Docker镜像特征库,否则录入安全Docker镜像特征库,保障新生成镜像的安全性。
更优地,步骤S3和步骤S4在执行时,使用基于图卷积的深度神经网络模型处理Dockerfile文件的图节点样本,对图节点样本数据进行特征提取和分类;
并且深度神经网络模型通过图卷积得到每个图节点样本的固定数量维数的表示,然后通过池化图中所有节点得到整个图节点样本的表示。
更优地,步骤S3中为了完整地获得Dockerfile文件中命令的结构信息,步骤S3采用Dockerfile文件命令的控制流图作为图神经网络的输入,同时对提取节点特征的基本命令块进行预先训练和初始化,最后将处理后的命令块放回到控制流图中,生成图结构数据样本。
具体的实施过程中,步骤S3中生成的图节点样本包括提取的Dockerfile中每个镜像层创建时所需的基础镜像信息、维护者信息、镜像操作指令和启动时执行命令,形成一个完整的图结构数据样本中的一个图节点样本。
更优的实施方式,见图2,步骤S4在训练阶段的分类按照步骤S8执行,步骤S8是将从步骤S3中提取的节点特征进行风险分类;
风险分类标记为安全的Dockerfile文件,建立安全Docker镜像,并且存储在安全Docker镜像库供调用;
风险分类标记为安全的Dockerfile文件,建立安全Docker镜像,并且建立风险Docker镜像,并且存储在风险Docker镜像库供调用。在分类时,获得图节点样本中所有节点特征的表示向量,然后通过池化图中所有节点的表示向量得到整个图节点样本的表示,使用多组基本单元抽取图结构中每个节点在不同层次上的特征,多个基本单元之间以直接串联或残差方式连接,最后通过多层感知获得图节点样本的分类,进而实现对Dockerfile文件的分类。
更优的实施方式,参见图5,所述Docker镜像安全性检测方法还包括如下步骤,从而实现对容器镜像的危险性进行准确地评估,提高其安全检测的准确率:
S5,收集步骤S1的容器镜像信息,去除无用参数信息后使用镜像扫描工具Anchore获取容器镜像中包含的漏洞信息;
S6,将S5中收集的漏洞信息通过通用漏洞评分系统,得到每个漏洞的危险性评分和危险等级;
S7,计算平均危险性评分和各危险等级漏洞的占比,实现容器镜像危险性评估。
更优地,如图4所示,所述Docker镜像安全性检测方法还依次包括:
获取镜像信息:从本地直接获取本地镜像或者获取安全Docker镜像库的镜像,并且提取得到镜像名和标签,作为输出镜像信息;
镜像漏洞扫描:从上述获取的输出镜像信息输入至镜像漏洞扫描工具进行扫描、漏洞信息查询,随后输出所有安全漏洞CVE_ID;镜像漏洞扫描可以通过漏洞检测工具Anchore检测步骤一中收集的镜像,针对每个镜像,提取出每个镜像层中安装的所有软件包版本信息和操作系统作为元数据,然后将收集到的镜像元数据与软件包漏洞信息进行比较,获取镜像中已知的不安全漏洞信息。
判断本地漏洞库是否存在漏洞:如果否,则依次执行计算漏洞评分、镜像整体评估,如果是则直接镜像整体评估;
判断镜像整体评估是否存在风险,如果是则删除镜像,并且提示是否删除代码。镜像漏洞评估阶段主要目的是对镜像漏洞检测阶段获取的漏洞进行评估,为每个漏洞进行评分。我们使用CVSS对所有漏洞进行评估,在评估的过程中,我们参照用户设置的漏洞白名单,筛除不参与镜像评估的漏洞,并且在对每个漏洞进行评估之前,我们首先会对比本地漏洞库,查找本地漏洞库中是否包含该漏洞信息,如果包含且该漏洞数据更新时间在规定时间内,则从本地库中直接获取评分结果,否则使用CVSS对漏洞进行评分,并将结果同步到本地漏洞库。
镜像安全性评估得到镜像中每个漏洞的信息和评分后,我们会统计镜像中漏洞总数量、各个危险等级漏洞所占漏洞比例以及漏洞评分总和。默认情况下,我们将漏洞平均得分是否大于0.5作为镜像是否安全的评判标准,实际使用中用户可以配置自己的评估策略。另外,在镜像评估结束后,我们会将漏洞信息、漏洞评分和镜像整体评估结果存储在本地漏洞库即CVE库中。
更优地,判断漏洞库是否存在漏洞步骤,需要先评估每一个安全漏洞,再进行整体评估,评估结束后输出至本地安全漏洞库;
本地安全漏洞库存储安全漏洞评估结果以及存储镜像评估结果。
更优地,步骤S7中,若平均危险性评分大于0.5,则认为容器镜像危险;实际使用中用户也可以根据总危险性评分、各危险等级漏洞的占比等灵活配置评估策略。
本发明的实施例公布的是较佳的实施例,但并不局限于此,本领域的普通技术人员,极易根据上述实施例,领会本发明的精神,并做出不同的引申和变化,但只要不脱离本发明的精神,都在本发明的保护范围内。
- 一种Docker镜像安全性检测方法
- 一种动静态结合的Docker容器内容安全性检测方法和装置