1 前言
针对Internet 的安全需要,为了给IPV4 和IPV6 数据报提供高质量的、可互操作的、基于密码学的安全性,Internet 工程任务组(IETF)颁布了IP 层安全标准IPSec。IPSec 在IP 层对数据包进行高强度的安全处理,提供包括访问控制、无连接的完整性、数据源认证、抗重播(replay)保护(序列完整性(sequence integrity)的一个组成部分)、保密性和有限传输流保密性在内的服务。这些服务是基于IP 层的,提供对IP 及其上层协议的保护。
对于IPSec 数据流处理而言,有两个必要的数据库:安全策略数据库(SPD) 和安全关联数据库(SAD)。SPD 指定了用于到达或者源自特定主机或网络的数据流的策略,而SAD 则包含了活动的SA 参数。在启动IPSec 保护的源和目的之间,都需要设置单独的输入和输出SPD 和SAD 。
经受IPSec 保护的节点的通信流,无论是输入还是输出都必须查询SPD。SPD 包含一个策略条目的有序列表,每个条目里又包含多个选择符,输入输出数据流就是通过和这些选择符比较来决定是否进行安全保护。IPSec 允许的选择符有目的IP 地址,源IP 地址,传输层协议,系统名和用户ID。目的和源IP 地址可以是一个主机地址,广播地址,单播地址,任意播地址,地址范围,地址加子网掩码或者通配地址;系统名和用户ID 可以是完整的DNS 名或E-mail 地址。SPD 中的条目决定了处理通信流的粒度,策略可能规定与某特定的SA 或SA 束对应的IPSec 服务应该应用到任何源自任何源或者去往任何目的地的所有通信流,策略也可能规定应该基于特定的选择符来决定不同SA 或SA 束的应用。总之,SPD 在控制通过一个IPSec 系统的所有通信中发挥着非常重要的作用。为了在保证安全强度的前提下,提高IPSec 保护节点上的流处理速度,本文提出了一种采用硬件IDT75K62100 芯片实现快速的SPD 与SAD 数据库的思想。
2 SPD 与SAD 硬件结构
安全模块的设计初衷就是为了在IPV6 路由器中对特定的数据流实现高速的IPSec 安全保护,这就使得SPD 和SAD 的高速查找成为一个很关键的问题,因为对每一个包进行IPSec 处理时,都必须查找SPD 和SAD 以获取相应的处理策略,如果查找速度慢的话,将达不到高速的性能要求。数据库可以用软件来组织,也可以依托硬件来实现,为了提高查找速度,我们使用硬件来做数据库。目前支持高速查找的硬件主要有两种:基于逻辑算法设计的SRAM 技术和基于半导体器件设计的CAM(Content Addressable Memory, 内容寻址寄存器)技术。常用的随机存储器通过输入地址来返回该地址所对应的数据信息,而CAM 只需要输入关键字的内容就会将此关键字与CAM 中所有表项同时进行比较,最后返回匹配表项在CAM 中对应的地址信息。CAM 可以在一个硬件时钟周期内完成关键字的精确匹配查找,目前速度可达到266Mpps 。
CAM 虽然有很多优势,但在本模块中如果都采用CAM 来作为数据库,则一方面代价太高,因为输入处理和输出处理各需要两个数据库(SPD和SAD), 这样一共需要四个CAM,而CAM 价格较为昂贵;另一方面将SPD 和SAD 分别设在两块CAM 中,这样每处理一包需要进行两次查找,影响了速度。为此,我们特别研究了一种能够实现快速查找的数据库硬件结构,这种结构采用CAM 和SRAM 相结合的方式。这种结构一方面在一定程度上降低了成本,另一方面解决了二次查找的问题。
这种硬件结构的组成原理是将SPD 设置在CAM 中,而将SAD 设置在SRAM 中,然后将CAM 和SRAM 级联。这样,在进行IPSec 处理时,先在CAM 中查SP,如果没有找到相应的SP, 则查找结束;如果查到了相应的SP,则由CAM 将对应的SA 在SRAM 中的存放地址送给SRAM, 然后从SRAM 中对应地址将SA 取出送FPGA, 这样避免了再由FPGA 对SAD 进行查询。这种数据库的查找方法还引入了流水机制,即CAM 查到了前一报文的SP 后,将匹配地址送给SRAM,在SRAM 读该地址对应的SA 的同时,CAM 可进行对下一报文的SP 的查找。该查找方法中,CAM 与SRAM 的连接如图一所示。
3 75K62100 芯片的内部结构 实际设计中,CAM 选用IDT 公司的75K62100 ,其内部逻辑结构与主要外部总线如图二所示。从图中可以看出,该型号CAM 内部主要由配置电路,指令译码,输入输出数据缓存,比较寄存器和数据存储区等单元组成,外部总线有指令总线,数据总线和索引总线,另外还包括一条匹配标志信号线。该CAM 的数据存储区的容量为18M, 经过配置电路配置,可以工作在256k×72bit (表项深度为256K, 宽度为72bit)、128K×144bit 、72K×288bit 等模式下。指令总线宽20 位,配置指令,读写指令从该总线输入。数据总线宽72 位, 输入数据时,先将数据写入数据输入输出缓存区,在内部地址译码控制下,再将数据写入数据存储区或比较寄存器。比较后得到匹配项的地址由24 位索引总线送出,数据经输入输出缓存器从数据总线输出,并由匹配标志信号线给出匹配状态。
SRAM 选用IDT 公司的71V65603 ,该款SRAM 工作频率为100M-150MHZ ,支持ZBT 技术,容量为256KX36bit 。其内部逻辑结构及主要外部总线如图三所示。
查找时,先从包头中提取出查表关键字送CAM 查SP,若查到了SP,则将此SP 对应的SA 的地址通过CAM 索引总线送给SRAM 并将匹配标志送IPSec 处理单元,SRAM 根据送来的地址将对应的SA 通过数据总线写入IPSec 处理单元。每查到一条SA,则需要对SAD 中的该SA 条目进行更新,因为SA 中包括序列号和SA 生存期等需要及时更新的字段。更新过程和查找过程基本一致,先从CAM 中找到对应的SP 条目,得到该SA 的存放地址,然后将修改后的SA 写入该地址或将原SA 删除。
4 SPD 和SAD 数据格式设置
一个好的IPSec 协议实现方案,一定程度上取决于SPD 和SAD 条目的合理的设置,因为合理的SPD 和SAD 条目设置可以使IPSec 处理即不复杂,又达到了预期的安全保护的要求。
根据实际需要,本安全模块的SPD 中每个条目设置源IP 地址,目的IP 地址,传输层协议三个选项。需要注意的是,源IP 地址和目的IP 地址项完全没必要设为128 位的, 只需要储存各自地址的高64 位即可,因为在128 位的IPV6 地址中,高64 位是所属网络地址,由于是在路由器上实现IPSec 保护,故在进行策略查找时,只需要检查数据包中的源和目的的网络地址是否与策略库中的网络地址相匹配即可。传输层协议选项为8 位宽,对于输出处理单元,只对TCP 和UDP 进行安全保护,故该选项的十进制值应为6(TCP)或17(UDP)
; 对于输入处理单元,只对ESP 进行处理,故该选项的十进制值应为50。由此看来,SPD 的表项宽度应在136 位以上。
对于输出包处理的SAD,每个SA 条目包括SPI 字段,序列号计数器字段,序列号溢出字段,密钥字段和SA 生存期字段。其中,SPI 字段为32 位宽, 取值范围为256—232-1,我们规定,若SPI 为全1,则表示SA 尚未建立,需要进行协商;若SPI 为其它有效值,则根据对应的SA 进行安全处理。序列号计数器字段为32 位宽,为所处理的数据包提供一个唯一的编号用来抗重放。序列号溢出字段为1 位宽,当该位为‘1’时,表示需要对序列号字段进行溢出检查;为‘0’表示不需进行溢出检查。密钥字段128 位,存放3DES 算法的密钥。SA 生存期字段16 位宽, 值为预先约定的该SA 所处理的数据包的个数,每处理一包该值减一,为0 时该SA 过期, 重新协商。综上所述,输出包处理的SAD1 每个表项宽度应在209 位。
对于输入包处理的SAD2,每个条目包括SPI 字段,抗重放窗口字段,密钥字段和SA 生存期字段。抗重放窗口字段32 位宽, 用来存放该SA 所接收到的验证有效的最大序列号, 接收到的包的序列号如果小于该值将被丢弃。其它字段的设置与输出包处理单元对应字段相同,不再重复。综上所述,输入包处理的SAD 每个表项宽度为208 位。
需要说明的是,以上设置是根据本安全模块实际设计的需要设置的,在IPSec 协议中建议的一些选项在本设计中省略了。例如,SPD 中的SPI 选项被省略,因为本设计中SPD 和SAD 是同时查找的,故可以将SPD 中的SPI 项省略。另外本安全模块默认使用隧道模式,密码算法为3DES,不进行认证,故SAD 中的相关选项被省略。
在设计中,SPD1 和SPD2 所用CAM 都设置为128KX144bit 模式,数据存储格式如图4-1 所示。SAD1 和SAD2 均由SRAM 组成,其存储空间为256KX36bit,这样SAD1 和SAD2 中一条SA 条目需要占用6 个存储单元。数据存储格式如图4-2 所示。
5 创新点
总结本文的创新点在于提出并实现了一种用硬件IDT75K62100 芯片实现快速的SPD 与SAD 数据库的思想。目前的SPD 和SAD 往往用软件的方式来实现,但这极大地限制了IPSEC 处理数据流的速度,本文提出的这种思想,经过实现与测试,对提高IPSEC 保护节点提高数据流的处理速度有很大的帮助。