摘 要 介绍了IPSec的相关协议和原理,阐明了安全策略系统的体系结构以及安全策略和安全联盟的定义和表示方法。最后,介绍了IPSec数据流的处理流程。
关键词 IPSec 安全策略 安全联盟

1 IPSec协议简介
  针对Internet的安全需要,Internet工程任务组(IETF)颁布了IP层安全标准IPSec。IPSec在IP层对数据包进行高强度的安全处理,提供包括访问控制、无连接的完整性、数据源认证、抗重播(replay)保护(序列完整性(sequence integrity)的一个组成部分)、保密性和有限传输流保密性在内的服务。这些服务是基于IP层的,提供对IP及其上层协议的保护。
2 IPSec体系协议
  如图1,IPSec安全体系结构包括以下几个方面:
3.gif
  
图1  IPSec安全体系结构
IP安全结构(SA):RFC2401,涉及IP安全技术的一般概念、安全目标、安全服务、构成元素和关键机制等方面,是整个协议栈的基础和指导。
  IP认证报头(AH):RFC2402,提供数据源身份认证、数据完整性和重放***保护几项功能。
  IP封装安全负载 (ESP,Encapsulating Security Payload):RFC2406,提供数据保密、数据源身份认证、数据完整性和重放***保护几项功能,和AH协议一起构成协议栈的主体。
  因特网安全联盟和密钥管理协议(ISAKMP):RFC2408和因特网密钥交换(IKE)-RFC2409,描述密钥的产生、协商和交换的标准过程。
  加密和验证算法:RFC2403,RFC2404,RFC2405和RFC2410,描述用于AH和ESP协议中的各种加密和鉴别算法,对安全协议的实现提供具体的算法描述。
  IP安全DOI(Domain of Interpretation)文档:RFC2407,为其他文档提供标准代码。
  PF_KEY密钥管理API:RFC2367,提供IKE模块和IPSec核心之间的接口。
3 总体介绍
  IPSec使用两个协议来提供传输安全——认证报头(AH)、封装安全负载(ESP)。IPSec实现是通过在原始IP数据包中添加插入AH或ESP头,达到IP数据加密和认证的目的。
  IPSec协议族在因特网中所处的位置可以认为和IP层平行,在具体的数据包外出处理中,一般都是在原始IP包添加插入IPSec报头(AH&ESP)。故可确切的认为IPSec层处于IP层和数据链路层之间,更偏向IP层。
  IPSec安全体系既可用来保护一个完整的IP包,也可以保护某个IP包的上层协议。这两种保护分别是由IPSec两种不同的“模式”来提供。其中,传输模式(transport)用于两台主机之间,保护上层协议,在IP头和上层协议头之间插入IPSec头,如:〔IP头〕 〔IPSec头〕〔上层协议〕;隧道模式(tunnel)保护整个IP包,只要安全联盟的任意一端是安全网关,就必须使用隧道模式。在其外部添加IPSec头,加密验证原IP包,然后用外部IP头封装整个处理过的数据包。如:〔外部IP头〕〔IPSec头〕〔内部IP头〕〔上层协议〕。
  另外,SA中如果应用不同的安全协议,所受保护数据包的内容范围也有所不同。对于ESP,传输模式SA提供的安全服务只保护上层协议,而对IP头和扩展头不提供保护。隧道模式SA对外部头并不提供保护;而对于AH,传输模式SA提供的安全服务还可以对IP头、扩展头和某些选项的部分内容进行保护。隧道模式SA可以对其外部头的一部分提供保护。
  在IPSec中&#xff0c;安全联盟(SA)就是两个IPSec系统之间的一个单向逻辑连接&#xff0c;是安全策略的具体化和实例化&#xff0c;它提供了保护通信的具体细节。通常用一个三元组唯一的表示&#xff1a;<安全参数索引(SPI)&#xff0c;IP目的地址&#xff0c;安全协议(AH和ESP)标识符>。
  SA规定了用于保密通信的一组安全参数&#xff0c;包括&#xff1a;验证算法、加密算法、协议模式、安全联盟的源地址、SA的生存期(TTL)和序列号计数器等。
  通过使用AH或ESP之一&#xff0c;SA为它所承载的数据通信提供安全服务。IPSec的实现需维护两个与SA有关的数据库&#xff0c;安全策略数据库SPD和安全联盟数据库SAD。安全策略数据库是为IPSec实现提供安全策略配置&#xff0c;包括源、目的IP地址、掩码、端口&#xff0c;传输层协议&#xff0c;动作(丢弃、绕过、应用)&#xff0c;进出标志&#xff0c;标识符&#xff0c;SA和策略指针。SAD是SA的集合&#xff0c;其内容(RFC要求的必须项)包括目的IP地址、安全协议&#xff0c;SPI&#xff0c;序列号计数器&#xff0c;序列号溢出标志、抗重播窗口、SA的生命期、进出标志&#xff0c;SA状态&#xff0c;IPSec协议模式(传输或隧道)、加密算法和验证算法相关项目。
