一种基于区块链的云镜像完整性监测方法

2023-07-13 02:28马威曹刘洋菅朋朋
关键词:镜像文件哈希镜像

马威,曹刘洋,菅朋朋

(1.华北水利水电大学 信息工程学院,郑州 450046;2.重庆理工大学 两江人工智能学院,重庆 401135)

近年来,云计算由于低成本、高可靠、高可用以及弹性可伸缩的优势,在各行各业得到广泛应用[1-2].快速部署是云计算中的关键技术之一,这一技术能够按需动态组织云环境中的软件、硬件资源,同时能及时响应用户动态的、多样化的计算需求.在当前的快速部署技术中,往往需要一个预定义的模板,其中包含了组织好的软件资源,这一模板被称为云镜像.当用户发起部署请求时,快速部署机制能够基于云镜像快速实例化用户所需的云计算资源[3].例如在IaaS(Infrastructure as a Service)中,用户获得的是一个基于模板实例化的虚拟主机;在PaaS(Platform as a Service)中,用户获取的是一个基于模板实例化的容器.快速部署随着这些年来云计算技术自身的发展而发展,如虚拟机克隆技术,能够从运行态的父虚拟机中动态克隆得到一个新的虚拟机[4],或是运用fork函数的思想,利用父虚拟机并行克隆出大量子虚拟机,提高部署效率[5-6];Copy-On-Write技术也被运用在虚拟机的快速部署中,它仅传输模板中需要修改的数据块,因此能够极大提高部署的速度[7-8];有方法进一步将云镜像的存储也分布式化和虚拟化,使用存储池和并行传输来进一步提高部署的速度[3,9-10].

关于快速部署的研究进展主要集中在效率方面[11],即如何使部署速度更快,以便更快捷地响应用户的服务请求,而云镜像则在快速部署中始终扮演不可或缺的核心角色.但是,云镜像往往会成为攻击者的攻击目标.例如篡改云镜像,在其中注入恶意代码,进而构建僵尸网络[12],最近几年中,又频繁出现攻击者篡改云镜像,植入挖矿软件从而获得经济利益的事件[13].因此,对云镜像的保护应当是云计算安全的重要一环.

对云镜像的保护,主要体现在防止云镜像被篡改,即确保云镜像的数据完整性不会遭到破坏.而云计算环境中数据完整性的保护一直是研究重点之一,最普遍采用的方法是使用镜像文件或数据文件的散列值对数据完整性进行监控,但这种传统方法的效率低下,面对云计算环境中海量的镜像数据处理速度无法满足云环境的需求.在使用散列值的基础上,引入了哈希链来确保数据完整性.文献[14-15]使用了哈希链,并结合了其他密码学技术提出了在分布式系统上的证书撤销机制,能够检测到对数据块修改和删除的动机.但是基于哈希链的方法与传统的基于散列值的方法类似,需要大量的验证工作,难以适应数据量巨大的云环境.另一类广泛运用的检测数据完整性的方法是使用Merkel树,Merkel树是一种树形结构,其中每个叶结点是数据块的哈希,每个非叶子结点是其子结点的哈希.文献[16-18]使用Merkel树对云存储中的数据进行了动态验证,文献[19-20]使用Merkel树实现了云数据的保护和验证.相比较于哈希链和传统散列值的完整性验证方法,Merkel树最大的优点在于它可以通过对根节点的单次哈希运算实现对所有叶子节点(即对应的数据)的完整性验证,能够有效提高验证效率,因此Merkel树在完整性验证中有着十分广泛的应用.但是,由于Merkel树是静态构建的,与云计算环境中动态性的要求难以匹配.

近年来,区块链技术的发展为完整性检测提供了新的方法和思路.区块链是随着加密数字货币出现的一种数据结构,具有去中心化、时序性、安全可信等特点[21].在每一个区块中,将不同的事务/交易进行哈希运算后,使用Merkel树的形式进行存储,确保了事务/交易的完整性;使用链式结构将区块进行组织,让信息可以动态追溯.从本质上而言,区块链是一种不可篡改的账本,保障数据完整性的核心内容相匹配,因此区块链在数据完整性保护方面具有很强的研究意义[22].

在本文中,结合区块链技术提出了一种云镜像完整性监测方法.首先,对云环境中可用的云镜像进行哈希运算,形成一棵Merkel树并记录在一个区块中,该Merkel树记录了所有镜像的哈希信息,通过对它根节点的验证即可实现对所有镜像的完整性验证;然后,以一个固定的时间间隔重复上一步,并形成区块链;最后,实时监控最新区块中Merkel树的根节点,发现变化则意味着有镜像的完整性遭到了破坏,进而迅速定位被篡改的镜像文件.方法的创新点主要体现在:(1)引入Merkel树作为存储云镜像完整性信息的静态数据结构;(2)使用区块链机制实现云镜像完整性的动态存证和可追溯;(3)通过实验证明,本文提出的方法能够带来3%以上的性能提升.

