陈文龙,刘迪雅,张洪山
(首都师范大学 信息工程学院,北京 100048)
E-mail:gagezhs@sina.com
当前的互联网容易受到各种类型的恶意攻击,例如拒绝服务和非法流量窃取,这是由于缺乏源地址和传输路径的安全验证.目前关于源地址和路径安全验证的研究大体可分为基于标识验证、基于可信硬件和集中式控制等.其中,数据包标记方案由于高效率与高可靠性受到广泛关注.相对于IPv4,IPv6提供了一种更灵活和可扩展的方式,但现有的方案针多数针对于IPv4数据包,关于IPv6协议的安全性研究较少.文献[1]提出的OPT方案可拓展到IPv6中,但并未给出具体设计及实验分析.文献[2]提出按流量大小进行分类的包标记方案,可以实现源和路径验证,但是要求中间路由器存储整条路径信息,及上一跳路由器的共享信息,存储开销过大.
本文设计了针对IPv6报文的源地址真实性验证和传输路径安全验证方案.在初始化阶段,发送端在数据包头部添加标识,随机选择一些中间路由器作为检查节点,仅由检查节点对网络实体中的数据包执行标识字段的识别和验证,不需要所有节点都具有验证能力,提升了安全验证效率.若检查节点验证失败,丢弃报文,并将记录发送给源端,源端能够通过新增的标识字段,执行高效可靠的故障定位.对于只需要保证某一段路径一致性的需求,可以通过修改标识字段的最高位,实现自定义的路径验证.
本文提出的源和分段路径验证技术,能实现高效可靠的源身份合法性和路径一致性验证.其主要特点包括:1)由中间路由器做路径验证,如果验证失败,立即丢弃报文,而非在目的端才做验证,减少了错误报文的传输开销;2)仅由源端选择的少量的中间路由器执行验证,其余实体仅对数据包进行标记;3)由源端进行数据包初始化,检查节点选择和故障定位,减轻了中间路由器的计算和存储开销,负担多在源端,这是可以接受的;4)源端通过随机函数为每个流选出检查节点,每个会话周期结束后重新选择检查节点,不仅可以降低被攻击者探测到的概率,提高了方案的安全性,且将计算负载平摊到路径上每一个实体.
本文其他部分组织如下:第2节对源和路径验证的相关工作进行介绍;第3节对SPV方案做出概述;第4节给出了方案的具体实现流程;第5节进行实验分析.最后对全文进行总结.
包标记法是由报文通过的路由器为报文添加一定的标记信息,被攻击者主机上通过提取攻击报文中的标记信息实现攻击路径溯源的一种攻击溯源方案.
OPT(Origin and Path Trace)方案[1]设计了一种轻量级的源地址和路径验证策略,发送端在数据包头为源和中间每个路由器添加对应的标识,中间节点及目的端依次在路径上接收相应标识.在OPT算法中,每个中间节点需要执行两次消息认证码(Message Authentication Code,MAC)操作,因此需要所有节点都具有验证能力,同时它无法解决中间节点受到攻击产生恶意丢包的问题.文献[2]也是一种基于包标记法的源地址认证方法.通过设计标记概率和标记流程,将域内溯源与域间溯源相结合.利用被标记的路径信息实现路径的重构.由于仅将流量通过一个确定的阈值,在实际流量中,网络状况并不总是稳定的,因此阈值设定的合理性有待优化.
在PPV方案中[3],中间节点为每个数据包执行概率数据包标记,并为该数据包生成密钥哈希消息验证码.为定位到故障链路,目的地根据数据包中接收到的标记重建转发路径.Passport方案[4]将转发路径上一系列AS路径的MAC填入报文头部,作为其身份的标识.当数据包离开其源AS时,边界路由器会将路径上每个AS的一个MAC标记到其passport标头中,MAC由源AS和AS之间共享的密钥计算得出.当数据包进入路径上的AS时,边界路由器会使用与源AS共享的密钥来验证对应的MAC值.具有无效MAC的数据包在中间AS处被降级,并在目的地AS处被丢弃.边界路由器需要对出分组进行标记,对入分组进行检查,承担的计算开销太大.文献[5]在Pi[6]与StackPi[7]的基础上做出进一步改进,提出了主动路径标识机制Active SPi.该方案在端系统处采取主动探测方式来验证报文源地址的合法性,构建信任表来进行报文过滤.ShorMAC[8]利用概率包验证实现故障链路的定位,但是要求为每个源端存储对称密钥,这对路由器存储能力要求过高.RFL[9]中提出的一种鲁棒的对称密钥共享方案,完成在转发路径中,源和实体间的对称密钥设置和分发.通过对数据包的随机采样,实现轻量级的源地址和路径验证.文献[10]基于OpenFlow架构,提出一种新的路由算法,通过四元组(源地址前缀、目的地址前缀、入接口和出接口)实现端口粒度的源地址验证.
文献[11,12]对源地址安全问题的已有研究进行细致分析归纳,提出保证端设备地址和传输路径的真实可信的安全体系结构.文献[13]研究了域间源地址验证方法的可部署性问题.
本节给出了对手模型和SPV协议的概述.本文提出的源验证和路径认证是基于端到端实现的,即数据包通过源S,沿预期路径Ψ=到达目标D,其中n是路径长度(不包括源端),并且S,D和Ri是网络中的网络实体.在不可靠的通信通道下,由于被攻击或出现故障,中间路由器可能丢弃、修改数据包或改变其转发路径.
本文假设源S和目的地D是终端,定义合法路径是Ψ=,理想情况下应沿此路径传输数据包.根据现有的路由协议,如BGP协议或Pathlet协议,本文假设源端可以获知数据包预期将遍历的路径,并且可以设定该路径中哪些实体希望执行路径验证.本文在终端主机使用现有的DRKey协议,获得与预期路径的中间实体共享的必要对称密钥.
数据包更改:更改数据包的信息,如源地址,报头或有效载荷数据.
数据包注入:恶意路由器伪造数据包并将其发送到目的端.
路径偏差:包括路径绕行和路由器跳过.路径绕行是指偏离预期的转发路径,但随后该数据包返回到正确的路径上.如
乱序遍历:未按正确的顺序遍历预期路径上的路由器.如
本文从整条路径中挑选一些节点作为检查节点,只有验证节点负责验证路径,这些检查节点组成一个检查点组Checks.分段的原则是同一时刻完全覆盖整条路径,所以每个检查节点负责检查从上一个检查节点到它自己的这一段路径.而目的端D负责最后一个检查点到自己的这段路径.
SPV将一条完整路径分为若干段,仅由路径上的一些实体做路径验证,他们只负责验证自己所在的一段路径,而不是验证完整路径.合理的检查点数量和均匀分布检查点可以使得分段的路径不至于过长,在路径验证失败时可以较快的定位出故障点.为了平均检查点的负载和提高检查节点的安全性,每经过一段时间后会更新检查点组.
IPv6 分组由固定首部和有效荷载组成,有效载荷部分由扩展首部和数据部分组成.本文将标识插入到IPv6目的选项头中.IPv6协议规定了两种目的选项头,本文选择位于路由选项头之前的选项字段.SPV报头包含如下字段:检查点组(Checks),会话标识(SessionID),签名字段(Sign)和若干个标记字段(SegInfon).所有标记都插入到选项字段中.如图1所示.
版本号通信类型流标签有效载荷长度下一首部跳数极限源地址目的地址拓展首部/数据下一首部拓展首部长度选项
PacketIdSessionIDChecksSignSegInfo1SegInfo2…SegInfon
PacketID是数据包标识.本文将报文的消息验证码(MAC)作为报文的标识.使用同样的密钥,对于不同内容的报文会产生不同的验证码[2],这样可以更好地防止重放攻击.如果在传输过程中数据包的有效负载被修改,对这个包进行源认证和路径验证将毫无意义.PacketID的计算如式(1)所示.src是源地址,dst是目的地址,data是有效载荷的前8个字节.flow是IPv6固定头部中的流标签.
PacketID=MACKSD(flow‖src‖dst‖data)
(1)
Checks的计算如式(2)所示.N是一串二进制数,它的长度与路径长度相等(包含源端和目的端),它的每一位与路径上的每一个实体相对应,当该实体被源端设置为检查点时,该位置1,否则为0.Checks字段的最高位默认为1.
在下文中,通过设置最高位来进行自定义的路径验证.
Checks=MACKSD(N)
(2)
在确定检查点以后,整段路径就以检查点为界限被分为若干段.其中,第1段为S到第一个检查点,最后1段为最后一个检查点到D.SegInfo代表由相邻两个检查点间的路径信息,包括这段路径上需要遍历的路由器,及遍历的正确顺序.S分别为每一段计算一个SegInfo,按顺序填入SegInfon字段.Sign的计算如式(3)所示.PRF是以密钥Ki加密的伪随机函数.SegInfo的计算见公式(4).其中,T为上一个检查点k到下一个检查点t的路径上的所有实体的Sign值集合.
Signi=PRFKi(Signi-1‖Ri‖src‖dst)
(3)
SegInfon=MACKn(PacketId‖Checks‖T)
T=Signk‖Signk+1‖Sign…‖Signt)
(4)
以图2为例,S在发送数据包之前选择R3,R7作为检查点,按照公式(2)计算Checks的值.因为路径长度为13(不含源端),所以公式中的N是一个13位的二进制数,按照路径上检查点的顺序,将N中对应的位置为1,得到N=10010001000001.然后分别为检查点组中每个实体计算对应的分段路径信息字段SegInfo:SegInfo3,SegInfo7和SegInfoD,依次填入到SegInfo字段中.由源S到R3需要按序经历R1和R2,S为该段路径信息执行MAC操作,使用与R3共享的密钥加密,得到SegInfo3.源端分别与路径上的中间路由器及D共享对称密钥.在开始转发数据包前使用现有的DRKey协议完成密钥分发与交换.
图2 分段路径认证模型Fig.2 Segmented path verification model
S下发数据包,接收到数据包后,Ri首先检查Checks字段是否有自己的名字.如果没有,使用密钥Ki签名公式(3),更新字段Sign,继续向下传输数据包.若Checks字段中第n位为自己的名字,则该路由器是检查点.它首先计算Sign的值(公式(3)),并将其与SegInfon进行比较.如果这两个值相等,表示这一段路径验证成功.Ri将Sign字段清空,并用密钥签名,然后将数据包转发到下游路由器.目的端D收到数据包后,先用密钥KSD计算Sign字段值,与SegInfo比较,若比较成功,代表从S到D的所有分段路径都已被成功验证.本文默认S未收到任意一个检查节点回传的Fail报文(ICMP报文),即表示整条路径都验证成功.
检查点计算出的值与SegInfon字段不匹配时,丢弃数据包,将收到的数据包的Sign字段的信息填入Fail数据包内,并用密钥签名,然后向源端发送Fail报文.
在某些应用环境中,不需要对整条路径进行严格的路径验证,用户想自定义地对其中一段进行验证,如只需验证数据包是否按正确的顺序遍历了
图3以R3和R7为检查点,表示了具体的过程.非验证路径上的路由器不更新签名,仅转发数据包.当数据包到达R3时,R3将Checks最高位置1,更新Sign字段后继续向下转发数据包.R3-R7路径上的实体在解析出最高位的值为1后,同样更新Sign字段.直到R7收到数据包,因为R7是最后一个检查节点,R7将Checks的最高位置0.下游的路由器将不再进行标记或验证,仅执行转发操作.
若需要实现更复杂粒度的自定义验证,可以拓展标记位的长度.例如,3位的标记位可以表示8种的选择状态,可以包含路径被划分为几段,选择了第几段路径(可以多段)等信息.这里仅将最高位1位作为标记位,可实现挑选中间一段路径执行验证.
图3 自定义路径认证模型Fig.3 Definable path verification model
4.4.1 检查点收到数据包,但验证失败
检查点收到了上一跳传来的数据包,但计算出的SegInfo值与报文头部预先填入的SegInfo字段值不相等,则检查点对它负责的这段路径验证失败.这可能是由于恶意路由器将报文转发路径修改,乱序,增加或跳过了某些正确路径上的路由器.在验证分段路径失败时,该检查点会丢弃数据包,并在时间段e的末尾时刻向源端发送Fail报文(ICMP报文).检查点将验证失败的数据包中的Sign字段信息填入Fail报文,并填入自己的签名信息.
S将重建分段路径,使用收到的Fail报文来定位故障,这些连接全部从一系列接收到的SPV标头中获得.例如R4受到恶意攻击丢弃数据包,R4的下游中距离最近的检查节点R7将收不到含有正确Sign字段的数据包,R7将向S发送Fail数据包,在时间段e内,S收到同一检查点发来的Fail报文数量超过k,就会将公式(2)中的N的对应于该检查点至前一检查点的路径上的所有实体的位都置为1.将Checks的第4至7位都设置为1,即R4至R7都将进行路径验证,若R5未正确收到数据包,可以将故障定位到R4和R5之间的路径上.
4.4.2 检查点未收到数据包
检查点未收到数据包,可能是恶意路由器将数据包丢弃或转发到其他路径上.该检查点也会向S发送Fail报文,仅用密钥签上自己名字,填入Sign字段.S收到Fail报文并解析后,会知道该检查点未收到数据包,若并未收到上一个检查点的Fail报文,则可以将故障定位到上一个检查点到该检查点的这段路径上.在下一个时间段,将这段路径上的所有路由器都设置为检查点.
在本节中,通过NS2仿真平台,对指定模块的修改实现了SPV分段路径验证方案.实验平台配置为Core i5处理器,
8G RAM.实验分为两部分,第1部分通过网络吞吐量对本方案路径验证的性能进行评估,并与目前的最佳方案OPT进行比较.第2部分是对检查点概率对故障定位时间的影响进行测试,并给出一般网络环境下检查点概率的建议值.
本文评估SPV中间路由器的吞吐量并与OPT进行比较.虽然目前也有一些关于源地址和路径验证的方案,但有些不适用于IPv6协议,而本文方案针对于IPv6网络,与其对比意义不大.本文是在流粒度上对数据包进行验证,有一些方案将粒度细分到了端口,虽然更加细致,但增加了验证开销,降低了网络通信的效率.而OPT仍是目前较好的路径认证方案,且可拓展应用于IPv6报文.因此本文选择与OPT方案进行对比.
图4 路径长度对吞吐量的影响Fig.4 Influence of path length on forwarding efficiency
首先,将新增字段填入IPv6首部的选项字段.设置路径长度分别为最长为20跳,最短为10跳.对大小分别为256B,512B,1024B和1500B的数据包进行多组实验.从图4可以看出,在不同路径长度条件下,SPV的路由节点的吞吐量都优于OPT,最大是OPT的1.17倍.因为OPT需要每个中间路由器都执行MAC操作,而SPV只有检查节点执行MAC操作,其余节点使用为随机函数,以本地信息作为输入,计算开销小于MAC.随着路径长度的增加.源端选择检查节点的概率不变的条件下,更多的中间路由器仅执行简单的签名计算,因此SPV路由节点的吞吐量随路径增长而显著增长.
图5 数据包大小对吞吐量的影响Fig.5 Impact of packet size on forwarding efficiency
图5为数据包大小与吞吐量的关系.从图中可以看出,SPV的吞吐量随着数据包大小的增大而增大.特别是当数据包大小达到1500字节时,与无安全验证相比,SPV能够实现约90%的吞吐量.
实验改变检查点的概率,以分析SPV的性能.在n=13的条件下,对于256B和512B的数据包,随着检查点概率的增加,源端定位到故障路径的时间需要的时间逐渐减小.图6表明,较小的数据包所需的故障定位时间比更大数据包所需的时间少.当检查点概率为1,即每个中间路由器都执行路径验证时,定位到故障路径的时间最少.但检查点为1即意味着所有中间路由器都需要进行路径验证,这会带来计算开销的增大.因此,为平衡故障定位性能与转发性能,本文给出SPV检查点概率的推荐值为0.2.
图6 检查点概率对故障定位时间的影响Fig.6 Effect of checkpoint probability on fault location time
本文提出一种基于IPv6的分段源和路径验证的方案.首先,根据IPv6的首部结构,选择目的选项作为标记域,由源端选择的检查节点对标记字段进行计算,通过与源端预先填入的值进行比较,判断路径验证是否成功.当路径验证失败后,检查节点向源端发送错误报告报文,源端将以更细粒度重新设置检查节点,来定位到故障的链路.
本文提出的源和分段路径验证技术,在中间路由器,而非仅目的端执行路径验证,如果验证失败,立即丢弃报文,能够减少错误报文的传输开销;而且源端仅选择的少量的中间路由器执行验证,其余实体仅对数据包进行标记.与OPT相比,不仅减小了传输开销,而且对于不同数据包大小,和不同路径长度,中间路由器的吞吐量均优于OPT,最大是OPT的1.17倍.此外,检查节点随着每个会话周期结束会被重新设置,不仅可以降低被攻击者探测到的概率,且将计算负载平摊到路径上每一个实体.如果需要仅在自定义路段上执行路径验证操作,可通过设置字段的最高位为标记位来实现.