3.1 SPD
  对于一个IPSec实施点&#xff0c;进入包和外出包都需要参考安全策略数据库&#xff08;SPD&#xff09;。对于进入或外出的每一份数据包&#xff0c;都有三种可能的选择&#xff1a;丢弃、绕过IPSec或应用IPSec。丢弃是指根本不允许离开主机、穿过安全网关&#xff0c;或最终传递到某一应用程序。绕过是指允许通过而不用额外IPSec保护的传输。应用是指需要IPSec保护的传输并且对于这样的传输SPD必须规定提供的安全服务&#xff0c;所使用的协议、算法等等。
  SPD包括策略入口的有序列表。每一个策略入口由一个或多个选择符标识&#xff0c;这些选择符定义了被这一策略入口包含的IP传输。这些选择符定义了策略或IPSec处理的粒度。每一个入口包括一个标识&#xff0c;它标识匹配这一策略的传输是允许通过&#xff0c;丢弃&#xff0c;还是进行IPSec处理。如果运用IPSec处理&#xff0c;入口应包括SA(或SA束)的规范。该规范列举了IPSec协议、模式和使用的算法&#xff0c;包括了任何嵌套需求。
  对于每一个IPSec实现&#xff0c;必须由一个可供管理的接口。它允许用户或系统管理员管理SPD。特别的&#xff0c;每一个输入或输出包受制于IPSec的处理&#xff0c;SPD必须定义在每一种情况下什么行为将被接受。因此可供管理的接口必须允许用户&#xff08;或系统管理者&#xff09;定义安全处理&#xff0c;这一安全处理被运用于任何进出系统的包。
3.2 选择符
  SA的粒度取决于选择符。例如&#xff0c;两主机之间所有的传输可以通过单一SA来传输&#xff0c;并且给予一个统一的安全服务集。另外&#xff0c;一对主机间的传输可以通过多重SAs&#xff0c;而不同的SAs提供不同的安全服务&#xff0c;这有赖于使用的应用程序(正如下一代协议和端口域中定义)。
3.3 SAD
  SAD中的记录项定义了与SA相关的参数。每个SA都应在SAD中有一条记录项相对应。对于进入处理&#xff0c;SAD的记录用三元组<目的IP地址&#xff0c;SPI&#xff0c;安全协议>标识。对于外出处理&#xff0c;应在SPD中查找指向SAD中SA的指针&#xff0c;从而查找对应的SA或SA束。如果未建立SA&#xff0c;则应建立SA&#xff0c;并将SPD中的项与SAD的记录项关联起来。
3.4 AH和ESP的处理过程
  AH处理&#xff1a;AH报头格式和内容见RFC2402。设有两台配置IPSec的主机或网关、处理IPSec数据包的发送和接收。在发送方&#xff0c;进程根据SPD和SAD选择恰当的协议模式和验证算法。然后将AH头插入到IP包中&#xff0c;将数据包中的不定字段清零&#xff0c;用验证算法和密钥摘要验证(缺省为HMAc_MD5_96)整个封装后的数据包、将摘要数据送到AH头的验证数据字段。最后&#xff0c;IPSec层将数据包转发到数据链路层。最终将安全数据包发送到接收方。在接收方&#xff0c;进程配置有相应的SPD和SAD。接收到发送方发来的安全数据包后&#xff0c;可选进行序列号检查和抗重播检查。然后&#xff0c;同样对数据包的不定字段清零&#xff0c;保存验证数据字段内容并清零之。对整个数据包运用验证算法和密钥处理&#xff0c;将验证结果和保存的验证数据比较&#xff0c;匹配则验证成功。然后&#xff0c;剥去AH头和外部IP头(隧道模式)。最后&#xff0c;再进行策略检查。AH处理只负责对数据的完整性检查&#xff0c;而不实现数据的加密。还要注意PMTU的问题&#xff0c;一般来说&#xff0c;尽量防止对数据包的分段&#xff0c;我们综合考虑嵌套模式中所能添加的AH头和ESP头尾的最大字节数&#xff0c;保证传送到IPSec层的原始IP包比相应MTU少于AH头和ESP头尾的最大字节数&#xff0c;这样就不会导致在IPSec层的分段处理&#xff0c;减少IPSec的功能和负担。
  ESP处理&#xff1a;ESP报头和报尾的格式和内容见RFC2406。ESP处理和AH处理类似。ESP处理完成AH处理的全部功能&#xff0c;并提供数据加密功能。对于输出数据包处理&#xff0c;首先根据SPD和SAD进行加密处理(缺省加密算法为3DES&#xff0c;加密密钥IKE协商生成或人工协商)。对传输模式&#xff0c;加密项包括上层协议头(如TCP头)&#xff0c;数据内容和ESP尾。对隧道模式&#xff0c;加密项还要包括内部IP头(IP-in-IP)。然后&#xff0c;才是数据包的验证。必须注意的是&#xff0c;验证项不包括ESP头外面的IP头。ESP外出数据包处理的最后一步是重新计算位于ESP前面的IP头的校验和。其他处理同AH处理。对于输入数据包处理&#xff0c;处理流程基本同AH。要注意的是&#xff0c;必须先验证后解密。算法和密钥由通信双方协商的SA确定。策略检查完之后&#xff0c;还要重新计算IP校验和。