1 云镜像完整性问题分析及模型

1.1 问题分析

在云计算环境中,云镜像主要用来快速实例化所需的虚拟机实例,单个云镜像的生命周期如图1所示.

云镜像是云计算快速部署机制的核心.一般情况下,云镜像会集中存储在云镜像服务器中,当收到用户发起的部署请求后,云中的调度机制会寻找有足够空闲资源的主机,然后将相应云镜像复制(全部复制或使用Copy-On-Write机制部分复制)到目标主机,并使用该镜像实例化虚拟机.云镜像也支持云用户之间和云服务提供商之间的共享.此外,云镜像还会根据需求(软件升级、安装补丁等)进行更新.基于某个云镜像实例化的虚拟机,其中必定包含和运行云镜像中预置的软件程序,因此对云镜像进行篡改,在其中注入恶意软件、僵尸程序或挖矿软件,是针对云计算环境的一种有效攻击手段,保护云镜像的完整性至关重要.

1.2 攻击者模型

首先分析攻击者的目的.对于攻击者而言,其目的主要在于:(1)利用云计算平台可观的算力来进行发起于网络内或者网络之间的恶意攻击;(2)浪费云计算资源,直接损害云计算供应商的利益;(3)恶意占用云计算平台算力资源,对云计算用户造成间接的危害;(4)利用云计算海量的网络资源和数据资源非法获取云计算平台中用户的隐私数据,给云计算平台企业、用户和与之互联的网络主机带来直接和间接的危害.攻击者能力如表1所示.

表1 攻击者能力

这一攻击者模型的定义旨在明确攻击者的目标、能力范围,进而在这些基础上设计方法.

2 基于区块链的云镜像监测方法

本文提出的方法可用算法1中的伪代码描述.

算法1 云镜像监测输入:镜像文件M(1)t,M(2)t,…,M(n)t输出:被篡改的文件编号i1:if no New Block then2: MTt←MerkelTree(M(1)t,M(2)t,…,M(n)t)3: Build New Block with MTt4:end if5:MTt+δ←MerkelTree(M(1)t+δ,M(2)t+δ,…,M(n)t+δ)6:Nodet←MTt. RootNode7:Nodet+δ←MTt+δ.RootNode8:while Diff (Nodet,Nodet+δ)=TRUE do9: if Nodet is Leaf Node then10: return id of Nodet11: else12: Nodet←Nodet.ChildNode13: Nodet+δ←Nodet+δ.ChildNode14: end if15:end while

在这一方法中,主要包括以下几个步骤:镜像完整性度量步骤、区块链构造步骤、镜像完整性监测步骤和镜像篡改检测步骤.

2.1 镜像完整性度量

方法的第一步,需要对镜像进行完整性度量并构成区块链所需的Merkel树.在这一步所产生的Merkel树中,其叶子节点与云环境中的镜像一一对应,即每个叶子节点存放的是镜像文件的哈希值.用M1,M2,…,Mn表示云环境中的n个镜像,H(M)表示其对应的哈希值,则Merkel树的叶子节点的内容分别为H(M1),H(M2),…,H(Mn).Merkel树中非叶子节点中存放的哈希值,则由对其左右孩子节点的哈希值进行二次哈希得到,如M1和M2所对应的父节点中存放的内容为H(H(M1)‖H(M2)).最终产生的Merkel树的结构如图2所示.

由于Merkel树是一棵完全二叉树,而镜像文件的数量未必满足这一要求,因此在生成Merkel树时,需要对树的高度加以考虑.用h表示完整性度量得到的Merkel树的高度,那么在n个云镜像的情况下,必然有n≤2(h-1).为了生成高度最小的Merkel树,需要遵循以下步骤:

(1)计算镜像M1至Mn的哈希值,在Merkel树的2(h-1)-1至2h-1+n-2叶子节点中存储;

(2)使用空白值填充Merkel树2h-1+n-1至2h-1-2的叶子节点;

(3)除叶子结点外的所有非叶子结点按照从最大非叶子结点递减的顺序递归地从其左右孩子的哈希值中计算出新的等长哈希值,逐层向上递归计算哈希值,最终计算到Root结点的哈希值.

经过这一过程构造的Merkel树,其根节点中存储的哈希值对所有镜像的完整性敏感,即任何镜像的修改都会导致根节点哈希的变化.

2.2 区块链的构成

为镜像文件生成相应的完整性度量Merkel树后,可以进一步构造区块链.在t0时刻,系统生成创世区块;每隔一段时间,系统会重新为每个镜像进行完整性度量,重构Merkel树,并将新的Merkel树打包到区块链中.区块及区块链的结构如图3所示.

