时间:2024-05-04
刘宏彬 刘思佳
(1.华中科技大学同济医学院 武汉 430030)(2.华中科技大学软件学院 武汉 430074)
微服务是一个新兴的软件架构,就是把一个大型的单个应用程序和服务拆分为数十个的支持微服务。一个微服务的策略可以让工作变得更为简便,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等级协议。微服务作为一项在云中部署应用和服务的新技术已成为当下最新的研究方向[1~3]。
面向服务的架构SOA(Service-Oriented Archi⁃tecture)将组件发布成服务,通过对外提供不同的服务来支持应用系统的接口。微服务是在SOA的基础上发展起来的,微服务架构强调更彻底的组件化和服务化,原来应用被拆分为一系列独立分布的微服务,每个微服务都可以独立部署。微服务架构的特性,使得其面临严峻的安全问题。由于微服务向外提供服务时,需要向外暴露更多的接口,使得微服务遭受攻击的可能性增加。但微服务之间通常被设计为相互信任,假如入侵者入侵了某个微服务,完全控制了这个微服务,那么入侵者可以向其他微服务发送请求获取敏感信息,甚至攻击其他微服务导致整个系统瘫痪,对于这种内部攻击服务的设计者往往是没有防范的[4],此外,微服务应用还面临着一些权限攻击的威胁,入侵者可能会绕过应用的权限管理机制,提升自己的权限。因此,在微服务应用上进行入侵检测显得很有必要。
传统的入侵检测技术主要拥有网络安全,面对微服务应用上的多种攻击手段显得力不从心,上面提到的内部攻击中入侵者如果仅仅向其他微服务发送一些请求来窃取隐私,在主机和网络上的特征与正常的微服务调用不会有任何区别,因而很难检测出来[5~6]。
针对以上问题,本文微服务架构下提出基于应用特征向量技术来解决微服务应用上的入侵检测难题。
有关微服务的入侵检测的研究尚不充分,与之相关的是微服务的故障诊断以及微服务应用监管的研究。
王子勇等提出一种基于执行轨迹监测的微服务故障诊断方法。首先,利用动态插桩监测服务组件的请求处理流,进而利用调用树对请求处理的执行轨迹进行刻画;然后,针对影响执行轨迹的系统故障,利用树编辑距离来评估请求处理的异常程度,通过分析执行轨迹差异来定位引发故障的方法调用;最后,针对性能异常采用主成分分析抽取引起系统性能异常波动的关键方法调用[7]。
刘一田等研究了传统分布式系统监控技术及基于服务调用链的分布式系统追踪技术,在此基础上,设计了柔性微服务监控框架,给出了高可用配置中心、无侵入的微服务实例客户端代理、灵活可复用的监控告警模板等创新点,阐述了该框架的架构设计及关键实现技术[8]。
李明等借鉴自然免疫系统的学习、记忆和模式识别等机制,考虑了网络安全免疫系统模拟其原理和功能,利用分散于网络各层面的代理协同监测入侵行为,实现威胁的有效应答,联合做出响应,并实现安全防御,以此解决复杂环境中防护的被动性和盲目性问题。提出了一种基于微架构的网络安全免疫模拟系统。该系统由微容器、微服务、微链路和微流程四个层次的模拟机制构成,基于生物免疫系统中组件表现出的主动性、自适应性和反应性等属性特征,构建监测代理、控制代理、管理代理和安全策略管理中心代理四类典型功能要素,并在指定的场景中按照预设参数和规则运行,以验证网络安全免疫模拟系统实现协同检测、联合响应、联动阻断、应急恢复等能力和效能水平[9]。
上述系统或者研究没有从微服务应用的本身来考虑如何对微服务应用的入侵进行检测。目前在数据库和网络安全领域,利用系统应用特征进行入侵检测技术变得越来越流行。系统应用功能特征反映为对系统的方法调用、服务调用、权限控制等,对于这方面的检测能够察觉出系统中很微小的差异,因此能够发现入侵或者故障[10~12]。
在系统应用处理客户端或者其他应用的请求时,会调用微服务,继而引起微服务之间的相互调用,形成一次调用链。一次调用链对应系统中某个客户端对系统功能和权限的使用,本次调用链中的系统功能和权限属性用微服务应用特征向量来描述。
用LinkID来描述调用链,调用链中的每个调用请求用InvokeID来表示。一次调用对应的微服务应用特征向量由四元组:
来描述。其中S表示请求服务,F表示调用函数或方法,PList表示请求参数列表。
一个调用链由多个应用特征向量组成,用特征向量组来描述,即
其中n为特征向量的数量,Vi为第i个应用特征向量,RList表示产生该特征向量集合的用户角色列表。
从式(2)可知,一个特征向量集合由多个特征向量组成,对于一个特征集合VS中的两个特征向量,如果InvokeIDi为InvokeIDi+1的前缀,说明系统中存在服务Si对于服务Si+1中方法Fi+1的调用路径,即存在InvokeIDi与InvokeIDi+1之间的这种关系表示为InvokeIDi=Parent(InvokeIDi+1)。 同 时 VS 中 存 在LinkID到V1,…,Vi,…Vn的映射关系以及LinkID到RList的映射关系。下面给出特征向量集合中这些关系的定义。
定义特征向量关系VSR如下:
在式(3)中:
VI(LinkID,Si)={<Sj,Fj>,…,<Sk,Fk>,…,
其中式(4)表示Vi的调用列表,即Vi调用Vj,…,Vk。
VM(LinkID)={Vm,…,Vk,… Vn}为调用顺序列 表 ,标 记 为{Vm1,…,Vmk,…,Vmp}。 VR(LinkID)=RList={Rm,…,Rk,… Rn}为调用角色列表,标记为{Vr1,…,Vrk,…,Vrp}。
一个特征向量关系对应应用系统中的功能和权限特征。一个应用系统的特征向量关系全集表示如下:
由于应用的功能在开发完成后将是固定和有限的,对应的功能特征也应该是有限的。
特征向量关系全集体现出三种关系,即:VI=∪Vi,VM= ∪Vm,VR=∪Vr;
VI描述了整个应用中某个微服务可以调用的其他微服务及方法的集合,VM描述了系统功能在调用层级调用顺序方面的属性,VR关系描述了系统功能与系统角色的对应关系。这三种关系分别对应三种入侵,假如系统中出现了异常的调用路径,那么该调用路径必然没有在VI中出现过,假如系统中出现了异常的调用顺序与层次,那么该调用顺序及层次一定没有在VM中出现过,假如系统中出现了异常的功能角色映射关系,那么该映射关系必然不符合VR关系。
特征向量的提取是指由调用链中提取出特征向量的过程,由于调用链中每个请求信息在请求的发送方和接受方都会记录一份调用记录,特征向量提取后就可以检测是否有日志遗漏或者被篡改的情况。
入侵者在入侵了某个微服务或者该服务所在的虚拟机后,可能会拥有该服务或者该服务所在的虚拟机的所有权限,该服务或者节点的调用链的记录和传输会受到影响,从而变得不再可信,最终影响整个调用记录的可信度。为此可以检测服务的发送方和请求方共同对请求信息进行记录的方法,该方法可以保证服务的发送方和请求方中有一方出现被侵入,日志无法传输或者被篡改的情况可以被快速检测出来。
上面的检测主要发生在特征向量V的生成过程,在通过检测生成了全部的特征向量之后,便可以通过特征向量V中InvokeID属性建立特征向量的Vi和Vm关系,Vr可由日志记录与用户身份信息相结合后生成。
应用特征向量是全集的生成方法就是将应用程序中所有功能对应的特征向量全部提取出来,生成特征向量关系集合VSR的过程。在提取时要保证调用链数据都是正常的,这样才能够得到正确的特征向量。
为保证得到数据集的完备性,将采用增量更新的生成方法。在增量更新时,特征的获取与应用程序同时运行。随着系统的不断运行,当客户端和外部系统逐步使用了系统的全部功能和权限后,即可获取全部的特征向量集合。当特征向量集合的数量不再增加,特征向量集合中三种关系的数量也趋于稳定的时候,说明特征向量集合中已经包含了应用系统的所有功能特征,增量获取过程结束。
在生成过程中,首先把特征向量集合全集置空,针对每一个特征向量计算VI,VM和VR。在计算VI和VM时,直接把每一个向量Vi和Vm并入到向量集合VI和VM中。在计算VR时,需要进行如下计算,给定两个指标i和j,如果存在Vii=Vij且Vmi=Vmj即如果两个特征向量Vi和Vm关系相等,这两个关系特征向量相等,需要对向量合并,即把Vrj合并到 Vri中。
基于特征向量的微服务架构的入侵检测算法AIDMAFV(Algorithm of Intrusion Detection for Mircoservice Architecture based on Feature Vector)描述如下。
AIDMAFV(DB){
select VRS from DB;//数据库DB中记录全部应用信息
calculate VI,VM and VR;
generate VSR;
select count(*)into c from VSR where <S,F> not in VI and <S,F> in Vi;
if c=0 then
for i=1 to n
if Vmi∈VM and Vmi=Vm then
flag=1;
lid=Link IDi;
end if
end for
if flag=1 and then
if Vr∈VR(lid)then
return 1;//正常
else
return-3;//第三层异常
end if
else
return-2; //第二层异常
end if
else
return-1; //第一层异常
end if
}
算法AIDMAFV包括三个层次:1)微服务之间调用检查,微服务之间调用检查关注于应用系统内部微服务对于其他微服务发送的请求。由于微服务往往被设计为相互信任的,所以微服务之间的调用往往是不做检查的,但是如果入侵者控制了某一个微服务,可以通过该微服务调用应用系统内部其他微服务,这样可能会产生原来系统中不存在的调用路径。第一层的检查可以检查出这样的内部攻击。在特征向量集合中,VI关系用来描述微服务之间的调用关系,规定了服务可以调用其他服务的哪些方法,所以第一层的检查就是检查微服务之间的调用是否满足VI所定义的调用关系。2)微服务调用层次及顺序检查。第二层主要对于微服务调用的层次及顺序进行检查。假如入侵者控制了某一个微服务,入侵者可以在该微服务的调用方法中加入多次其他的调用请求,或者打乱该微服务中所有调用的顺序,以此达到消耗系统资源,妨碍应用系统向外提供服务,甚至危害整个应用系统的目的。在特征向量集合中,VM关系记录了所有合法的调用请求的层次和顺序关系,上述情况发生后追踪记录提取出的特征向量会出现VM关系中不存在的层次和顺序关系,所以这种情况可以在第二层检测出。该层的检查是在第一层微服务之间调用检查通过之后进行的。3)功能与用户角色映射关系检查。该层的检查主要对于特征向量中VR关系的检查。入侵者可能通过应用系统或者底层操作系统的某些漏洞,绕过应用系统的权限检查机制,提升自己的权限,从而窃取系统内敏感信息,甚至破坏应用。这种行为会违反功能与用户角色的映射关系,因而可以通过对于功能与用户角色的映射关系的检查来发现这种行为。首先检查产生该行为模式的用户身份,找到该用户对应的角色,然后查看该特征向量的Vp中是否能够找到该角色,如果能够找到,则通过该阶段检验,检测不通过。
如果一次调用产生的特征向量能够通过上面三个层次检测,那么这次追踪对应的调用就是正常。否则,不同阶段会给出不同的报警信息,并记录到数据库中,供应用拥有者统计分析。
实验硬件环境由三台PC机组成,PC机配置CPU为i7 2.7G,运行Windows10操作系统。共运行如下程序:10个分布式应用,10个特征向量收集程序,1个入侵检测程序。
采用查全率、查准率、误检率和漏检率来评价入侵检测效果。其定义如下:
为了能够正确评价提出的算法,随机生成测试事件,测试事件由正常事件和入侵事件组成。
首先测试算法的扩展性,分5组实验,每组总数分别为100、500、1000、2000和10000个。正常事件与入侵事件按照7∶3的比例生成,共有3类入侵事件,每类各占总数的10%。实验结果如表1所示。
表1 入侵检测的扩展性
从表1可以看出,随着测试集的大小不断增加,当事件数量大于500时,查全率一直维持在95%~96%之间,查准率将近98%,而误检率和漏检率也都维持在一个比较低的水平。当事件数量较小时,误报率和漏检率较高,说明对小的应用算法存在一定误差。检查测试数据后发现,漏报和误报主要是因为有些不常用的功能存在一定误差。
再把总事件数固定为1000,增加入侵事件数量来测试算法性能,三种入侵事件随机分布,测试结果如表2所示。
表2 随异常事件变化的入侵检测的扩展性
从表2可以看出,算法的性能基本与入侵事件数量关系不大,只是在入侵数量比较少和比较多的时候,性能稍有下降。
微服务架构是适合云计算的新型软件架构,本文研究微服务架构的安全问题,关注使用微服务架构的应用的入侵和故障检测,把入侵分为功能异常、调用顺序异常和权限异常三种层次,然后提取这三种异常的特征向量,进而检测出这些异常,实验结果表明提出的入侵检测算法具有很好的性能。
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!