IKE 共定义了 5 种交换。阶段 1 有两种模式的交换:对身份进行保护的“主模式”交换以 及根据基本 ISAKMP 文档制订的“野蛮模式”交换。阶段 2 交换使用“快速模式”交换。IKE 自己定义了两种交换:1 为通信各方间协商一个新的 Diffie?Hellman 组类型的“新组模式” 交换;2 在 IKE 通信双方间传送错误及状态消息的 ISAKMP 信息交换。 1.主模式交换 . 主模式交换提供了身份保护机制,经过三个步骤,共交换了六条消息。三个步骤分别是 策略协商交换、Diffie?Hellman 共享值、nonce 交换以及身份验证交换(如图 2 所示) 。
2.野蛮模式交换 . 野蛮模式交换也分为三个步骤,但只交换三条消息:头两条消息协商策略,交换 Diffie?Hellman 公开值必需的辅助数据以及身份信息;第二条消息认证响应方;第三条消 息认证发起方,并为发起方提供在场的证据(如图 3 所示) 。
3.快速模式交换 . 快速模式交换通过三条消息建立 IPsec SA:头两条消息协商 IPsec SA 的各项参数值, 并生成 IPsec 使用的密钥;第二条消息还为响应方提供在场的证据;第三条消息为发起方提 供在场的证据(如图 4 所示) 。
4.新组模式交换 . 通信双方通过新组模式交换协商新的 Diffie Hellman 组。新组模式交换属于一种请求/ 响应交换。发送方发送提议的组的标识符及其特征,如果响应方能够接收提议,就用完全一 样的消息应答(如图 5 所示) 。
5.ISAKMP 信息交换 . 参与 IKE 通信的双方均能向对方发送错误及状态提示消息。这实际上并非真正意义上 的交换,而只是发送单独一条消息,不需要确认(如图 6 所示) 。
三、IKE 的安全 1.机密性保护 . IKE 使用 Diffie?Hellman 组中的加密算法。IKE 共定义了五个 Diffie?Hellman 组,其 中三个组使用乘幂算法(模数位数分别是 768、1024、1680 位) ,另两个组使用椭圆曲线算 法(字段长度分别是 155、185 位) 。因此,IKE 的加密算法强度高,密钥长度大。 2.完整性保护及身份验证 . 在阶段 1、2 交换中,IKE 通过交换验证载荷(包含散列值或数字签名)保护交换消息 的完整性,并提供对数据源的身份验证。IKE 列举了四种验证方法:1 预共享密钥;2 数字 签名;3 公钥加密;4 改进的公钥加密。 3.抵抗拒绝服务攻击 . 对任何交换来说,第一步都是 cookie 交换。每个通信实体都生成自己的 cookie,cookie 提供了一定程度的抗拒绝服务攻击的能力。 如果在进行一次密钥交换,直到完成 cookie 交换,才进行密集型的运算,比如 Diffie?Hellman 交换所需的乘幂运算,则可以有效地抵抗某些拒绝服务攻击,如简单使用 伪造 IP 源地址进行的溢出攻击。 4.防止中间人攻击 . 中间人攻击包括窃听、插入、删除、修改消息,反射消息回到发送者,重放旧消息以及 重定向消息。ISAKMP 的特征能阻止这些攻击。 5.完美向前保密 . 完美向前保密(PFS) ,指即使攻击者破解了一个密钥,也只能还原这个密钥加密的数 据,而不能还原其他的加密数据。要达到理想的 PFS,一个密钥只能用于一种用途,生成一 个密钥的素材也不能用来生成其他的密钥。我们把采用短暂的一次性密钥的系统称为 “PFS”。 如果要求对身份的保护也是 PFS,则一个 IKE SA 只能创建一个 IPsec SA。
四、IKE 的实现 IKE 是一个用户级的进程。启动后,作为后台守护进程运行。在需要使用 IKE 服务前, 它一直处于不活动状态。可以通过两种方式请求 IKE 服务:1 当内核的安全策略模块要求建 立 SA 时,内核触发 IKE。2 当远程 IKE 实体需要协商 SA 时,可触发 IKE。 1.IKE 与内核的接口 . 内核为了进行安全通信,需要通过 IKE 建立或更新 SA。IKE 同内核间的接口有: 1、同 SPD 通信的双向接口。当 IKE 得到 SPD 的策略信息后,把它提交给远程 IKE 对 等实体; IKE 收到远程 IKE 对等实体的提议后, 当 为进行本地策略校验, 必须把它交给 SPD。 2、同 SAD 通信的双向接口。IKE 负责动态填充 SAD,要向 SAD 发送消息(SPI 请求 和 SA 实例) ,也要接收从 SAD 返回的消息(SPI 应答) 。 2.IKE 对等实体间接口 . IKE 为请求创建 SA 的远程 IKE 对等实体提供了一个接口。 当节点需要安全通信时, IKE 与另一个 IKE 对等实体通信,协商建立 IPsec SA。如果已经创建了 IKE SA,就可以直接通 过阶段 2 交换,创建新的 IPsec SA;如果还没有创建 IKE SA,就要通过阶段 1、2 交换创建 新的 IKE SA 及 IPsec SA。 一、总体设计 IPsec 规定的组件包括安全协议验证头(AH)和封装安全载荷(ESP) 、安全策略数据 库(SPD)和安全关联数据库(SAD) 、IKE 密钥交换及加密和验证算法。 1.总体结构 如图 1 所示,IPsec 实现的总体结构分为 IPsec 协议引擎、策略管理、IKE 密钥交换及密 码变换 4 个模块。其中 IPsec 安全协议的处理是数据流程的核心,策略管理模块为其直接提 供所需参数,IKE 密钥交换用于自动管理 SAD,而密码算法是达到安全的基本工具。 2.功能分配 策略管理:位于内核中,管理 SPD 和 SAD,对数据包(要进行 IPsec 处理的数据报或 数据包的统称)的安全保障起决定作用。功能包括 SPD 和 SAD 的管理 (记录的增加、 删除、 修改、刷新和查询) 、同 IPsec 协议引擎的接口和同 IKE 的接口。 IPsec 协议引擎:位于内核中,实现安全协议 AH 和 ESP。功能包括外出数据包的处理、 进入数据包的处理、同 IP 层和 TCP 层的接口。 IKE 密钥交换: 一个用户级进程, 用于动态管理 SAD。 功能包括 IKE 间的交互、 SAD 同 和 SPD 的接口。 密码算法:至少应实现 AES、DES、3DES、HMAC-MD5、HMAC-SHA1。 二、 实现策略管理模块和协议引擎 1.策略管理模块 (1)SPD 和 SAD 在内存中的组织和管理 IPsec 系统所使用的策略库一般保存在一个策略服务器中。该服务器为域中的所有节点 (主机和路由器)维护策略库。各节点可将策略库拷贝到本地,也可使用轻型目录访问协议 (LDAP)动态获取。从名义上说,一个 IPsec 系统中 SPD 分为进入 SPD 和外出 SPD,均处 于内核中。系统初始化时,将策略库中的每一条记录分别装入进入 SPD 和外出 SPD 中。为 了确保 SPD 的有效性和安全性,应定期进行更新和刷新。 SAD 的每一条记录对应一个 SA。 经 IKE 协商得到, SA 并以有序散列链表的形式组织。 从名义上说, SAD 也分为进入 SAD 和外出 SAD, 分别与进入散列链表和外出散列链表相对 应。进入散列链表用 SA 中的 IPsec 源地址计算散列值,外出散列链表用 SA 中的 IPsec 目的 地址计算散列值。 SA 的维护视 SA 的建立方式而定。如采用自动方式协商 SA,则根据 SA 生存期的状态 和序号计数器的溢出标志来决定 SA 的有效性。生存期分为软生存期和硬生存期。软生存期 状态决定发送方是否可用 SA 发送数据包,硬生存期状态决定接收方是否可用 SA 来处理收 到的数据包。当一个 SA 的软生存期期满时,发送方不能继续用其来发送数据包,此时,可 以启动或触发 IKE 再协商一个。使用软、硬生存机制可保证通信的持续性。 如采用手工方式建立 SA,则不存在生存期,仅根据序号计数器的溢出标志来决定 SA 的有效性。 如 SPD 或 SAD 过于庞大,则可将一部分置于用户空间。 (2)SPD 和 SAD 间的关系 对数据包进行 IPsec 处理时,要查询 SPD 和 SAD。为了提高速度,SPD 的每一条记录 都应有指向 SAD 中相应记录的指针,反之亦然。对于外出处理,先查询 SPD,获得指向 SA 的指针, 再在 SAD 查询进行处理所需参数。 SA 未建立, 如 则应使用 IKE 协商, 并建立 SPD 和 SAD 间的指针。对于进入处理,先查询 SAD,对 IPsec 包进行还原,取出指向 SPD 的指 针,然后验证该包应用的策略与 SPD 中规定的是否相符。 2.IPsec 协议引擎 (1)外出处理 对于外出数据包,不论是本机产生的还是转发的,IPsec 协议引擎要先调用策略管理模 块,查询 SPD,确定为数据包应使用的安全策略。根据策略管理模块的指示,协议引擎对 该数据包作出 3 种可能的处理(如图 2 所示) :
丢弃——丢弃数据包,并记录出错信息。 绕过——给数据包添加 IP 头,然后发送。 应用 Ipsec——调用策略管理模块,查询 SAD,确定是否存在有效的 SA。1 存在有效的 SA,则取出相应的参数,将数据包封装(包括加密、验证,添加 IPsec 头和 IP 头等) ,然后 发送。2 尚未建立 SA,策略管理模块启动或触发 IKE 协商,协商成功后按 1 中的步骤处理, 不成功则应将数据包丢弃,并记录出错信息。3 存在 SA 但无效,策略管理模块将此信息向 IKE 通告,请求协商新的 SA,协商成功后按 1 中的步骤处理,不成功则应将数据包丢弃, 并记录出错信息。
(2)进入处理 对于进入数据包,IPsec 协议引擎先调用策略管理模块,查询 SAD。如得到有效的 SA, 则对数据包进行解封(还原) ,再查询 SPD,验证为该数据包提供的安全保护是否与策略配 置的相符。如相符,则将还原后的数据包交给 TCP 层或转发。如不相符,或要求应用 IPsec 但未建立 SA,或 SA 无效,则将数据包丢弃,并记录出错信息。 三、分片和 ICMP 问题 1.解决分片和 PMTU 问题的建议 . 外出的 IP 包长度如果超过网络接口的最大传输单元(MTU) ,则要进行分片处理。由 于实施 IPsec 时,要增加一个或多个 IPsec 头,因此不能直接使用 Linux 中的 PMTU(Path Maximum Transfer Unit)查找。以下分主机实施和路由器实施 2 种情况来讨论分片和 PMTU 问题。 主机实施 IPsec 时,可在传输层或 IP 层查找 PMTU。由于主机不维护源路由,因此应 在传输层维护端到端的 PMTU 信息。 计算和确定 IP 包的长度时, 要考虑 IPsec 的模式及 AH 头和 ESP 头的长度。 对于路由器转发的数据包,如不允许分片,且长度超过了转发该数据包接口的 MTU, 路由器就应向始发主机发送一条控制消息协议(ICMP)不可到达消息。为有效利用网络带宽,应允许路由器决定是否可对数据包进行分片。 2.解决 ICMP 问题的建议 . ICMP 用于 Internet 差错处理和报文控制。 ICMP 消息分为错误消息和查询消息。 以端到 端的方式使用 IPsec 时,不会影响 ICMP,而以隧道模式来使用 IPsec,则会影响 ICMP 错误 消息的处理。这是因为 ICMP 错误消息只能发送数据包的外部 IP 头及其后的 64 比特数据, 内部 IP 头的源地址不会在 ICMP 错误消息中出现,路由器不能正确地转发该消息。 因此,应对路由器生成的 ICMP 错误消息进行特殊处理, 特别是当路由器通过隧道传输 其他路由器生成的 ICMP 错误消息时,可以为隧道两端的路由器建立一个隧道模式 SA,用 于发送 ICMP 错误消息。同时,路由器应不对 ICMP 错误消息的源地址进行检查。 四、结束语 将 IPsec 集成到 Linux 内核中,涉及修改 TCP 层和 IP 层的部分源代码,比作为线缆中 的块实施要复杂得多。 但这样做有利于保证 IPsec 的互操作性和配置上的灵活性与可伸缩性, 同时有利于软件的复用性。
因篇幅问题不能全部显示,请点此查看更多更全内容