每个区块包含区块头和区块体,其中区块头中包含当前的Merkel树的根节点,以及指向前一个和后一个区块的指针、时间戳和一个随机数;区块体则包含了当前Merkel树的根节点以外的其他节点.系统在t0时刻生成创世区块后,会在t1,t2,…,tm时刻生成区块1,区块2,区块m等,其时间戳tk,k∈[1,m]被记录在区块头中,区块体则是在这个时刻重构的Merkel树.为了防止TOCTOU(Time-Of-Check-Time-Of-Use)攻击,系统通过调整随机数的计算难度来控制区块产生的速度,即区块产生的时间间隔δ=t1-t0=t2-t1=…=tm-tm-1是一个恒定值,且需要根据云镜像的具体情况确定其具体取值.

在本文提出的方法中,Merkel树保存了静态的云镜像完整性信息,区块链则实现了信息的动态存证.

2.3 镜像完整性监测

在构造了相应Merkel树和区块链的基础上,可以对当前时刻镜像库中的云镜像完整性进行监测.监测的目的在于确认云镜像没有被篡改,由于区块链中Merkel树的存在,因此对所有镜像完整性的监测主要在于对Merkel树根节点的监测.首先,方法依据时间戳检查当前区块的生成时间,即检查最新区块是否生成:如果最新区块尚未生成,则生成最新区块;如果最新区块已经生成,则从最新区块中读取当前Merkel树中根节点中存储的哈希值,监测最新区块中的一根哈希与前一个区块相比是否变化;当监测到根哈希变化时,由于Merkel树的特性,即可认为是某个镜像被篡改,进而启动检测机制对篡改进行检测.

2.4 镜像篡改检测

当监测机制发现了镜像篡改后,会启动检测机制定位被篡改的镜像.首先,依据现有镜像构建新的Merkle树,将其根结点与当前区块中Merkle树的根节点进行对应比较,如果这两结点的哈希值相同的话,则认为没有发生篡改;如果这两结点的哈希值不同的话,则需要进行进一步的判断:先判断此结点是否为Merkle树的叶子结点,如是,则该节点对应的镜像文件已经遭到篡改;如果此结点不是叶子结点,则分别对此结点的左孩子结点和右孩子结点进行以上判断.通过这种递归式的判断,进而定位到被篡改的镜像文件所对应的叶子节点.

3 性能分析及讨论

3.1 时间复杂度分析

本文从遍历、监测和监测3个角度分析时间复杂度.在有n个云镜像的云环境中,之前的方法中使用传统哈希值或文献[10-11]中使用的哈希链方法对云镜像的完整性验证时,由于两者均为线性结构,因此遍历需要逐一处理,其时间复杂度为O(n);监测镜像完整性时,需要逐一比对,因此监测的时间复杂度也是O(n);检测被篡改的镜像文件时,同样需要逐一处理,因此时间复杂度是O(n).而本文提出的方法,在遍历时,首先需要为每个镜像进行完整性计算并建立Merkel树,因此时间复杂度是O(n);在监测镜像文件是否被篡改时,由于Merkle 树的良好性质,仅需比对根结点处的哈希值,因此在镜像文件的监测阶段时间复杂度仅为O(1).当发现根节点的变化,即需要检测和定位具体的被篡改镜像时,会依据上述流程执行递归操作:

(1)读取根结点的内容;

(2)判断根结点内容是否发生了变化,若没有变化则结束,若有变化则执行(3);

(3)若此节点为叶子结点,则此结点对应镜像文件遭到篡改,否则将此结点的左右孩子结点分别带入(2)中进行判断.

图4描述了一个定位两个被篡改镜像的示例.在图4所示的例子中,镜像和被篡改了.重构Merkel树后,首先,方法会发现根结点的哈希值变化;然后,方法会寻找根结点的孩子结点即A结点和B结点,比对其值与当前区块中的对应节点的值,发现A结点的值发生了变化而B结点的值并未改变,这意味着篡改发生在A 结点的子孙结点;然后,方法再进一步比对A结点的孩子结点,即C结点和D结点.这样逐步递归,可以最终定位到被篡改的镜像文件.这一检测过程实质上是完全二叉树的查找过程,其时间复杂度为O(log2n).表2总结了之前文献中使用哈希值或哈希链的方法与本文提出方法的时间复杂度的对比.

表2 时间复杂度对比

3.2 实验测试

