网络安全课程笔记七:IPsec

Network Security Lecture 7: IPSEC

7.1 信息验证

7.1.1 为什么需要信息验证

因为 Internet 上可能存在各种各样的攻击:

  • 假冒源地址攻击:将一个虚假源 IP 地址的数据包送入网络
  • 非法修改内容(Content):未经授权插入、删除、置换数据包的内容
  • 非法修改顺序(Sequence):未经授权修改数据包序列,如插入新数据包、删除某数据包、重排顺序等
  • 非法修改时序(Timing):延迟转发数据包,或者进行重放(replay)攻击

因此为了完成信息验证,我们要保证信息完整性,并进行认证

7.1.2 进行信息验证的方法

如何保证信息完整性,并进行认证?有以下几种常用的方法:

  • 基于信息加密的方法
  • 数字签名
  • 报文鉴别码 MAC(Message Authentication Code)

7.1.2.1 基于信息加密的方法

假设 A 即将发送一段信息给 B。

如果 A 仅仅对信息使用 B 的公钥加密,这种方法并不能提供认证(Authentication),因为任何人都可以使用 B 的公钥加密信息。

如果 A 仅仅对信息使用 A 的私钥加密,这种方法并不能保证机密性(Confidentiality),因为任何人都可以用 A 的公钥解密信息从而看到信息原文。

因此 A 需要先将消息用 A 的私钥加密,再用 B 的公钥加密。

这样既可以保证机密性,又可以保证完整性、并提供认证。看起来是一种完美的做法,但是这种方法,对于长信息来说开销太大了。

7.1.2.2 数字签名

有一种更高级的方法,即数字签名。这在第六章已有介绍。

上述的做法实际就是数字签名的基本原理,不过其代价过于昂贵。更有效的方法是将散列函数引入数字签名。

由于一个散列函数对于任意长度的报文都可以生成一段固定长度的摘要,对这段长度较短的摘要进行签名会使得计算耗费大为降低。

数字签名标准:https://en.wikipedia.org/wiki/Digital_Signature_Standard

数字签名算法:https://en.wikipedia.org/wiki/Digital_Signature_Algorithm

7.1.2.3 Message Authentication Code

有没有一种不需要加密解密的方法呢?

  1. A 和 B 预先商量好一个共享密钥 $K$(称为鉴别密钥,Authentication Key)
  2. A 生成报文 $m$,计算散列 $H(K, m)$,这里的 $H(K, m)$ 就被称为报文鉴别码
  3. 随后 A 将该鉴别码附加到报文 $m$ 上发送给 B
  4. B 收到之后只需要用预共享的密钥 $K$ 计算前部报文的散列,和附加的鉴别码进行比对即可。

一个报文鉴别码(Message Authentication Code,MAC)函数类似于加密,但是 MAC 的计算并不一定要是可逆的(reversible),另外一个优点是 MAC 不要求一种加密算法,因此其实现起来效率更高。

不过需要注意的是,这个过程需要 A 和 B 预先商量好一个共享密钥。共享密钥的分发是个问题,另外如果 A 和其他实体(比如 C,D,E 等)预先商量的密钥等同于 A 和 B 之间的密钥,那么 A 将无法确定一个报文是否真的来自于 B,还是 C、D、E。这种情况下,MAC 只能提供报文完整性保护,不能提供认证服务。

目前网络中最为流行的标准是 HMAC,它能与 MD5 或 SHA-1 一起使用:

$$
HMAC(K, m) = H((K’ \oplus opad) | H((K’ \oplus ipad)|m))
$$

维基百科:https://en.wikipedia.org/wiki/HMAC

7.2 IP Security

为什么需要 IP 层安全协议:

  • 认证:确保收到的信息确实来自该源 IP
  • 信息完整性:确保信息在传输过程中没有被非法修改
  • 信息机密性:确保信息在传输过程中没有被第三方窃听
  • 密钥管理:提供密钥的安全交换服务

IPsec 的优点:

  • 当 IPsec 在防火墙或者路由器中实现时,所有通过其的数据包都可以进行 IPsec 加密,提供了很强的安全性
  • IPsec 在传输层之下,对应用程序、终端用户来说是透明的
  • IPsec 可以为个人用户提供安全服务

7.2.1 IPSec 模式

IPsec 有两种运行模式:

  • 传输模式:在此模式下,IPsec 给上层的协议(即 IP 数据包的载荷,如 TCP,UDP 等)提供安全服务。
  • 隧道模式:在此模式下,IPsec 给整个 IP 数据包提供安全服务。

7.2.2 Security Association