3.5 IPSec数据流处理
  数据流输入处理&#xff1a;
  1)模块接收一个IP包&#xff1b;
  2)如果IP包下一下协议proto&#61;UDP&&port&#61;500&#xff0c;绕过不处理&#xff0c;传给上层协议&#xff1b;
  3)判断下一个协议proto是否AH或ESP&#xff0c;如果不是&#xff0c;根据其地址查SPD&#xff0c;如果有对应策略则丢弃该包否则绕过&#xff1b;(IPSec只负责IPSec包的处理)
  4)查三元组&#xff0c;得said指针&#xff1b;
  5)根据said查询SAD
  if SA为空
  〔查询策略&#xff1b;(根据selector&#xff0c;查找相应的SPD&#xff0c;取SPD中的action)
  if统过 不处理&#xff1b;
  if丢弃 丢包&#xff1b;
  if应用 丢包&#xff1b;
  if无策略 不处理〕
  if SA期满 丢包&#xff1b;
  if SA状态异常 丢包&#xff1b;
  6)检查序列号seq&#xff0c;抗重播捡查&#xff1b;
  7)根据下一个协议为AH或ESP&#xff0c;分别送交AH/ESP处理模块进行验证解密&#xff0c;并剥去AH头或ESP头和尾&#xff1b;
  8)从策略(或SA)中获知是采用传输模式&#xff0c;还是隧道模式&#xff1b;
  9)If tunnel mode&#xff0c;移走外部IP头&#xff1b;
  10)对这个处理后的新的IP包进行策略检查(如果没有策略则宣告失效)&#xff1b;
  11)检查新的内部IP头的“nextproto”字段&#xff0c;如果不是IPSec头&#xff0c;处理结束、返回。
  12)如果IP头的目的地址不是自己&#xff0c;则转发。
  13)如果仍为IPSec包&#xff0c;转4)。
  数据流输出处理&#xff1a;
  1)模块取出一个IP包&#xff1b;
  2)根据selector查询策略数据库SPD&#xff0c;根据action判断是否应用或丢弃&#xff0c;若没有SPD&#xff0c;则绕过&#xff1b;
  3)查询SPD对应的SA或SA束(真正的目的地址所有的)
  if 没有SA
  手工建立&#xff1b;或IKE动态建立&#xff1b;或绕过&#xff1b;
  if 有SA
  SA生命期、状态的判断&#xff1b;
  4)将策略&#xff0c;SA和原始IP包送给AH/ESP模块处理(负责根据传输模式和通道模式&#xff0c;插入AH头(ESP头和尾)和外部IP头(此时可将外部IP头源、目的地址设为和内部头一样))&#xff1b;
  5) if策略中有网关应用且到该网关有策略&#xff1b;
  6)根据策略查找相应的SA
  if 没有SA
  手工建立&#xff1b;或IKE动态建立&#xff1b;或绕过&#xff1b;
  if 有SA
  SA生命期、状态的判断&#xff1b;
  7)将策略&#xff0c;SA(束)和处理后的IPSec包送结AH/ESP模块处理。(此时IP头目的地址为网关)&#xff1b;
  8)IPSec处理完毕。
参考文献
1 S. Kent, R. Atkinson, "Security Architecture for the Internet Protocol",[url]http://www.ietf.org/rfc/rfc2401.txt[/url], 1998.11
2 S. Kent, R. Atkinson, "IP Authentication Header(AH)", [url]http://www.ietf.org/rfc/rfc2402.txt[/url], 1998.11
3 S. Kent, R. Atkinson, "IP Encapsulating Security Payload(ESP)", [url]http://www.ietf.org/rfc/rfc2403.txt[/url], 1998.11
4 D. McDonald, C. Metz, B. Phan, "PF_KEY Key Management API, Version 2", [url]http://www.ietf.org/rfc/rfc2367.txt[/url], 1998.7