本文实现了一套原型系统以进一步验证所提出方法的性能.原型系统使用以太坊构建私有区块链,部署5个结点完成共识,选用PoA(Proof of Authority)共识机制.其中创世区块文件中的period参数被设置为300,即区块产生的时间间隔被设置为5 min(300 s).因此,当前的云镜像每5 min会进行一次完整性检查,构造Merkel树并生成一个新的区块.原型系统中准备了3种不同的云镜像文件:(1)Windows镜像文件,可用于快速部署Windows虚拟机;(2)RedHat Linux镜像文件,可用于快速部署Linux虚拟机;(3)CentOS镜像,其中内置了LAMP程序,可用于快速部署LAMP环境.这些云镜像文件的大小各不相同,通过组合这3种云镜像,实验在原型系统中模拟了3种应用场景,以检验方法的性能,其中场景1包含两个CentOS镜像以及RedHat镜像和Winows镜像各1;场景2包含两个CentOS镜像和5个RedHat镜像;场景3包含4个CentOS镜像、10个RedHat镜像以及4个Windows镜像.实验分别计算了在这3种场景下构建Merkel树和定位被篡改的镜像文件时的时间开销,以验证方法的性能,实验结果如图5所示.

图5中的实验结果显示,当云镜像规模的增长时,构建Merkel树的时间还是定位篡改文件的时间开销都会随之增加.而在所有的场景下,本文提出的方法的性能表现都要优于之前基于哈希值或哈希链的方法,并且云镜像的规模越大,本文方法所表现出来的优越性越强,例如在构建Merkel树的时间开销上,在场景1即云镜像总规模为10.2 GB时,本文方法相对于之前的方法有约0.5%的性能优势,而在场景3即云镜像总规模为50 GB时,本文方法则表现出了约3.25%的性能优势.这表明了本文提出的方法更适用于大规模存储的环境,例如云镜像的集中存储环境.此外,在原型系统的区块链环境中,5个参与结点仅用于完成PoA共识,将镜像的哈希信息记录在Merkel树中并在新生成的区块中存储,并不涉及代币的交易或智能合约的运行,同时也没有PoW(Proof of Work)共识机制下的“挖矿”活动,因此不会产生区块链系统内部资源(如gas)的消耗.

3.3 讨论

下面从安全性、可追溯性和可扩展性三方面对本文提出的方法进行讨论.

安全性:本文提出方法的监测与检测过程都依赖于预先构建的Merkel树,该Merkel树存放在区块链数据结构中,而区块链防篡改的特性决定了这一Merkel树是无法被非法修改的.同时,方法可以通过调整δ的取值来规避TOCTOU攻击,确保无法在区块生成的间隙实施攻击.此外,根据1.2中定义的攻击者模型,攻击者不具有攻击区块链机制的知识和能力.因此,本文所提出方法的安全性是可以保证的.

可追溯性:本文提出的方法中,区块是依据同样的时间间隔逐一生成的,这种时序特性赋予了方法可追溯性.当检测到当前区块的完整性变化时,表明攻击行为发生在当前区块建立之前,前一个区块建立之后,因此能够通过完整性检测确定系统遭受攻击的时间.此外,镜像的完整性信息按照时间顺序被保存在区块链中,作为存证便于系统在遭受攻击后恢复被篡改的镜像.

可扩展性:区块链去中心化的特性使得本文提出的方法具有可扩展性.在真实的云环境中,云镜像往往采用分布式储存的方法进行部署.在这种情况下,本文的方法可以调整为:各个存储节点共同维护一个区块链,单个存储节点为自己维护的镜像文件构建Merkel树,获取区块链的记账权,生成新的区块并最终组成区块链;其中,对单个存储节点而言,其所维护的云镜像所对应的区块按照固定时间间隔生成,记作δ1;对于整个区块链而言,两个相邻区块的生成时间间隔也是固定值,记作δ2.通过调整δ1和δ2的取值,可以确保区块链有序地对所有存储节点中存储的镜像文件进行完整性存证,同时也支持新存储节点的动态加入和动态离开,即实现了扩展性.

4 结 论

本文研究了一种云镜像完整性监测方法,基于Merkel树技术和区块链技术对云镜像文件的完整性实施动态监测和篡改检测.其中,借助于Merkel树的特性,本文提出的方法实现了高效率的完整性监测;区块链在本文提出的方法中,体现出了时序性、分布式和防篡改的特性,借助于这些特性,使得本文提出的方法是一种安全、可追溯及可扩展的方法.通过实验和分析,验证了本文提出的方法在效率上优于传统方法.在未来的工作中,将着力于解决方法在动态性方面尚存的不足.

猜你喜欢
镜像文件哈希镜像
镜像
镜像
没光驱不要紧 装个免费虚拟的
一种快速拷贝数据到FAT分区的方法
用RamOS降低公用机的维护工作量
基于OpenCV与均值哈希算法的人脸相似识别系统
基于维度分解的哈希多维快速流分类算法
Win7升级Win10教程
镜像
基于同态哈希函数的云数据完整性验证算法