IPsec 数据报在网络实体对之间发送,网络实体既可以是主机也可以是路由器。

在源实体向目的实体发送 IPsec 数据报之前,它们之间会建立一条网络层的逻辑连接,称为安全关联(Security Association,SA)。一个 SA 是一个单工逻辑连接,如果两个实体要互相发送 IPsec 数据报,那么就需要建立两个 SA。

一个 SA 由三个参数唯一确定:

  • 安全参数索引(Security Parameter Index,SPI):它被包含在 AH/ESP 头部(下面会有介绍),让另一端能选择对应的 SA 来处理这个包
  • 目标 IP 地址
  • 安全协议标识符(Security Protocol Identifier):它表示这个 SA 基于 AH 还是 ESP

一个 IPsec 实体往往会维护很多 SA 的状态信息,因此 IPsec 实体在其安全关联数据库(Security Association Database,SAD)中存储了所有 SA 的状态信息。

另外,IPsec 实体也维护了另一个称为安全策略数据库(Security Policy Database,SPD)的数据结构,它指示了哪些数据包应该经过 IPsec 处理,哪些则不需要。

7.2.2.1 出站报文处理流程

  1. IPsec 实体收到了一个外向 IP 包(例如来自 TCP/UDP)
  2. 查询安全策略数据库(SPD),若无匹配发现,丢弃该包
  3. 根据匹配发现的结果,决定策略:
    • 通过:直接通过 IP 传输报文,处理结束
    • 保护:继续第 4 步
  4. 查询安全关联数据库(SAD),若无匹配发现,则进行网络密钥交换,继续第 4 步
  5. 根据匹配发现的结果(使用 AH 还是 ESP 等),进行 IPsec 加密处理

7.2.2.2 入站报文处理流程

  1. IPsec 实体收到了一个来自 Internet 的 IP 包
  2. 根据其包头定义的报文类型:
    • IP:查询安全策略数据库(SPD),若通过则将报文送给高层协议,否则丢弃
    • IPsec:查询安全关联数据库(SAD),若有匹配发现则进行 IPsec 解密处理并送给高层协议,否则丢弃

7.2.3 Authentication Header

鉴别头部(Authentication Header,AH)协议,可以提供源鉴别、数据完整性和重放攻击保护服务,但不能保证机密性。AH 是一种 IP 协议,其协议号为 51。

方法:对 IP 头的部分字段IP 包的全部载荷计算其 MAC,并称其为完整性校验值(Integrity Check Value,ICV)

为什么 AH 不对整个 IP 头进行验证?因为有些字段是可以改变的,比如 TTL。

AH Header 包括:

  • Next Header: 指上层协议的类型,比如 TCP 是 6。
  • Payload Lnegth: 载荷长度
  • SPI 和序列号
  • 完整性校验值(Integrity Check Value,ICV)

7.2.3.1 在传输模式的应用

| IP | AH Header | Data |

7.2.3.2 在隧道模式的应用

| IP | AH Header | IP | Data |

7.2.4 Encapsulating Security Payload

封装安全性载荷(Encapsulation Security Payload,ESP)协议,可以提供源鉴别、数据完整性和机密性服务。

ESP 数据包分为四部分:

  • ESP Header: 包含了 SPI 和序列号
  • ESP Payload: IV(可选)和载荷
  • ESP Trailer: 填充、填充长度和下一个首部
    • 填充:使其加上初始数据报(连同填充长度和下一个首部字段)形成的报文是块的整数倍
    • 填充长度:指示填充的长度是多少
    • 下一个首部:指示载荷字段中数据的类型(TCP/UDP等)
  • ESP MAC: 完整性校验值(Integrity Check Value,ICV)

7.2.4.1 在传输模式的应用

此时 ESP Payload 对应了原 IP 数据包中的 Data:

| IP | ESP Header | Data | ESP Trailer | ESP MAC |

7.2.4.2 在隧道模式的应用

此时 ESP Payload 对应了整个原 IP 数据包:

| IP | ESP Header | IP | Data | ESP Trailer | ESP MAC |

7.2.5 Anti-replay

AH 和 ESP 包头的序列号(Sequence Number)字段即被用来防御重放攻击。

当一个 SA 新建立时,发送方将序列号计数器初始化为 0。每发送一个包,则计数器 +1。

这里要注意的是,发送方一定不能让序列号循环溢出 $2^{32}-1$ 后重归为 0,循环使用一个序列号会给重放攻击提供机会。因此,若 $2^{32}-1$ 极限值已达到,发送方必须终止这个 SA,并建立一个有新密钥的新 SA。